From b840a2ebadfd68d3fc9db950abcab4ea8f033ca4 Mon Sep 17 00:00:00 2001 From: Tapas Thakkar Date: Mon, 6 Apr 2026 18:06:43 +0530 Subject: [PATCH 1/5] 496613007 Add automated beta image tagging --- kubernetes/docker/edgemicro/betabuild.sh | 64 ++++++++++++++++++------ 1 file changed, 50 insertions(+), 14 deletions(-) diff --git a/kubernetes/docker/edgemicro/betabuild.sh b/kubernetes/docker/edgemicro/betabuild.sh index d2b46b3c..01496f29 100755 --- a/kubernetes/docker/edgemicro/betabuild.sh +++ b/kubernetes/docker/edgemicro/betabuild.sh @@ -4,31 +4,67 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" echo DIR is $DIR -if [ $# -lt 2 ]; then - echo "Please provide edgemicro version and GCP project id" - echo "Usage: $0 [github-repo]" - echo "Example: $0 for-3.3.9 apigee-microgateway apigee-internal/microgateway" +if [ $# -lt 1 ]; then + echo "Usage: $0 [semantic-version] [gcp-project-id] [github-repo]" + echo "Example: $0 for-3.3.9" + echo "Example: $0 feat-auth 3.3.9" exit 1 fi -version=$1 -project_id=$2 -repo=${3:-apigee-internal/microgateway} +branch=$1 +semver=$2 +project_id=${3:-apigee-microgateway} +repo=${4:-apigee-internal/microgateway} -#us-west1-docker.pkg.dev/apigee-microgateway/edgemicro-beta +if [ -z "$semver" ]; then + if [[ "$branch" =~ for-([0-9]+\.[0-9]+\.[0-9]+) ]]; then + semver="${BASH_REMATCH[1]}" + echo "Extracted version $semver from branch $branch" + else + echo "Error: Cannot extract version from branch '$branch'." + echo "Please provide the semantic version as the second argument." + exit 1 + fi +fi # Using '|' as the sed delimiter eliminates the need to escape slashes in the repo path -sed -i.bak "s| *edgemicro.*| ${repo}#$version|g" installnode.sh +sed -i.bak "s| *edgemicro.*| ${repo}#$branch|g" installnode.sh # Build with --platform linux/amd64 to ensure it runs correctly on general-purpose servers (x86_64) instead of ARM64 -docker build --platform linux/amd64 --no-cache -t edgemicro-beta:$version $DIR -f Dockerfile.beta +docker build --platform linux/amd64 --no-cache -t edgemicro-beta:$branch $DIR -f Dockerfile.beta + +# Query existing tags to find the next beta number +echo "Querying existing tags for public-image-$semver-beta.*" +existing_tags=$(gcloud artifacts tags list --repository=edgemicro-beta --location=us-west1 --package=emg --project="$project_id" 2>/dev/null | grep -o "public-image-$semver-beta\.[0-9]\+") + +max=0 +for tag in $existing_tags; do + if [[ "$tag" =~ public-image-$semver-beta\.([0-9]+) ]]; then + n="${BASH_REMATCH[1]}" + if (( n > max )); then + max=$n + fi + fi +done -docker tag edgemicro-beta:$version us-west1-docker.pkg.dev/$project_id/edgemicro-beta/emg:$version -docker tag edgemicro-beta:$version us-west1-docker.pkg.dev/$project_id/edgemicro-beta/emg:beta +new_n=$((max + 1)) +echo "Next beta number is $new_n" +new_tag="public-image-$semver-beta.$new_n" -docker push us-west1-docker.pkg.dev/$project_id/edgemicro-beta/emg:$version -docker push us-west1-docker.pkg.dev/$project_id/edgemicro-beta/emg:beta +# Tag and push the new image +docker tag edgemicro-beta:$branch us-west1-docker.pkg.dev/$project_id/edgemicro-beta/emg:$new_tag +docker push us-west1-docker.pkg.dev/$project_id/edgemicro-beta/emg:$new_tag +# Add deprecated tags to older images +for tag in $existing_tags; do + if [[ "$tag" =~ public-image-$semver-beta\.([0-9]+) ]]; then + n="${BASH_REMATCH[1]}" + dep_tag="deprecated-public-image-$semver-beta.$n" + + echo "Adding tag $dep_tag to existing tag $tag" + gcloud artifacts docker tags add "us-west1-docker.pkg.dev/$project_id/edgemicro-beta/emg:$tag" "us-west1-docker.pkg.dev/$project_id/edgemicro-beta/emg:$dep_tag" + fi +done rm installnode.sh mv installnode.sh.bak installnode.sh From 910c90a32cf1b5afaf6a1f5034a434bfa8268ffb Mon Sep 17 00:00:00 2001 From: Tapas Thakkar Date: Mon, 27 Apr 2026 16:25:59 +0000 Subject: [PATCH 2/5] 506125889 Update docker base image --- kubernetes/docker/edgemicro/Dockerfile | 2 +- kubernetes/docker/edgemicro/Dockerfile.beta | 2 +- kubernetes/docker/edgemicro/betabuild.sh | 29 +++++++++++++++++++-- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/kubernetes/docker/edgemicro/Dockerfile b/kubernetes/docker/edgemicro/Dockerfile index e3aa18db..1b7b9a36 100755 --- a/kubernetes/docker/edgemicro/Dockerfile +++ b/kubernetes/docker/edgemicro/Dockerfile @@ -1,4 +1,4 @@ -FROM node:24.14.1-bookworm-slim +FROM node:24.15.0-bookworm-slim # === SECURITY PATCH LAYER === # 1. Update OS packages to resolve Debian CVEs diff --git a/kubernetes/docker/edgemicro/Dockerfile.beta b/kubernetes/docker/edgemicro/Dockerfile.beta index c7f5894a..fcacf9e1 100755 --- a/kubernetes/docker/edgemicro/Dockerfile.beta +++ b/kubernetes/docker/edgemicro/Dockerfile.beta @@ -1,4 +1,4 @@ -FROM node:24.14.1-bookworm-slim +FROM node:24.15.0-bookworm-slim # === SECURITY PATCH LAYER === # 1. Update OS packages to resolve Debian CVEs diff --git a/kubernetes/docker/edgemicro/betabuild.sh b/kubernetes/docker/edgemicro/betabuild.sh index 01496f29..a551df51 100755 --- a/kubernetes/docker/edgemicro/betabuild.sh +++ b/kubernetes/docker/edgemicro/betabuild.sh @@ -16,8 +16,23 @@ semver=$2 project_id=${3:-apigee-microgateway} repo=${4:-apigee-internal/microgateway} +# Assert gcloud login and access to Artifact Registry +gcloud artifacts repositories describe edgemicro-beta --location=us-west1 --project="$project_id" &>/dev/null || { echo "Error: Cannot access Artifact Registry. Check gcloud login."; exit 1; } + +# Assert Docker is configured to use gcloud for this registry +if [ ! -f ~/.docker/config.json ] || ! grep -q "us-west1-docker.pkg.dev" ~/.docker/config.json; then + echo "Error: Docker is not configured for us-west1-docker.pkg.dev." + echo "Run: gcloud auth configure-docker us-west1-docker.pkg.dev" + exit 1 +fi + + + if [ -z "$semver" ]; then - if [[ "$branch" =~ for-([0-9]+\.[0-9]+\.[0-9]+) ]]; then + if [ "$branch" == "npm" ]; then + semver=$(npm view edgemicro version) + echo "Auto-fetched latest version $semver from NPM" + elif [[ "$branch" =~ for-([0-9]+\.[0-9]+\.[0-9]+) ]]; then semver="${BASH_REMATCH[1]}" echo "Extracted version $semver from branch $branch" else @@ -28,11 +43,21 @@ if [ -z "$semver" ]; then fi # Using '|' as the sed delimiter eliminates the need to escape slashes in the repo path -sed -i.bak "s| *edgemicro.*| ${repo}#$branch|g" installnode.sh +if [ "$branch" == "npm" ]; then + sed -i.bak "s| *edgemicro.*| edgemicro@$semver|g" installnode.sh +else + sed -i.bak "s| *edgemicro.*| ${repo}#$branch|g" installnode.sh +fi + +# Clear older image and build cache +echo "Clearing older image and cache..." +docker rmi edgemicro-beta:$branch 2>/dev/null || true +docker builder prune -f || true # Build with --platform linux/amd64 to ensure it runs correctly on general-purpose servers (x86_64) instead of ARM64 docker build --platform linux/amd64 --no-cache -t edgemicro-beta:$branch $DIR -f Dockerfile.beta + # Query existing tags to find the next beta number echo "Querying existing tags for public-image-$semver-beta.*" existing_tags=$(gcloud artifacts tags list --repository=edgemicro-beta --location=us-west1 --package=emg --project="$project_id" 2>/dev/null | grep -o "public-image-$semver-beta\.[0-9]\+") From bff6385f8821ba7576503a1f8827630a11d73084 Mon Sep 17 00:00:00 2001 From: Tapas Thakkar Date: Mon, 27 Apr 2026 16:25:59 +0000 Subject: [PATCH 3/5] 497801464 Add dependency security guidelines --- DEPENDENCY_SECURITY_GUIDELINES.md | 64 +++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 DEPENDENCY_SECURITY_GUIDELINES.md diff --git a/DEPENDENCY_SECURITY_GUIDELINES.md b/DEPENDENCY_SECURITY_GUIDELINES.md new file mode 100644 index 00000000..5d4cb23c --- /dev/null +++ b/DEPENDENCY_SECURITY_GUIDELINES.md @@ -0,0 +1,64 @@ +# Dependency Security and Vulnerability Management Guidelines + +This document outlines the procedures and principles for managing vulnerabilities and dependency updates in this repository. Given the complex and legacy nature of some dependencies in this project, these guidelines ensure that security fixes do not introduce breaking changes. + +These rules apply to all contributors, including human developers, automated dependency tools, and AI coding assistants. + +--- + +## Core Principles + +### 1. Factual Verification (No Assumptions) +* **Verify Usage:** Never assume a package is vulnerable or safe based solely on security audit reports (like `npm audit`). Reports flag version ranges, not actual usage. +* **Ground Truth:** Always inspect the source code in `node_modules` or the repository to verify if the vulnerable code path is actually reachable or executed in this application. +* **Exhaustive Search:** Check all execution paths when tracing usage, not just the first few results. + +### 2. Handle Missing Context Explicitly +* **Missing Dependencies:** If `node_modules` is not installed, do not infer behavior. Install dependencies to inspect the real code. +* **Dynamic Imports:** Be aware of dynamic path construction or unusual import patterns that might hide dependency usage. +* **Acknowledge Limits:** If usage cannot be factually verified, document the limitation clearly rather than guessing. + +--- + +## Vulnerability Fix Workflow + +When a vulnerability is identified, follow this prioritized, risk-averse approach: + +### 1. Standard Audit Fix +Attempt a standard `npm audit fix` first. This applies safe, non-breaking updates that respect the version constraints in `package.json`. + +### 2. Minor and Patch Updates +If the audit fix does not resolve the issue, consider a manual minor or patch update (e.g., `1.0.1` -> `1.0.2`). These are generally safe and unlikely to impact functionality. + +### 3. Major Version Updates (High Risk) +If a major version update is required: +* **Research**: Thoroughly research breaking changes introduced in the major version. +* **Scan**: Scan the codebase to identify all areas affected by the breaking changes. +* **Proactive Fixes**: Propose fixes for any code impacted by breaking changes. +* **Verification**: Execute the functional test suite against the local codebase to verify stability. + +### 4. Dependency Overrides +* Use the `overrides` field in `package.json` only as a last resort for sub-dependencies that cannot be resolved via parent package updates. +* **Warning**: This forces updates on sub-packages which can break nested dependencies. Thorough testing of the entire application is mandatory. + +--- + +## Internal Packages (`volos-*`, `microgateway-*`) + +Internal packages are managed by the team and often reside in sibling directories (e.g., `../microgateway-plugins` or inside `../volos/`) relative to the main project folder. + +When dealing with these packages: +1. **Check `node_modules` First:** Always check the codebase via the installed dependencies in `node_modules` first to understand exactly what version and code execution path the project is running. +2. **Holistic Fixes:** If a vulnerability stems from an internal package, do not take shortcuts like using overrides in the top-level `package.json` if it can be fixed at the source. Suggest applying the fix directly to the source codebase of the internal package. + +--- + +## Special Directives for AI Coding Assistants + +When an AI agent or Large Language Model (LLM)—acting as an expert Subject Matter Expert (SME) in Software Engineering and AI-Assisted Development—is processing this repository, it must adhere to the following behavioral mandates to ensure 100% accuracy and prevent common failure modes: + +* **Countering the 'Helpfulness' Trap:** LLMs often hallucinate plausible-sounding paths or names to appear helpful. You **must** resist this. Never use assumed or placeholder names for files, directories, or packages. If you reference a path, you must have factually verified its existence first. +* **No Guessing:** When faced with a gap in knowledge, an LLM's default behavior is to guess. You **must** override this. Stop, admit the gap, and run the necessary search or ask the user. +* **Human-in-the-Loop with Citation:** Never take a potentially breaking action based on a guess. When presenting options or asking for user guidance, always provide proper factual citations (file paths, line numbers, code snippets) so the user can verify your reasoning. +* **Empirical Behavior Verification (Dual-Version Execution)**: To achieve absolute certainty that an override or upgrade does not introduce regressions, you must employ an empirical approach. Create an isolated test harness to execute the specific code path using the exact import and usage patterns identified in the project. Where feasible, execute this harness against both the legacy and target versions of the dependency, comparing execution results to verify behavioral equivalence. This is the gold standard for factual verification. + From e4407c626c99c5ac1494dbe1a2137ebd49af0c1d Mon Sep 17 00:00:00 2001 From: Tapas Thakkar Date: Mon, 27 Apr 2026 16:26:00 +0000 Subject: [PATCH 4/5] 507031063 Resolve uuid vulnerability - GHSA-w5hq-g745-h8pq: Missing buffer bounds check --- kubernetes/docker/edgemicro/betabuild.sh | 9 +- kubernetes/docker/edgemicro/dockerbuild.sh | 2 +- kubernetes/docker/edgemicro/installnode.sh | 8 +- npm-shrinkwrap.json | 306 ++++++++++----------- package.json | 10 +- 5 files changed, 170 insertions(+), 165 deletions(-) diff --git a/kubernetes/docker/edgemicro/betabuild.sh b/kubernetes/docker/edgemicro/betabuild.sh index a551df51..8a6f2e54 100755 --- a/kubernetes/docker/edgemicro/betabuild.sh +++ b/kubernetes/docker/edgemicro/betabuild.sh @@ -44,9 +44,9 @@ fi # Using '|' as the sed delimiter eliminates the need to escape slashes in the repo path if [ "$branch" == "npm" ]; then - sed -i.bak "s| *edgemicro.*| edgemicro@$semver|g" installnode.sh + sed -i.bak "s|npm install.*-g edgemicro.*|npm install --omit=dev --omit=optional -g edgemicro@$semver|g" installnode.sh else - sed -i.bak "s| *edgemicro.*| ${repo}#$branch|g" installnode.sh + sed -i.bak "s|npm install.*-g edgemicro.*|npm install --omit=dev --omit=optional -g ${repo}#$branch|g" installnode.sh fi # Clear older image and build cache @@ -54,9 +54,7 @@ echo "Clearing older image and cache..." docker rmi edgemicro-beta:$branch 2>/dev/null || true docker builder prune -f || true -# Build with --platform linux/amd64 to ensure it runs correctly on general-purpose servers (x86_64) instead of ARM64 -docker build --platform linux/amd64 --no-cache -t edgemicro-beta:$branch $DIR -f Dockerfile.beta - +docker build --provenance=false --no-cache -t edgemicro-beta:$branch $DIR -f Dockerfile.beta # Query existing tags to find the next beta number echo "Querying existing tags for public-image-$semver-beta.*" @@ -90,6 +88,7 @@ for tag in $existing_tags; do gcloud artifacts docker tags add "us-west1-docker.pkg.dev/$project_id/edgemicro-beta/emg:$tag" "us-west1-docker.pkg.dev/$project_id/edgemicro-beta/emg:$dep_tag" fi done + rm installnode.sh mv installnode.sh.bak installnode.sh diff --git a/kubernetes/docker/edgemicro/dockerbuild.sh b/kubernetes/docker/edgemicro/dockerbuild.sh index 238dd827..9713d8d4 100755 --- a/kubernetes/docker/edgemicro/dockerbuild.sh +++ b/kubernetes/docker/edgemicro/dockerbuild.sh @@ -13,7 +13,7 @@ project_id=$2 if [ $# -eq 2 ]; then - sed -i.bak "s/ *edgemicro.*/ edgemicro@$version/g" installnode.sh + sed -i.bak "s|npm install.*-g edgemicro.*|npm install --omit=dev --omit=optional -g edgemicro@$version|g" installnode.sh docker build --no-cache -t edgemicro:$version $DIR docker tag edgemicro:$version gcr.io/$project_id/edgemicro:$version docker tag edgemicro:$version gcr.io/$project_id/edgemicro:latest diff --git a/kubernetes/docker/edgemicro/installnode.sh b/kubernetes/docker/edgemicro/installnode.sh index 1819a2a7..9edd7515 100644 --- a/kubernetes/docker/edgemicro/installnode.sh +++ b/kubernetes/docker/edgemicro/installnode.sh @@ -1,3 +1,9 @@ #!/bin/bash -set echo off +set -e + +# 1. Install globally (this line is targeted by betabuild.sh's sed replacement) npm install --omit=dev --omit=optional -g edgemicro + +# 2. Navigate to the globally installed package and run install to apply committed overrides +cd "$(npm root -g)/edgemicro" +npm install --omit=dev --omit=optional diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 71b38a46..93998348 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -36,7 +36,7 @@ "sanitizer": "^0.1.3", "tmp": "^0.2.5", "tunnel-agent": "^0.6.0", - "uuid": "^11.0.3", + "uuid": "^14.0.0", "volos-util-apigee": "^0.1.7", "xml2js": "^0.5.0" }, @@ -76,9 +76,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", "dev": true, "license": "MIT", "engines": { @@ -282,9 +282,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", "dev": true, "license": "MIT", "dependencies": { @@ -406,13 +406,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.23.3", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.3.tgz", - "integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==", + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^3.0.3", + "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" }, @@ -439,22 +439,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.3.tgz", - "integrity": "sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz", + "integrity": "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^1.1.1" + "@eslint/core": "^1.2.1" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz", - "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -561,9 +561,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz", - "integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -571,13 +571,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", - "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz", + "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^1.1.1", + "@eslint/core": "^1.2.1", "levn": "^0.4.1" }, "engines": { @@ -585,29 +585,43 @@ } }, "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -833,9 +847,9 @@ } }, "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", "dev": true, "license": "MIT", "engines": { @@ -1001,9 +1015,9 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.2.0.tgz", - "integrity": "sha512-+SM3gQi95RWZLlD+Npy/UC5mHftlXwnVJMRpMyiqjrF4yNnbvi/Ubh3x9sLw6gxWSuibOn00uiLu1CKozehWlQ==", + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.4.0.tgz", + "integrity": "sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -1011,9 +1025,9 @@ } }, "node_modules/@sinonjs/samsam": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-9.0.3.tgz", - "integrity": "sha512-ZgYY7Dc2RW+OUdnZ1DEHg00lhRt+9BjymPKHog4PRFzr1U3MbK57+djmscWyKxzO1qfunHqs4N45WWyKIFKpiQ==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-10.0.2.tgz", + "integrity": "sha512-8lVwD1Df1BmzoaOLhMcGGcz/Jyr5QY2KSB75/YK1QgKzoabTeLdIVyhXNZK9ojfSKSdirbXqdbsXXqP9/Ve8+A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -1039,9 +1053,9 @@ "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, "license": "MIT" }, @@ -1053,9 +1067,9 @@ "license": "MIT" }, "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", "dev": true, "license": "ISC" }, @@ -1106,9 +1120,9 @@ } }, "node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -1252,9 +1266,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.13", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.13.tgz", - "integrity": "sha512-BL2sTuHOdy0YT1lYieUxTw/QMtPBC3pmlJC6xk8BBYVv6vcw3SGdKemQ+Xsx9ik2F/lYDO9tqsFQH1r9PFuHKw==", + "version": "2.10.28", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.28.tgz", + "integrity": "sha512-Ic44hnOtFIgravCunj1ifSoQPSUrkNiJuH9Mf6jr2jjoA74icqV8wU0KuadXeOR8zuIJMOoTv0GuQjZ9ZYNMeA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -1328,9 +1342,9 @@ "license": "MIT" }, "node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -1341,7 +1355,7 @@ "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", - "qs": "~6.14.0", + "qs": "~6.15.1", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" @@ -1366,10 +1380,25 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -1532,9 +1561,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001782", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001782.tgz", - "integrity": "sha512-dZcaJLJeDMh4rELYFw1tvSn1bhZWYFOt468FcbHHxx/Z/dFidd1I6ciyFdi3iwfQCyOjqo9upF6lGQYtMiJWxw==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "dev": true, "funding": [ { @@ -2049,9 +2078,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.329", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.329.tgz", - "integrity": "sha512-/4t+AS1l4S3ZC0Ja7PHFIWeBIxGA3QGqV8/yKsP36v7NcyUCl+bIcmw6s5zVuMIECWwBrAK/6QLzTmbJChBboQ==", + "version": "1.5.352", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.352.tgz", + "integrity": "sha512-9wHk8x6dyuimoe18EdiDPWKExNdxYqo4fn4FwOVVper6RxT3cmpBwBkWWfSOCYJjQdIco/nPhJhNLmn4Ufg1Yg==", "dev": true, "license": "ISC" }, @@ -2140,18 +2169,18 @@ } }, "node_modules/eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.1.0.tgz", - "integrity": "sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.3.0.tgz", + "integrity": "sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.3", - "@eslint/config-helpers": "^0.5.3", - "@eslint/core": "^1.1.1", - "@eslint/plugin-kit": "^0.6.1", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.5.5", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -2528,9 +2557,9 @@ "license": "MIT" }, "node_modules/fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -2811,9 +2840,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -2975,9 +3004,9 @@ "license": "ISC" }, "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", "license": "MIT", "engines": { "node": ">= 12" @@ -3000,12 +3029,12 @@ "license": "MIT" }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -3194,16 +3223,6 @@ "node": "20 || >=22" } }, - "node_modules/istanbul-lib-processinfo/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", @@ -3422,9 +3441,9 @@ } }, "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -3471,13 +3490,10 @@ } }, "node_modules/jsrsasign": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-11.1.1.tgz", - "integrity": "sha512-6w95OOXH8DNeGxakqLndBEqqwQ6A70zGaky1oxfg8WVLWOnghTfJsc5Tknx+Z88MHSb1bGLcqQHImOF8Lk22XA==", - "license": "MIT", - "funding": { - "url": "https://github.com/kjur/jsrsasign#donations" - } + "version": "11.1.3", + "resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-11.1.3.tgz", + "integrity": "sha512-nPnK5D/4lv0Dwr7TlzrKtAd8JlLZwFTqTUUB3NQCbtdobcRcohGFxjbPySDVh74iWUudcCsapYT6OxoyhJLhhA==", + "license": "MIT" }, "node_modules/jszip": { "version": "3.10.1", @@ -3568,9 +3584,9 @@ } }, "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, "node_modules/lodash.flattendeep": { @@ -4074,9 +4090,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.36", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", - "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", "dev": true, "license": "MIT" }, @@ -4749,15 +4765,6 @@ "node": ">= 16" } }, - "node_modules/postman-request/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -5053,11 +5060,12 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "license": "MIT", "dependencies": { + "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" @@ -5579,13 +5587,13 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -5644,36 +5652,22 @@ } }, "node_modules/sinon": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-21.0.3.tgz", - "integrity": "sha512-0x8TQFr8EjADhSME01u1ZK31yv2+bd6Z5NrBCHVM+n4qL1wFqbxftmeyi3bwlr49FbbzRfrqSFOpyHCOh/YmYA==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-21.1.2.tgz", + "integrity": "sha512-FS6mN+/bx7e2ajpXkEmOcWB6xBzWiuNoAQT18/+a20SS4U7FSYl8Ms7N6VTUxN/1JAjkx7aXp+THMC8xdpp0gA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.1", - "@sinonjs/fake-timers": "^15.1.1", - "@sinonjs/samsam": "^9.0.3", - "diff": "^8.0.3", - "supports-color": "^7.2.0" + "@sinonjs/fake-timers": "^15.3.2", + "@sinonjs/samsam": "^10.0.2", + "diff": "^8.0.4" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/sinon" } }, - "node_modules/sinon/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/slice-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz", @@ -5718,12 +5712,12 @@ } }, "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.8.tgz", + "integrity": "sha512-NlGELfPrgX2f1TAAcz0WawlLn+0r3FyhhCRpFFK2CemXenPYvzMWWZINv3eDNo9ucdwme7oCHRY0Jnbs4aIkog==", "license": "MIT", "dependencies": { - "ip-address": "^10.0.1", + "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -6318,16 +6312,16 @@ "license": "MIT" }, "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz", + "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", "bin": { - "uuid": "dist/esm/bin/uuid" + "uuid": "dist-node/bin/uuid" } }, "node_modules/verror": { diff --git a/package.json b/package.json index 963e5908..e99e7dec 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "sanitizer": "^0.1.3", "tmp": "^0.2.5", "tunnel-agent": "^0.6.0", - "uuid": "^11.0.3", + "uuid": "^14.0.0", "volos-util-apigee": "^0.1.7", "xml2js": "^0.5.0" }, @@ -39,7 +39,13 @@ "diff": "^8.0.3", "serialize-javascript": "^7.0.4", "brace-expansion": "^5.0.5", - "glob": "^10.4.5" + "glob": "^10.4.5", + "postman-request": { + "uuid": "^14.0.0" + }, + "istanbul-lib-processinfo": { + "uuid": "^14.0.0" + } }, "devDependencies": { "dotenv": "^16.4.7", From db3ee52b5396cc5acb8fa1f7131bc7e32084e540 Mon Sep 17 00:00:00 2001 From: Nitesh Gupta Date: Wed, 13 May 2026 13:17:02 +0000 Subject: [PATCH 5/5] feat: add support for distroless docker builds --- .../docker/edgemicro/Dockerfile.distroless | 17 ++++++ kubernetes/docker/edgemicro/docker-start.js | 54 +++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 kubernetes/docker/edgemicro/Dockerfile.distroless create mode 100644 kubernetes/docker/edgemicro/docker-start.js diff --git a/kubernetes/docker/edgemicro/Dockerfile.distroless b/kubernetes/docker/edgemicro/Dockerfile.distroless new file mode 100644 index 00000000..668ce922 --- /dev/null +++ b/kubernetes/docker/edgemicro/Dockerfile.distroless @@ -0,0 +1,17 @@ +# Stage 1: Build/Install dependencies using standard Node image +FROM node:24.15.0-bookworm-slim AS builder +WORKDIR /app + +# Install edgemicro locally so all dependencies are self-contained under /app/node_modules +RUN npm install --omit=dev --omit=optional edgemicro@latest +COPY docker-start.js ./ + +# Stage 2: Runtime using Distroless +FROM gcr.io/distroless/nodejs24-debian12 +WORKDIR /app +COPY --from=builder /app /app + +ENV NODE_ENV=production +EXPOSE 8000 8443 + +CMD ["docker-start.js"] diff --git a/kubernetes/docker/edgemicro/docker-start.js b/kubernetes/docker/edgemicro/docker-start.js new file mode 100644 index 00000000..c79bbb81 --- /dev/null +++ b/kubernetes/docker/edgemicro/docker-start.js @@ -0,0 +1,54 @@ +const fs = require('fs'); +const path = require('path'); +const { spawn } = require('child_process'); + +const os = require('os'); + +const apigeeRoot = '/opt/apigee'; +const configDir = path.join(os.homedir(), '.edgemicro'); + +// Ensure directories exist +fs.mkdirSync(configDir, { recursive: true }); +fs.mkdirSync(path.join(apigeeRoot, 'logs'), { recursive: true }); +fs.mkdirSync(path.join(apigeeRoot, 'plugins'), { recursive: true }); + +// Decode base64 config if provided +if (process.env.EDGEMICRO_CONFIG) { + const org = process.env.EDGEMICRO_ORG || 'default'; + const env = process.env.EDGEMICRO_ENV || 'default'; + const configPath = path.join(configDir, `${org}-${env}-config.yaml`); + const decoded = Buffer.from(process.env.EDGEMICRO_CONFIG, 'base64').toString('utf8'); + fs.writeFileSync(configPath, decoded); +} + +// Prepare start arguments +const args = ['start']; +if (process.env.EDGEMICRO_ORG) args.push('-o', process.env.EDGEMICRO_ORG); +if (process.env.EDGEMICRO_ENV) args.push('-e', process.env.EDGEMICRO_ENV); +if (process.env.EDGEMICRO_KEY) args.push('-k', process.env.EDGEMICRO_KEY); +if (process.env.EDGEMICRO_SECRET) args.push('-s', process.env.EDGEMICRO_SECRET); + +const port = process.env.EDGEMICRO_PORT || '8000'; +args.push('-r', port); + +const pluginDir = process.env.EDGEMICRO_PLUGIN_DIR || path.join(apigeeRoot, 'plugins'); +args.push('-d', pluginDir); + +if (process.env.EDGEMICRO_PROCESSES) { + args.push('-p', process.env.EDGEMICRO_PROCESSES); +} + +console.log(`Starting edgemicro with args: ${args.join(' ')}`); + +const cliScript = '/app/node_modules/edgemicro/cli/edgemicro'; +const child = spawn(process.execPath, [cliScript, ...args], { stdio: 'inherit' }); + +process.on('SIGTERM', () => { + console.log('Received SIGTERM, stopping edgemicro...'); + child.kill('SIGTERM'); +}); + +process.on('SIGINT', () => { + console.log('Received SIGINT, stopping edgemicro...'); + child.kill('SIGINT'); +});