From 7cde2a906a6529b3fe83d11e684680600f8d121c Mon Sep 17 00:00:00 2001 From: Ariel Weinberger Date: Tue, 11 Feb 2025 02:09:51 -0600 Subject: [PATCH] Feat/revert to lambda preview envs (#1331) --- .../destroy-inactive-preview-environments.yml | 83 + .github/workflows/e2e.yml | 8 +- .github/workflows/preview-envs-deploy.yml | 109 +- .github/workflows/preview-envs-destroy.yml | 62 +- CopilotKit/examples/next-openai/Dockerfile | 6 +- .../examples/next-openai/src/app/page.tsx | 2 +- examples/Dockerfile.agent-js | 1 + examples/Dockerfile.agent-python | 3 +- examples/Dockerfile.ui | 11 +- .../coagents-qa-native/agent-js/.gitignore | 3 - .../agent/email_agent/demo.py | 6 - .../ui/app/api/copilotkit/route.ts | 2 +- examples/coagents-qa-native/ui/app/layout.tsx | 6 +- examples/coagents-qa-native/ui/app/page.tsx | 17 +- examples/coagents-qa-text/agent-js/.gitignore | 3 - .../agent/greeting_agent/demo.py | 6 - .../ui/app/api/copilotkit/route.ts | 2 +- examples/coagents-qa-text/ui/app/layout.tsx | 6 +- examples/coagents-qa-text/ui/app/page.tsx | 46 +- .../coagents-qa/agent/email_agent/demo.py | 6 - .../agent-js/.gitignore | 3 - .../agent/research_canvas/demo.py | 1 + .../ui/src/app/api/copilotkit/route.ts | 2 +- .../ui/src/app/layout.tsx | 3 +- .../ui/src/app/page.tsx | 21 +- examples/coagents-routing/agent-js/.gitignore | 3 - .../coagents-routing/agent/my_agent/demo.py | 1 + .../ui/src/app/api/copilotkit/route.ts | 2 +- .../coagents-routing/ui/src/app/layout.tsx | 6 +- examples/coagents-routing/ui/src/app/page.tsx | 18 +- .../agent/translate_agent/demo.py | 6 - .../agent-py/sample_agent/demo.py | 6 - examples/coagents-travel/agent/travel/demo.py | 6 - .../ui/app/api/copilotkit/route.ts | 2 +- .../agent/weather_agent/demo.py | 6 - examples/e2e/.gitignore | 1 - examples/e2e/lib/config-helper.ts | 38 +- examples/e2e/playwright.config.ts | 2 +- .../coagents-canvas-researcher-demo.spec.ts | 2 +- .../e2e/tests/coagents-qa-native-demo.spec.ts | 2 +- .../e2e/tests/coagents-qa-text-demo.spec.ts | 2 +- .../e2e/tests/coagents-routing-demo.spec.ts | 2 +- examples/e2e/tests/next-openai.spec.ts | 2 +- examples/helmfile/.gitignore | 3 - .../helmfile/charts/example-app/.helmignore | 23 - .../helmfile/charts/example-app/Chart.yaml | 24 - .../charts/example-app/templates/NOTES.txt | 0 .../charts/example-app/templates/_helpers.tpl | 52 - .../charts/example-app/templates/ingress.yaml | 35 - .../example-app/templates/kservice.yaml | 71 - .../templates/outputs-configmap.yaml | 21 - .../example-app/templates/serviceaccount.yaml | 12 - .../charts/examples-shared/.helmignore | 23 - .../charts/examples-shared/Chart.yaml | 24 - .../examples-shared/templates/_helpers.tpl | 62 - .../examples-shared/templates/ingress.yaml | 38 - .../nginx-placeholder-deployment.yaml | 19 - .../templates/nginx-placeholder-service.yaml | 12 - .../templates/serviceaccount.yaml | 12 - .../charts/examples-shared/values.yaml.gotmpl | 13 - .../destroy-inactive-preview-environments.js | 6 +- examples/helmfile/environments/default.yaml | 3 - examples/helmfile/generate-table.js | 124 - examples/helmfile/helmfile.yaml | 67 - examples/helmfile/package.json | 12 - examples/helmfile/pnpm-lock.yaml | 29 - examples/helmfile/temp.json | 58 + .../values/coagents-qa-native.yaml.gotmpl | 84 - .../values/coagents-qa-text.yaml.gotmpl | 86 - .../coagents-research-canvas.yaml.gotmpl | 84 - .../values/coagents-routing.yaml.gotmpl | 84 - .../helmfile/values/next-openai.yaml.gotmpl | 23 - infra/.gitignore | 12 + infra/.npmignore | 6 + infra/README.md | 14 + infra/bin/infra.ts | 116 + infra/cdk.json | 80 + infra/generate-table.js | 85 + infra/get-e2e-tests-urls.js | 35 + infra/jest.config.js | 8 + infra/lib/demo-project-stack.ts | 175 + infra/lib/utils.ts | 257 ++ infra/package.json | 28 + infra/pnpm-lock.yaml | 2803 +++++++++++++++++ infra/test/infra.test.ts | 17 + infra/tsconfig.json | 31 + 86 files changed, 3967 insertions(+), 1329 deletions(-) create mode 100644 .github/workflows/destroy-inactive-preview-environments.yml delete mode 100644 examples/helmfile/.gitignore delete mode 100644 examples/helmfile/charts/example-app/.helmignore delete mode 100644 examples/helmfile/charts/example-app/Chart.yaml delete mode 100644 examples/helmfile/charts/example-app/templates/NOTES.txt delete mode 100644 examples/helmfile/charts/example-app/templates/_helpers.tpl delete mode 100644 examples/helmfile/charts/example-app/templates/ingress.yaml delete mode 100644 examples/helmfile/charts/example-app/templates/kservice.yaml delete mode 100644 examples/helmfile/charts/example-app/templates/outputs-configmap.yaml delete mode 100644 examples/helmfile/charts/example-app/templates/serviceaccount.yaml delete mode 100644 examples/helmfile/charts/examples-shared/.helmignore delete mode 100644 examples/helmfile/charts/examples-shared/Chart.yaml delete mode 100644 examples/helmfile/charts/examples-shared/templates/_helpers.tpl delete mode 100644 examples/helmfile/charts/examples-shared/templates/ingress.yaml delete mode 100644 examples/helmfile/charts/examples-shared/templates/nginx-placeholder-deployment.yaml delete mode 100644 examples/helmfile/charts/examples-shared/templates/nginx-placeholder-service.yaml delete mode 100644 examples/helmfile/charts/examples-shared/templates/serviceaccount.yaml delete mode 100644 examples/helmfile/charts/examples-shared/values.yaml.gotmpl delete mode 100644 examples/helmfile/environments/default.yaml delete mode 100644 examples/helmfile/generate-table.js delete mode 100644 examples/helmfile/helmfile.yaml delete mode 100644 examples/helmfile/package.json delete mode 100644 examples/helmfile/pnpm-lock.yaml create mode 100644 examples/helmfile/temp.json delete mode 100644 examples/helmfile/values/coagents-qa-native.yaml.gotmpl delete mode 100644 examples/helmfile/values/coagents-qa-text.yaml.gotmpl delete mode 100644 examples/helmfile/values/coagents-research-canvas.yaml.gotmpl delete mode 100644 examples/helmfile/values/coagents-routing.yaml.gotmpl delete mode 100644 examples/helmfile/values/next-openai.yaml.gotmpl create mode 100644 infra/.gitignore create mode 100644 infra/.npmignore create mode 100644 infra/README.md create mode 100644 infra/bin/infra.ts create mode 100644 infra/cdk.json create mode 100644 infra/generate-table.js create mode 100644 infra/get-e2e-tests-urls.js create mode 100644 infra/jest.config.js create mode 100644 infra/lib/demo-project-stack.ts create mode 100644 infra/lib/utils.ts create mode 100644 infra/package.json create mode 100644 infra/pnpm-lock.yaml create mode 100644 infra/test/infra.test.ts create mode 100644 infra/tsconfig.json diff --git a/.github/workflows/destroy-inactive-preview-environments.yml b/.github/workflows/destroy-inactive-preview-environments.yml new file mode 100644 index 0000000000..d7ca3333ef --- /dev/null +++ b/.github/workflows/destroy-inactive-preview-environments.yml @@ -0,0 +1,83 @@ +name: Destroy Inactive Preview Environments + +on: + schedule: + - cron: "0 * * * *" + workflow_dispatch: + +jobs: + destroy: + name: Destroy Inactive Preview Environments + runs-on: ubuntu-20.04 + outputs: + destroyed-pr-numbers: ${{ steps.delete-inactive-preview-environments.outputs.destroyed-pr-numbers }} + defaults: + run: + working-directory: examples/helmfile + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + aws-region: us-east-1 + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + + - name: Setup helmfile + uses: mamezou-tech/setup-helmfile@v1.2.0 + + - name: EKS Config + run: | + aws eks --region us-east-1 update-kubeconfig --name copilotcloud-staging-eks + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: "9.5" + + - name: Use Node.js 21 + uses: actions/setup-node@v2 + with: + node-version: 21.x + cache: "pnpm" + cache-dependency-path: "./examples/helmfile/pnpm-lock.yaml" + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Delete inactive preview environments + id: delete-inactive-preview-environments + run: | + node destroy-inactive-preview-environments.js + echo "destroyed-pr-numbers=$(cat inactive-pull-requests.json)" >> "$GITHUB_OUTPUT" + + pr-comments: + needs: destroy + if: ${{ needs.destroy.outputs.destroyed-pr-numbers != '[]' }} + name: Comment on PRs + runs-on: ubuntu-20.04 + strategy: + matrix: + pr-number: ${{ fromJSON(needs.destroy.outputs.destroyed-pr-numbers) }} + steps: + - name: Comment on PRs + run: | + echo "PR number: ${{ matrix.pr-number }}" + + - name: Delete a comment + uses: thollander/actions-comment-pull-request@v3 + with: + comment-tag: preview-status-update + mode: delete + pr-number: ${{ matrix.pr-number }} + + - name: Comment + uses: thollander/actions-comment-pull-request@v3 + with: + comment-tag: preview-status-update + pr-number: ${{ matrix.pr-number }} + message: | + The preview environment for this PR has been deleted because it has been inactive for more than 12 hours. + To recreate the preview environment, you can push a new change to the PR. \ No newline at end of file diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index bee19908c3..8933d79ece 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -1,4 +1,4 @@ -name: Deploy Copilot Cloud Environment +name: End to End Tests on: workflow_call: @@ -35,7 +35,7 @@ jobs: - name: Save E2E URLs working-directory: examples/e2e run: | - echo "${{ inputs.urls }}" | base64 -d > test-config.json + echo "${{ inputs.urls }}" | base64 -d > app-configs.json - name: Setup pnpm uses: pnpm/action-setup@v2 @@ -58,7 +58,7 @@ jobs: - name: Print app configs working-directory: examples/e2e run: | - cat test-config.json + cat app-configs.json - name: Delete a comment uses: thollander/actions-comment-pull-request@v3 @@ -111,4 +111,4 @@ jobs: with: pr-number: ${{ inputs.pr_number }} comment-tag: test-run-status-update - file-path: ./examples/e2e/test-results/test-run-comment.md + file-path: ./examples/e2e/test-results/test-run-comment.md \ No newline at end of file diff --git a/.github/workflows/preview-envs-deploy.yml b/.github/workflows/preview-envs-deploy.yml index fd33cdc0fd..b9ad6359d2 100644 --- a/.github/workflows/preview-envs-deploy.yml +++ b/.github/workflows/preview-envs-deploy.yml @@ -1,4 +1,4 @@ -name: Deploy Preview Environments +name: Preview Environments on: pull_request: @@ -10,7 +10,7 @@ on: - main concurrency: - group: preview-${{ github.ref }}-deploy + group: preview-${{ github.event.pull_request.number }}-deploy cancel-in-progress: false jobs: @@ -31,17 +31,17 @@ jobs: project: "coagents-research-canvas", type: "agent", runtime: "js", - deps: "remote-deps", + deps: "local-deps", } - { project: "coagents-research-canvas", type: "ui" } - { project: "coagents-routing", type: "agent", runtime: "python", deps: "local-deps" } - - { project: "coagents-routing", type: "agent", runtime: "js", deps: "remote-deps" } + - { project: "coagents-routing", type: "agent", runtime: "js", deps: "local-deps" } - { project: "coagents-routing", type: "ui" } - { project: "coagents-qa-text", type: "agent", runtime: "python", deps: "local-deps" } - - { project: "coagents-qa-text", type: "agent", runtime: "js", deps: "remote-deps" } + - { project: "coagents-qa-text", type: "agent", runtime: "js", deps: "local-deps" } - { project: "coagents-qa-text", type: "ui" } - { project: "coagents-qa-native", type: "agent", runtime: "python", deps: "local-deps" } - - { project: "coagents-qa-native", type: "agent", runtime: "js", deps: "remote-deps" } + - { project: "coagents-qa-native", type: "agent", runtime: "js", deps: "local-deps" } - { project: "coagents-qa-native", type: "ui" } - { project: "next-openai", type: "next-openai" } steps: @@ -79,6 +79,8 @@ jobs: uses: actions/setup-node@v2 with: node-version: 21.x + cache: "pnpm" + cache-dependency-path: "**/pnpm-lock.yaml" - name: (UI) Install app dependencies if: matrix.app.type == 'ui' @@ -124,7 +126,7 @@ jobs: -t 058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:${{ matrix.app.project }}-ui-${{ github.run_id }} \ --build-arg APP_DIR=examples/${{ matrix.app.project }}/${{ matrix.app.type }} \ -f ./examples/Dockerfile.${{ matrix.app.type }} \ - --platform=linux/arm64 \ + --platform=linux/amd64 \ --provenance=false \ --push \ . @@ -137,7 +139,7 @@ jobs: docker buildx build \ -t 058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:next-openai-${{ github.run_id }} \ -f ./CopilotKit/examples/next-openai/Dockerfile \ - --platform=linux/arm64 \ + --platform=linux/amd64 \ --provenance=false \ --push \ . @@ -152,7 +154,7 @@ jobs: --build-arg APP_DIR=examples/${{ matrix.app.project }}/agent \ -f ./examples/Dockerfile.agent-python \ --build-arg WITH_LOCAL_DEPS=${{ matrix.app.deps == 'local-deps' }} \ - --platform=linux/arm64 \ + --platform=linux/amd64 \ --provenance=false \ --push \ . @@ -166,7 +168,7 @@ jobs: -t 058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:${{ matrix.app.project }}-agent-js-${{ matrix.app.deps }}-${{ github.run_id }} \ --build-arg APP_DIR=examples/${{ matrix.app.project }}/agent-js \ -f ./examples/Dockerfile.agent-js \ - --platform=linux/arm64 \ + --platform=linux/amd64 \ --provenance=false \ --push \ . @@ -174,14 +176,11 @@ jobs: DOCKER_BUILDKIT: 1 deploy: + runs-on: ubuntu-latest name: Deploy Preview Environments - runs-on: ubuntu-20.04 needs: build_images outputs: e2e-urls: ${{ steps.export-e2e-urls.outputs.e2e-urls }} - defaults: - run: - working-directory: examples/helmfile steps: - name: Checkout uses: actions/checkout@v3 @@ -193,13 +192,6 @@ jobs: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - - name: Setup helmfile - uses: mamezou-tech/setup-helmfile@v1.2.0 - - - name: EKS Config - run: | - aws eks --region us-east-1 update-kubeconfig --name copilotcloud-staging-eks - - name: Set Environment Name id: set-environment-name run: | @@ -209,19 +201,6 @@ jobs: echo "environment=main" >> "$GITHUB_OUTPUT" fi - - name: Prepare Environment Config - run: | - cat > ./override-values.yaml << 'EOL' - environment: ${{ steps.set-environment-name.outputs.environment }} - namespace: prv-${{ steps.set-environment-name.outputs.environment }} - globalImageTag: ${{ github.run_id }} - EOL - - - name: Helmfile Sync - run: | - helmfile --state-values-file=./override-values.yaml sync - helmfile --state-values-file=./override-values.yaml --selector "name!=examples-shared" list --output json > helmfile-output.json - - name: Setup pnpm uses: pnpm/action-setup@v4 with: @@ -231,19 +210,62 @@ jobs: uses: actions/setup-node@v2 with: node-version: 21.x + cache: "pnpm" + cache-dependency-path: "**/pnpm-lock.yaml" - - name: Install dependencies - run: pnpm install --frozen-lockfile + - name: Infra install dependencies + working-directory: infra + run: pnpm i + + - name: Install AWS CDK + run: npm install -g aws-cdk + + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: us-east-1 + + - name: Configure AWS Profile + run: | + aws configure set aws_access_key_id ${{ secrets.AWS_ACCESS_KEY_ID }} --profile default + aws configure set aws_secret_access_key ${{ secrets.AWS_SECRET_ACCESS_KEY }} --profile default + aws configure set region us-east-1 + + - name: cdk deploy + working-directory: ./infra + run: cdk deploy --profile default --all --require-approval never --outputs-file=cdk_outputs.json --concurrency 10 + env: + UNIQUE_ENV_ID: "PR${{ github.event.number }}" + GITHUB_ACTIONS_RUN_ID: "${{ github.run_id }}" + GITHUB_PR_NUMBER: "${{ github.event.number }}" + + - name: Print CDK Outputs + working-directory: infra + run: | + cat cdk_outputs.json - name: Generate table from outputs id: generate-table + working-directory: infra run: | node generate-table env: - ENVIRONMENT: ${{ steps.set-environment-name.outputs.environment }} - NAMESPACE: prv-${{ steps.set-environment-name.outputs.environment }} GITHUB_SHA: ${{ github.sha }} + - name: Assign label + uses: actions/github-script@v4 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + github.issues.addLabels({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + labels: ['preview'] + }) + - name: Delete a comment if: github.event_name == 'pull_request' uses: thollander/actions-comment-pull-request@v3 @@ -256,16 +278,13 @@ jobs: uses: thollander/actions-comment-pull-request@v3 with: comment-tag: preview-status-update - file-path: ./examples/helmfile/preview-comment.md + file-path: ./infra/preview-comment.md - name: Export Variable - E2E URLs id: export-e2e-urls - working-directory: examples/e2e + working-directory: infra run: | - echo "e2e-urls=$(cat test-config.json | base64 -w 0)" >> "$GITHUB_OUTPUT" - - - name: Wait 60 seconds - run: sleep 60 + echo "e2e-urls=$(node get-e2e-tests-urls.js | base64 -w 0)" >> "$GITHUB_OUTPUT" test: if: github.event_name == 'pull_request' @@ -277,4 +296,4 @@ jobs: sha: "${{ github.event.pull_request.head.sha }}" urls: "${{ needs.deploy.outputs.e2e-urls }}" pr_number: "${{ github.event.pull_request.number }}" - secrets: inherit + secrets: inherit \ No newline at end of file diff --git a/.github/workflows/preview-envs-destroy.yml b/.github/workflows/preview-envs-destroy.yml index 696e4046f4..64acf4c2ed 100644 --- a/.github/workflows/preview-envs-destroy.yml +++ b/.github/workflows/preview-envs-destroy.yml @@ -5,9 +5,9 @@ on: types: [ closed ] workflow_dispatch: inputs: - environment: - description: 'Environment Name (e.g. `pr-1269`)' - required: false + pr_number: + description: 'Pull Request Number' + required: true concurrency: group: preview-${{ github.event.pull_request.number }}-destroy @@ -15,12 +15,9 @@ concurrency: jobs: preview_envs_destroy: - if: github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' + if: github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'preview') || github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest name: Destroy Preview Environments - defaults: - run: - working-directory: examples/helmfile permissions: deployments: write pull-requests: write @@ -30,43 +27,44 @@ jobs: - name: Checkout uses: actions/checkout@v3 + - name: Install AWS CDK + run: npm install -g aws-cdk + - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v2 + uses: aws-actions/configure-aws-credentials@v4 with: - aws-region: us-east-1 aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: us-east-1 - - name: Setup helmfile - uses: mamezou-tech/setup-helmfile@v1.2.0 - - - name: EKS Config + - name: Configure AWS Profile run: | - aws eks --region us-east-1 update-kubeconfig --name copilotcloud-staging-eks + aws configure set aws_access_key_id ${{ secrets.AWS_ACCESS_KEY_ID }} --profile default + aws configure set aws_secret_access_key ${{ secrets.AWS_SECRET_ACCESS_KEY }} --profile default + aws configure set region us-east-1 + + - uses: pnpm/action-setup@v4 + with: + version: 9 - - name: Set Environment Name - id: set-environment-name - run: | - if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then - echo "ENVIRONMENT=${{ github.event.inputs.environment }}" >> "$GITHUB_OUTPUT" - elif [ "${{ github.event_name }}" = "pull_request" ]; then - echo "ENVIRONMENT=pr-${{ github.event.pull_request.number }}" >> "$GITHUB_OUTPUT" - fi + - name: Infra install dependencies + working-directory: infra + run: pnpm i - - name: Prepare Environment Config + - name: Set variable UNIQUE_ENV_ID + id: set_unique_env_id run: | - cat > ./override-values.yaml << 'EOL' - environment: ${{ steps.set-environment-name.outputs.environment }} - namespace: prv-${{ steps.set-environment-name.outputs.environment }} - EOL + echo "UNIQUE_ENV_ID=${{ github.event.number && format('PR{0}', github.event.number) || format('PR{0}', inputs.pr_number) }}" >> "$GITHUB_OUTPUT" - - name: Helmfile Destroy - run: | - helmfile --state-values-file=./override-values.yaml destroy - kubectl delete namespace prv-${{ steps.set-environment-name.outputs.environment }} -A --force + - name: cdk destroy + working-directory: ./infra + run: cdk destroy --profile default --all --force + env: + UNIQUE_ENV_ID: ${{ steps.set_unique_env_id.outputs.UNIQUE_ENV_ID }} + GITHUB_ACTIONS_RUN_ID: "${{ github.run_id }}" + GITHUB_PR_NUMBER: "${{ github.event.number }}" - name: Comment post-destroy - if: github.event_name == 'pull_request' uses: thollander/actions-comment-pull-request@v3 with: comment-tag: preview-status-update diff --git a/CopilotKit/examples/next-openai/Dockerfile b/CopilotKit/examples/next-openai/Dockerfile index b67f82a47f..630efd37da 100644 --- a/CopilotKit/examples/next-openai/Dockerfile +++ b/CopilotKit/examples/next-openai/Dockerfile @@ -10,6 +10,7 @@ RUN pnpm i -g turbo # Production Stage FROM base AS production ARG APP_DIR="CopilotKit/examples/next-openai" +COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.4 /lambda-adapter /opt/extensions/lambda-adapter WORKDIR /app/CopilotKit COPY CopilotKit/package.json CopilotKit/pnpm-lock.yaml CopilotKit/pnpm-workspace.yaml ./ @@ -23,6 +24,5 @@ RUN pnpm i --frozen-lockfile # Set the environment variables (if needed) ENV NODE_ENV=production -ENV HOST=0.0.0.0 -ENV PORT=3000 -CMD ["node", "server.js", "--host", "$HOST", "--port", "$PORT"] \ No newline at end of file +EXPOSE 3000 +CMD ["node", "server.js"] \ No newline at end of file diff --git a/CopilotKit/examples/next-openai/src/app/page.tsx b/CopilotKit/examples/next-openai/src/app/page.tsx index 7ed7f23542..be1a8113dd 100644 --- a/CopilotKit/examples/next-openai/src/app/page.tsx +++ b/CopilotKit/examples/next-openai/src/app/page.tsx @@ -15,7 +15,7 @@ export default function WaterBnb() { const copilotKitProps: Partial> = { runtimeUrl, publicApiKey: publicApiKey || undefined, - showDevConsole: false, + showDevConsole: true, }; return ( diff --git a/examples/Dockerfile.agent-js b/examples/Dockerfile.agent-js index 843c95ccd3..fe59502dc0 100644 --- a/examples/Dockerfile.agent-js +++ b/examples/Dockerfile.agent-js @@ -1,6 +1,7 @@ # syntax=docker/dockerfile:1-labs FROM node:22-slim AS base +COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.4 /lambda-adapter /opt/extensions/lambda-adapter ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN corepack enable diff --git a/examples/Dockerfile.agent-python b/examples/Dockerfile.agent-python index bfe1b5b4db..7ce3334190 100644 --- a/examples/Dockerfile.agent-python +++ b/examples/Dockerfile.agent-python @@ -1,11 +1,10 @@ FROM public.ecr.aws/docker/library/python:3.12.0-slim-bullseye +COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.4 /lambda-adapter /opt/extensions/lambda-adapter ARG APP_DIR ARG WITH_LOCAL_DEPS ENV POETRY_VIRTUALENVS_CREATE=false -RUN apt-get update && apt-get install curl -y - # Install poetry and configure it in a single layer RUN pip install poetry==1.7.1 && \ poetry config virtualenvs.create false diff --git a/examples/Dockerfile.ui b/examples/Dockerfile.ui index d431d7df12..3afa61d00c 100644 --- a/examples/Dockerfile.ui +++ b/examples/Dockerfile.ui @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1-labs -FROM node:22-alpine AS base +FROM node:22-slim AS base ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN corepack enable @@ -10,11 +10,9 @@ RUN pnpm i -g turbo # Production Stage FROM base AS production ARG APP_DIR +COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.4 /lambda-adapter /opt/extensions/lambda-adapter WORKDIR /app -# Add required libraries for Next.js standalone server -RUN apk add --no-cache libc6-compat - COPY ${APP_DIR}/package.json ${APP_DIR}/pnpm-lock.yaml ./ RUN pnpm i --frozen-lockfile @@ -24,8 +22,7 @@ COPY ${APP_DIR}/.next/static ./.next/static # Set the environment variables (if needed) ENV NODE_ENV=production -ENV HOST=0.0.0.0 -ENV PORT=3000 -CMD ["node", "server.js", "--host", "$HOST", "--port", "$PORT"] +EXPOSE 3000 +CMD ["node", "server.js"] # \ No newline at end of file diff --git a/examples/coagents-qa-native/agent-js/.gitignore b/examples/coagents-qa-native/agent-js/.gitignore index d44ec5787e..f351710520 100644 --- a/examples/coagents-qa-native/agent-js/.gitignore +++ b/examples/coagents-qa-native/agent-js/.gitignore @@ -3,6 +3,3 @@ __pycache__/ *.pyc .env .vercel - -# LangGraph API -.langgraph_api diff --git a/examples/coagents-qa-native/agent/email_agent/demo.py b/examples/coagents-qa-native/agent/email_agent/demo.py index b77ab9b7c2..457737dd63 100644 --- a/examples/coagents-qa-native/agent/email_agent/demo.py +++ b/examples/coagents-qa-native/agent/email_agent/demo.py @@ -23,12 +23,6 @@ sdk = CopilotKitRemoteEndpoint( add_fastapi_endpoint(app, sdk, "/copilotkit") -# add new route for health check -@app.get("/health") -def health(): - """Health check.""" - return {"status": "ok"} - def main(): """Run the uvicorn server.""" port = int(os.getenv("PORT", "8000")) diff --git a/examples/coagents-qa-native/ui/app/api/copilotkit/route.ts b/examples/coagents-qa-native/ui/app/api/copilotkit/route.ts index c444d0e083..9d96a64b66 100644 --- a/examples/coagents-qa-native/ui/app/api/copilotkit/route.ts +++ b/examples/coagents-qa-native/ui/app/api/copilotkit/route.ts @@ -10,7 +10,7 @@ import OpenAI from "openai"; const openai = new OpenAI(); const llmAdapter = new OpenAIAdapter({ openai } as any); -const langsmithApiKey = process.env.LANGSMITH_API_KEY as string || ""; +const langsmithApiKey = process.env.LANGSMITH_API_KEY as string; export const POST = async (req: NextRequest) => { const searchParams = req.nextUrl.searchParams; diff --git a/examples/coagents-qa-native/ui/app/layout.tsx b/examples/coagents-qa-native/ui/app/layout.tsx index 5d1b86ff26..55654db95a 100644 --- a/examples/coagents-qa-native/ui/app/layout.tsx +++ b/examples/coagents-qa-native/ui/app/layout.tsx @@ -1,7 +1,7 @@ import type { Metadata } from "next"; import { Inter } from "next/font/google"; import "./globals.css"; -import { Suspense } from "react"; + const inter = Inter({ subsets: ["latin"] }); export const metadata: Metadata = { @@ -16,9 +16,7 @@ export default function RootLayout({ }>) { return ( - - Loading...}>{children} - + {children} ); } diff --git a/examples/coagents-qa-native/ui/app/page.tsx b/examples/coagents-qa-native/ui/app/page.tsx index 8b5b8d296b..65bb632f6a 100644 --- a/examples/coagents-qa-native/ui/app/page.tsx +++ b/examples/coagents-qa-native/ui/app/page.tsx @@ -5,7 +5,6 @@ import { Mailer } from "./Mailer"; import "@copilotkit/react-ui/styles.css"; import { ModelSelectorProvider, useModelSelectorContext } from "@/lib/model-selector-provider"; import { ModelSelector } from "@/components/ModelSelector"; -import { useSearchParams } from "next/navigation"; export default function ModelSelectorWrapper() { return ( @@ -21,22 +20,8 @@ export default function ModelSelectorWrapper() { function Home() { const { lgcDeploymentUrl } = useModelSelectorContext(); - const searchParams = useSearchParams(); - - const runtimeUrl = searchParams.get("runtimeUrl") - ? (searchParams.get("runtimeUrl") as string) - : `/api/copilotkit?lgcDeploymentUrl=${lgcDeploymentUrl ?? ""}`; - - const publicApiKey = searchParams.get("publicApiKey"); - const copilotKitProps: Partial> = { - runtimeUrl, - publicApiKey: publicApiKey || undefined, - showDevConsole: false, - agent: "email_agent", - }; - return ( - + ); diff --git a/examples/coagents-qa-text/agent-js/.gitignore b/examples/coagents-qa-text/agent-js/.gitignore index d44ec5787e..f351710520 100644 --- a/examples/coagents-qa-text/agent-js/.gitignore +++ b/examples/coagents-qa-text/agent-js/.gitignore @@ -3,6 +3,3 @@ __pycache__/ *.pyc .env .vercel - -# LangGraph API -.langgraph_api diff --git a/examples/coagents-qa-text/agent/greeting_agent/demo.py b/examples/coagents-qa-text/agent/greeting_agent/demo.py index 86b7ea4e6e..b147c00309 100644 --- a/examples/coagents-qa-text/agent/greeting_agent/demo.py +++ b/examples/coagents-qa-text/agent/greeting_agent/demo.py @@ -24,12 +24,6 @@ sdk = CopilotKitRemoteEndpoint( add_fastapi_endpoint(app, sdk, "/copilotkit", use_thread_pool=False) -# add new route for health check -@app.get("/health") -def health(): - """Health check.""" - return {"status": "ok"} - def main(): """Run the uvicorn server.""" port = int(os.getenv("PORT", "8000")) diff --git a/examples/coagents-qa-text/ui/app/api/copilotkit/route.ts b/examples/coagents-qa-text/ui/app/api/copilotkit/route.ts index a91a29e7a2..7a78e09f0e 100644 --- a/examples/coagents-qa-text/ui/app/api/copilotkit/route.ts +++ b/examples/coagents-qa-text/ui/app/api/copilotkit/route.ts @@ -8,7 +8,7 @@ import OpenAI from "openai"; const openai = new OpenAI(); const llmAdapter = new OpenAIAdapter({ openai } as any); -const langsmithApiKey = process.env.LANGSMITH_API_KEY as string || ""; +const langsmithApiKey = process.env.LANGSMITH_API_KEY as string export const POST = async (req: NextRequest) => { const searchParams = req.nextUrl.searchParams diff --git a/examples/coagents-qa-text/ui/app/layout.tsx b/examples/coagents-qa-text/ui/app/layout.tsx index 5d1b86ff26..55654db95a 100644 --- a/examples/coagents-qa-text/ui/app/layout.tsx +++ b/examples/coagents-qa-text/ui/app/layout.tsx @@ -1,7 +1,7 @@ import type { Metadata } from "next"; import { Inter } from "next/font/google"; import "./globals.css"; -import { Suspense } from "react"; + const inter = Inter({ subsets: ["latin"] }); export const metadata: Metadata = { @@ -16,9 +16,7 @@ export default function RootLayout({ }>) { return ( - - Loading...}>{children} - + {children} ); } diff --git a/examples/coagents-qa-text/ui/app/page.tsx b/examples/coagents-qa-text/ui/app/page.tsx index e9118da317..e734988538 100644 --- a/examples/coagents-qa-text/ui/app/page.tsx +++ b/examples/coagents-qa-text/ui/app/page.tsx @@ -3,42 +3,26 @@ import { CopilotKit } from "@copilotkit/react-core"; import { Greeter } from "./Greeter"; import "@copilotkit/react-ui/styles.css"; -import { - ModelSelectorProvider, - useModelSelectorContext, -} from "@/lib/model-selector-provider"; +import { ModelSelectorProvider, useModelSelectorContext } from "@/lib/model-selector-provider"; import { ModelSelector } from "@/components/ModelSelector"; -import { useSearchParams } from "next/navigation"; export default function ModelSelectorWrapper() { - return ( -
- - - - -
- ); + return ( +
+ + + + +
+ ); } function Home() { - const { lgcDeploymentUrl } = useModelSelectorContext(); + const { lgcDeploymentUrl } = useModelSelectorContext(); - const searchParams = useSearchParams(); - - const runtimeUrl = searchParams.get("runtimeUrl") - ? (searchParams.get("runtimeUrl") as string) - : `/api/copilotkit?lgcDeploymentUrl=${lgcDeploymentUrl ?? ""}`; - - const publicApiKey = searchParams.get("publicApiKey"); - const copilotKitProps: Partial> = { - runtimeUrl, - publicApiKey: publicApiKey || undefined, - showDevConsole: false, - }; - return ( - - - - ); + return ( + + + + ); } diff --git a/examples/coagents-qa/agent/email_agent/demo.py b/examples/coagents-qa/agent/email_agent/demo.py index 6588ebf9d1..3767197967 100644 --- a/examples/coagents-qa/agent/email_agent/demo.py +++ b/examples/coagents-qa/agent/email_agent/demo.py @@ -24,12 +24,6 @@ sdk = CopilotKitRemoteEndpoint( add_fastapi_endpoint(app, sdk, "/copilotkit") -# add new route for health check -@app.get("/health") -def health(): - """Health check.""" - return {"status": "ok"} - def main(): """Run the uvicorn server.""" port = int(os.getenv("PORT", "8000")) diff --git a/examples/coagents-research-canvas/agent-js/.gitignore b/examples/coagents-research-canvas/agent-js/.gitignore index d44ec5787e..f351710520 100644 --- a/examples/coagents-research-canvas/agent-js/.gitignore +++ b/examples/coagents-research-canvas/agent-js/.gitignore @@ -3,6 +3,3 @@ __pycache__/ *.pyc .env .vercel - -# LangGraph API -.langgraph_api diff --git a/examples/coagents-research-canvas/agent/research_canvas/demo.py b/examples/coagents-research-canvas/agent/research_canvas/demo.py index 20e6782c98..6d1c4347c7 100644 --- a/examples/coagents-research-canvas/agent/research_canvas/demo.py +++ b/examples/coagents-research-canvas/agent/research_canvas/demo.py @@ -35,6 +35,7 @@ def health(): """Health check.""" return {"status": "ok"} + def main(): """Run the uvicorn server.""" port = int(os.getenv("PORT", "8000")) diff --git a/examples/coagents-research-canvas/ui/src/app/api/copilotkit/route.ts b/examples/coagents-research-canvas/ui/src/app/api/copilotkit/route.ts index efa043b1ec..aa7d6e16a8 100644 --- a/examples/coagents-research-canvas/ui/src/app/api/copilotkit/route.ts +++ b/examples/coagents-research-canvas/ui/src/app/api/copilotkit/route.ts @@ -9,7 +9,7 @@ import { NextRequest } from "next/server"; const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY }); const llmAdapter = new OpenAIAdapter({ openai } as any); -const langsmithApiKey = process.env.LANGSMITH_API_KEY as string || ""; +const langsmithApiKey = process.env.LANGSMITH_API_KEY as string export const POST = async (req: NextRequest) => { const searchParams = req.nextUrl.searchParams diff --git a/examples/coagents-research-canvas/ui/src/app/layout.tsx b/examples/coagents-research-canvas/ui/src/app/layout.tsx index 4580309a2d..950bf0d361 100644 --- a/examples/coagents-research-canvas/ui/src/app/layout.tsx +++ b/examples/coagents-research-canvas/ui/src/app/layout.tsx @@ -2,7 +2,6 @@ import type { Metadata } from "next"; import localFont from "next/font/local"; import "@copilotkit/react-ui/styles.css"; import "./globals.css"; -import { Suspense } from "react"; const geistSans = localFont({ src: "./fonts/GeistVF.woff", @@ -30,7 +29,7 @@ export default function RootLayout({ - Loading...}>{children} + {children} ); diff --git a/examples/coagents-research-canvas/ui/src/app/page.tsx b/examples/coagents-research-canvas/ui/src/app/page.tsx index b37b207d3a..f55f697396 100644 --- a/examples/coagents-research-canvas/ui/src/app/page.tsx +++ b/examples/coagents-research-canvas/ui/src/app/page.tsx @@ -7,7 +7,6 @@ import { useModelSelectorContext, } from "@/lib/model-selector-provider"; import { ModelSelector } from "@/components/ModelSelector"; -import { useSearchParams } from "next/navigation"; export default function ModelSelectorWrapper() { return ( @@ -21,22 +20,12 @@ export default function ModelSelectorWrapper() { function Home() { const { agent, lgcDeploymentUrl } = useModelSelectorContext(); - const searchParams = useSearchParams(); - - const runtimeUrl = searchParams.get("runtimeUrl") - ? (searchParams.get("runtimeUrl") as string) - : `/api/copilotkit?lgcDeploymentUrl=${lgcDeploymentUrl ?? ""}`; - - const publicApiKey = searchParams.get("publicApiKey"); - const copilotKitProps: Partial> = { - runtimeUrl, - publicApiKey: publicApiKey || undefined, - showDevConsole: false, - agent, - }; - return ( - +
); diff --git a/examples/coagents-routing/agent-js/.gitignore b/examples/coagents-routing/agent-js/.gitignore index d44ec5787e..f351710520 100644 --- a/examples/coagents-routing/agent-js/.gitignore +++ b/examples/coagents-routing/agent-js/.gitignore @@ -3,6 +3,3 @@ __pycache__/ *.pyc .env .vercel - -# LangGraph API -.langgraph_api diff --git a/examples/coagents-routing/agent/my_agent/demo.py b/examples/coagents-routing/agent/my_agent/demo.py index 7d768a8eb4..34d2246daa 100644 --- a/examples/coagents-routing/agent/my_agent/demo.py +++ b/examples/coagents-routing/agent/my_agent/demo.py @@ -62,6 +62,7 @@ def health(): """Health check.""" return {"status": "ok"} + def main(): """Run the uvicorn server.""" port = int(os.getenv("PORT", "8000")) diff --git a/examples/coagents-routing/ui/src/app/api/copilotkit/route.ts b/examples/coagents-routing/ui/src/app/api/copilotkit/route.ts index 33cb45f994..904a405e14 100644 --- a/examples/coagents-routing/ui/src/app/api/copilotkit/route.ts +++ b/examples/coagents-routing/ui/src/app/api/copilotkit/route.ts @@ -10,7 +10,7 @@ import OpenAI from "openai"; const openai = new OpenAI(); const serviceAdapter = new OpenAIAdapter({ openai } as any); -const langsmithApiKey = process.env.LANGSMITH_API_KEY as string || ""; +const langsmithApiKey = process.env.LANGSMITH_API_KEY as string; export const POST = async (req: NextRequest) => { const searchParams = req.nextUrl.searchParams; diff --git a/examples/coagents-routing/ui/src/app/layout.tsx b/examples/coagents-routing/ui/src/app/layout.tsx index ad92f5d690..3314e4780a 100644 --- a/examples/coagents-routing/ui/src/app/layout.tsx +++ b/examples/coagents-routing/ui/src/app/layout.tsx @@ -1,7 +1,7 @@ import type { Metadata } from "next"; import { Inter } from "next/font/google"; import "./globals.css"; -import { Suspense } from "react"; + const inter = Inter({ subsets: ["latin"] }); export const metadata: Metadata = { @@ -16,9 +16,7 @@ export default function RootLayout({ }>) { return ( - - Loading...}>{children} - + {children} ); } diff --git a/examples/coagents-routing/ui/src/app/page.tsx b/examples/coagents-routing/ui/src/app/page.tsx index 58a5e8a136..1a968ec8d2 100644 --- a/examples/coagents-routing/ui/src/app/page.tsx +++ b/examples/coagents-routing/ui/src/app/page.tsx @@ -16,7 +16,6 @@ import { } from "./lib/model-selector-provider"; import { ModelSelector } from "./components/ModelSelector"; import { MessageRole, TextMessage } from "@copilotkit/runtime-client-gql"; -import { useSearchParams } from "next/navigation"; export default function ModelSelectorWrapper() { return ( @@ -30,21 +29,10 @@ export default function ModelSelectorWrapper() { function Home() { const { lgcDeploymentUrl } = useModelSelectorContext(); - const searchParams = useSearchParams(); - - const runtimeUrl = searchParams.get("runtimeUrl") - ? (searchParams.get("runtimeUrl") as string) - : `/api/copilotkit?lgcDeploymentUrl=${lgcDeploymentUrl ?? ""}`; - - const publicApiKey = searchParams.get("publicApiKey"); - const copilotKitProps: Partial> = { - runtimeUrl, - publicApiKey: publicApiKey || undefined, - showDevConsole: false, - }; - return ( - +
diff --git a/examples/coagents-shared-state/agent/translate_agent/demo.py b/examples/coagents-shared-state/agent/translate_agent/demo.py index 1ad144cafa..604aaef1ea 100644 --- a/examples/coagents-shared-state/agent/translate_agent/demo.py +++ b/examples/coagents-shared-state/agent/translate_agent/demo.py @@ -24,12 +24,6 @@ sdk = CopilotKitRemoteEndpoint( add_fastapi_endpoint(app, sdk, "/copilotkit") -# add new route for health check -@app.get("/health") -def health(): - """Health check.""" - return {"status": "ok"} - def main(): """Run the uvicorn server.""" port = int(os.getenv("PORT", "8000")) diff --git a/examples/coagents-starter/agent-py/sample_agent/demo.py b/examples/coagents-starter/agent-py/sample_agent/demo.py index 3f6122d456..856d0a72b6 100644 --- a/examples/coagents-starter/agent-py/sample_agent/demo.py +++ b/examples/coagents-starter/agent-py/sample_agent/demo.py @@ -26,12 +26,6 @@ sdk = CopilotKitRemoteEndpoint( add_fastapi_endpoint(app, sdk, "/copilotkit") -# add new route for health check -@app.get("/health") -def health(): - """Health check.""" - return {"status": "ok"} - def main(): """Run the uvicorn server.""" port = int(os.getenv("PORT", "8000")) diff --git a/examples/coagents-travel/agent/travel/demo.py b/examples/coagents-travel/agent/travel/demo.py index 22e440ec05..487b819e0b 100644 --- a/examples/coagents-travel/agent/travel/demo.py +++ b/examples/coagents-travel/agent/travel/demo.py @@ -24,12 +24,6 @@ sdk = CopilotKitRemoteEndpoint( add_fastapi_endpoint(app, sdk, "/copilotkit") -# add new route for health check -@app.get("/health") -def health(): - """Health check.""" - return {"status": "ok"} - def main(): """Run the uvicorn server.""" port = int(os.getenv("PORT", "8000")) diff --git a/examples/coagents-travel/ui/app/api/copilotkit/route.ts b/examples/coagents-travel/ui/app/api/copilotkit/route.ts index 9bda0b7c4d..53f523256e 100644 --- a/examples/coagents-travel/ui/app/api/copilotkit/route.ts +++ b/examples/coagents-travel/ui/app/api/copilotkit/route.ts @@ -10,7 +10,7 @@ import OpenAI from "openai"; const openai = new OpenAI(); const llmAdapter = new OpenAIAdapter({ openai } as any); -const langsmithApiKey = process.env.LANGSMITH_API_KEY as string || ""; +const langsmithApiKey = process.env.LANGSMITH_API_KEY as string; export const POST = async (req: NextRequest) => { const searchParams = req.nextUrl.searchParams; diff --git a/examples/coagents-wait-user-input/agent/weather_agent/demo.py b/examples/coagents-wait-user-input/agent/weather_agent/demo.py index ad4b26e2ea..c90fbd44c7 100644 --- a/examples/coagents-wait-user-input/agent/weather_agent/demo.py +++ b/examples/coagents-wait-user-input/agent/weather_agent/demo.py @@ -24,12 +24,6 @@ sdk = CopilotKitRemoteEndpoint( add_fastapi_endpoint(app, sdk, "/copilotkit") -# add new route for health check -@app.get("/health") -def health(): - """Health check.""" - return {"status": "ok"} - def main(): """Run the uvicorn server.""" port = int(os.getenv("PORT", "8000")) diff --git a/examples/e2e/.gitignore b/examples/e2e/.gitignore index 92627d1dbf..8c9cb319b3 100644 --- a/examples/e2e/.gitignore +++ b/examples/e2e/.gitignore @@ -4,5 +4,4 @@ node_modules/ /blob-report/ /playwright/.cache/ app-configs.json -test-config.json .env \ No newline at end of file diff --git a/examples/e2e/lib/config-helper.ts b/examples/e2e/lib/config-helper.ts index 27f3bea0a0..060308b322 100644 --- a/examples/e2e/lib/config-helper.ts +++ b/examples/e2e/lib/config-helper.ts @@ -1,8 +1,5 @@ // lib/config-helper.ts -import configs from "../test-config.json"; -import dotenv from "dotenv"; -import path from "path"; -dotenv.config({ path: path.resolve(__dirname, "../.env") }); +import configs from "../app-configs.json"; // Project name constants with type safety export const PROJECT_NAMES = { @@ -34,6 +31,7 @@ export interface TestVariant { isCloud?: boolean; } + export type TestVariants = TestVariant[]; /** @@ -88,7 +86,7 @@ export const appendLGCVariants = (config: ConfigItem, variants: any[]) => { const newVariants = variants.map((variant) => { return { ...variant, - name: `${variant.name} (LGC Python in-memory)`, + name: `${variant.name} (LGC Python)`, queryParams: `${variant.queryParams}&lgcDeploymentUrl=${config.lgcPythonDeploymentUrl}`, }; }); @@ -100,7 +98,7 @@ export const appendLGCVariants = (config: ConfigItem, variants: any[]) => { const newVariants = variants.map((variant) => { return { ...variant, - name: `${variant.name} (LGC JS in-memory)`, + name: `${variant.name} (LGC JS)`, queryParams: `${variant.queryParams}&lgcDeploymentUrl=${config.lgcJSDeploymentUrl}`, }; }); @@ -110,31 +108,3 @@ export const appendLGCVariants = (config: ConfigItem, variants: any[]) => { return appendedVariants; }; - -export function getCopilotCloudVariants() { - const variants: TestVariants = []; - - if ( - process.env.COPILOT_CLOUD_PROD_RUNTIME_URL && - process.env.COPILOT_CLOUD_PROD_PUBLIC_API_KEY - ) { - variants.push({ - name: "Copilot Cloud (Production)", - queryParams: `?runtimeUrl=${process.env.COPILOT_CLOUD_PROD_RUNTIME_URL}&publicApiKey=${process.env.COPILOT_CLOUD_PROD_PUBLIC_API_KEY}`, - isCloud: true, - }); - } - - if ( - process.env.COPILOT_CLOUD_STAGING_RUNTIME_URL && - process.env.COPILOT_CLOUD_STAGING_PUBLIC_API_KEY - ) { - variants.push({ - name: "Copilot Cloud (Staging)", - queryParams: `?runtimeUrl=${process.env.COPILOT_CLOUD_STAGING_RUNTIME_URL}&publicApiKey=${process.env.COPILOT_CLOUD_STAGING_PUBLIC_API_KEY}`, - isCloud: true, - }); - } - - return variants; -} diff --git a/examples/e2e/playwright.config.ts b/examples/e2e/playwright.config.ts index 560f1c1f82..981f947bb6 100644 --- a/examples/e2e/playwright.config.ts +++ b/examples/e2e/playwright.config.ts @@ -50,4 +50,4 @@ export default defineConfig({ use: { ...devices["Desktop Chrome"] }, }, ], -}); +}); \ No newline at end of file diff --git a/examples/e2e/tests/coagents-canvas-researcher-demo.spec.ts b/examples/e2e/tests/coagents-canvas-researcher-demo.spec.ts index 70c753ee7b..fb00f37a6d 100644 --- a/examples/e2e/tests/coagents-canvas-researcher-demo.spec.ts +++ b/examples/e2e/tests/coagents-canvas-researcher-demo.spec.ts @@ -134,4 +134,4 @@ Object.entries(groupedConfigs).forEach(([projectName, descriptions]) => { }); }); }); -}); +}); \ No newline at end of file diff --git a/examples/e2e/tests/coagents-qa-native-demo.spec.ts b/examples/e2e/tests/coagents-qa-native-demo.spec.ts index 93681e0540..ff253ca506 100644 --- a/examples/e2e/tests/coagents-qa-native-demo.spec.ts +++ b/examples/e2e/tests/coagents-qa-native-demo.spec.ts @@ -95,4 +95,4 @@ Object.entries(groupedConfigs).forEach(([projectName, descriptions]) => { }); }); }); -}); +}); \ No newline at end of file diff --git a/examples/e2e/tests/coagents-qa-text-demo.spec.ts b/examples/e2e/tests/coagents-qa-text-demo.spec.ts index e59253b7b9..783c0a6110 100644 --- a/examples/e2e/tests/coagents-qa-text-demo.spec.ts +++ b/examples/e2e/tests/coagents-qa-text-demo.spec.ts @@ -107,4 +107,4 @@ Object.entries(groupedConfigs).forEach(([projectName, descriptions]) => { }); }); }); -}); +}); \ No newline at end of file diff --git a/examples/e2e/tests/coagents-routing-demo.spec.ts b/examples/e2e/tests/coagents-routing-demo.spec.ts index 31fabebee5..fcc691ab55 100644 --- a/examples/e2e/tests/coagents-routing-demo.spec.ts +++ b/examples/e2e/tests/coagents-routing-demo.spec.ts @@ -126,4 +126,4 @@ Object.entries(groupedConfigs).forEach(([projectName, descriptions]) => { }); }); }); -}); +}); \ No newline at end of file diff --git a/examples/e2e/tests/next-openai.spec.ts b/examples/e2e/tests/next-openai.spec.ts index 7a781ff31c..99dcd34a42 100644 --- a/examples/e2e/tests/next-openai.spec.ts +++ b/examples/e2e/tests/next-openai.spec.ts @@ -212,4 +212,4 @@ Object.entries(groupedConfigs).forEach(([projectName, descriptions]) => { }); }); }); -}); +}); \ No newline at end of file diff --git a/examples/helmfile/.gitignore b/examples/helmfile/.gitignore deleted file mode 100644 index 52d341d1c1..0000000000 --- a/examples/helmfile/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -preview-comment.md -inactive-pull-requests.json -override-values.yaml \ No newline at end of file diff --git a/examples/helmfile/charts/example-app/.helmignore b/examples/helmfile/charts/example-app/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/examples/helmfile/charts/example-app/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/examples/helmfile/charts/example-app/Chart.yaml b/examples/helmfile/charts/example-app/Chart.yaml deleted file mode 100644 index ca631c136f..0000000000 --- a/examples/helmfile/charts/example-app/Chart.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: v2 -name: example-app -description: A Helm chart for Kubernetes - -# A chart can be either an 'application' or a 'library' chart. -# -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. -type: application - -# This is the chart version. This version number should be incremented each time you make changes -# to the chart and its templates, including the app version. -# Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.0 - -# This is the version number of the application being deployed. This version number should be -# incremented each time you make changes to the application. Versions are not expected to -# follow Semantic Versioning. They should reflect the version the application is using. -# It is recommended to use it with quotes. -appVersion: "1.16.0" diff --git a/examples/helmfile/charts/example-app/templates/NOTES.txt b/examples/helmfile/charts/example-app/templates/NOTES.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/examples/helmfile/charts/example-app/templates/_helpers.tpl b/examples/helmfile/charts/example-app/templates/_helpers.tpl deleted file mode 100644 index 8340d06f75..0000000000 --- a/examples/helmfile/charts/example-app/templates/_helpers.tpl +++ /dev/null @@ -1,52 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "example-app.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "example-app.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "example-app.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Validate that environment is set -*/}} -{{- define "example-app.environment" -}} -{{- if not .Values.environment }} -{{- fail "environment must be set in values" }} -{{- end }} -{{- printf "%s" .Values.environment }} -{{- end }} - -{{/* -Convert JSON string to Kubernetes environment variables -*/}} -{{- define "example-app.jsonToEnv" -}} -{{- $json := . -}} -{{- range $key, $value := $json }} -- name: {{ $key }} - value: {{ $value | quote }} -{{- end }} -{{- end -}} diff --git a/examples/helmfile/charts/example-app/templates/ingress.yaml b/examples/helmfile/charts/example-app/templates/ingress.yaml deleted file mode 100644 index 51e213da1a..0000000000 --- a/examples/helmfile/charts/example-app/templates/ingress.yaml +++ /dev/null @@ -1,35 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: "{{ .Values.environment }}-{{ .Release.Name }}-knative-ingress" - generation: 1 - namespace: knative-serving - annotations: - alb.ingress.kubernetes.io/group.name: "copilotkit-previews" - alb.ingress.kubernetes.io/group.order: "1" - alb.ingress.kubernetes.io/target-type: "ip" - alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]' - alb.ingress.kubernetes.io/ssl-redirect: '443' -spec: - ingressClassName: alb - rules: - {{- $root := . }} - {{- range $deploymentIndex, $deployment := .Values.deployments }} - - host: "{{ $deployment.name }}-prv-{{ $root.Values.environment }}.copilotkit-previews.com" - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: kourier - port: - number: 80 - {{- end }} - - # tls: - # - hosts: - # {{- $root := . }} - # {{- range $deploymentIndex, $deployment := .Values.deployments }} - # - "{{ $deployment.name }}-{{ include "example-app.environment" $root }}.demos.devcopilotkit.com" - # {{- end }} diff --git a/examples/helmfile/charts/example-app/templates/kservice.yaml b/examples/helmfile/charts/example-app/templates/kservice.yaml deleted file mode 100644 index 060be641f3..0000000000 --- a/examples/helmfile/charts/example-app/templates/kservice.yaml +++ /dev/null @@ -1,71 +0,0 @@ -{{- $root := . }} -{{- range $deploymentIndex, $deployment := .Values.deployments }} ---- -apiVersion: serving.knative.dev/v1 -kind: Service -metadata: - name: "{{ $deployment.name }}" -spec: - template: - metadata: - annotations: - deployment.knative.dev/progress-deadline: "60s" - spec: - tolerations: - - key: "dedicated" - operator: "Equal" - value: "e2e" - effect: "NoSchedule" - nodeSelector: - purpose: e2e - containers: - - name: {{ $deployment.name }} - image: "{{ $deployment.image.repository }}-{{ $deployment.image.tag }}" - imagePullPolicy: {{ $deployment.image.pullPolicy | default "IfNotPresent" }} - {{- if $deployment.command }} - command: - {{- toYaml $deployment.command | nindent 12 }} - {{- end }} - # resources: - # {{- if $deployment.type | eq "ui" }} - # requests: - # cpu: "512m" - # memory: "512Mi" - # limits: - # cpu: "512m" - # memory: "512Mi" - # {{- end }} - # {{- if $deployment.type | eq "agent" }} - # requests: - # cpu: "512m" - # memory: "512Mi" - # limits: - # cpu: "512m" - # memory: "512Mi" - # {{- end }} - env: - {{- if $deployment.config.secretsJson }} - {{- include "example-app.jsonToEnv" $deployment.config.secretsJson | nindent 12 }} - {{- end }} - {{- if $deployment.config.env }} - {{- toYaml $deployment.config.env | nindent 12 }} - {{- end }} - ports: - - containerPort: {{ $deployment.port }} - {{- with $deployment.livenessProbe }} - livenessProbe: - {{ toYaml . | nindent 12 }} - readinessProbe: - {{ toYaml . | nindent 12 }} - {{- end }} ---- -# apiVersion: serving.knative.dev/v1beta1 -# kind: DomainMapping -# metadata: -# name: "{{ $deployment.name }}-{{ include "example-app.environment" $root }}.copilotkit-previews.com" -# spec: -# ref: -# name: "{{ $deployment.name }}" -# kind: Service -# apiVersion: serving.knative.dev/v1 -{{- end }} diff --git a/examples/helmfile/charts/example-app/templates/outputs-configmap.yaml b/examples/helmfile/charts/example-app/templates/outputs-configmap.yaml deleted file mode 100644 index 2c662c8a37..0000000000 --- a/examples/helmfile/charts/example-app/templates/outputs-configmap.yaml +++ /dev/null @@ -1,21 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ .Values.app.name }}-outputs -data: - app.name: {{ .Values.app.name }} - deployments: | - [ - {{- $root := . }} - {{- range $deploymentIndex, $deployment := .Values.deployments }} - { - "deployment": "{{ $deployment.name }}", - "url": "https://{{ $deployment.name }}-prv-{{ $root.Values.environment }}.copilotkit-previews.com", - {{- if $deployment.outputs }} - "outputs": {{ $deployment.outputs | toJson }} - {{- else }} - "outputs": {} - {{- end }} - }{{- if ne $deploymentIndex (sub (len $root.Values.deployments) 1) }}, {{- end }} - {{- end }} - ] \ No newline at end of file diff --git a/examples/helmfile/charts/example-app/templates/serviceaccount.yaml b/examples/helmfile/charts/example-app/templates/serviceaccount.yaml deleted file mode 100644 index fe7a3e69e1..0000000000 --- a/examples/helmfile/charts/example-app/templates/serviceaccount.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if and .Values.serviceAccount (and .Values.serviceAccount.create true) -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "example-app.serviceAccountName" . }} - labels: - {{- include "example-app.labels" . | nindent 4 }} - {{- with .Values.serviceAccount.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -{{- end }} diff --git a/examples/helmfile/charts/examples-shared/.helmignore b/examples/helmfile/charts/examples-shared/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/examples/helmfile/charts/examples-shared/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/examples/helmfile/charts/examples-shared/Chart.yaml b/examples/helmfile/charts/examples-shared/Chart.yaml deleted file mode 100644 index 9e6f3cee4e..0000000000 --- a/examples/helmfile/charts/examples-shared/Chart.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: v2 -name: examples-shared -description: A Helm chart for Kubernetes - -# A chart can be either an 'application' or a 'library' chart. -# -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. -type: application - -# This is the chart version. This version number should be incremented each time you make changes -# to the chart and its templates, including the app version. -# Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.0 - -# This is the version number of the application being deployed. This version number should be -# incremented each time you make changes to the application. Versions are not expected to -# follow Semantic Versioning. They should reflect the version the application is using. -# It is recommended to use it with quotes. -appVersion: "1.16.0" diff --git a/examples/helmfile/charts/examples-shared/templates/_helpers.tpl b/examples/helmfile/charts/examples-shared/templates/_helpers.tpl deleted file mode 100644 index c7e8c6e0f9..0000000000 --- a/examples/helmfile/charts/examples-shared/templates/_helpers.tpl +++ /dev/null @@ -1,62 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "shared.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "shared.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "shared.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "shared.labels" -}} -helm.sh/chart: {{ include "shared.chart" . }} -{{ include "shared.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "shared.selectorLabels" -}} -app.kubernetes.io/name: {{ include "shared.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Create the name of the service account to use -*/}} -{{- define "shared.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "shared.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} diff --git a/examples/helmfile/charts/examples-shared/templates/ingress.yaml b/examples/helmfile/charts/examples-shared/templates/ingress.yaml deleted file mode 100644 index 2a8bf5d0e6..0000000000 --- a/examples/helmfile/charts/examples-shared/templates/ingress.yaml +++ /dev/null @@ -1,38 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: "{{ .Release.Name }}-shared-ingress" - annotations: - external-dns.alpha.kubernetes.io/hostname: '*.{{ .Values.ingress.host }}' - alb.ingress.kubernetes.io/load-balancer-name: "{{ .Values.environment }}-examples-shared-alb" - alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]' - alb.ingress.kubernetes.io/scheme: "internet-facing" - alb.ingress.kubernetes.io/target-type: "ip" - alb.ingress.kubernetes.io/ssl-redirect: '443' - service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http" - service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https" - service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "{{ .Values.ingress.acmCertificateArn }}" - alb.ingress.kubernetes.io/group.name: "{{ .Values.environment }}-shared-demos" -spec: - ingressClassName: alb - rules: - - host: "{{ .Values.environment }}-placeholder.demos.devcopilotkit.com" - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: nginx-placeholder-service - port: - number: 80 - - path: / - pathType: ImplementationSpecific - backend: - service: - name: ssl-redirect - port: - name: use-annotation - tls: - - hosts: - - "{{ .Values.environment }}-placeholder.demos.devcopilotkit.com" \ No newline at end of file diff --git a/examples/helmfile/charts/examples-shared/templates/nginx-placeholder-deployment.yaml b/examples/helmfile/charts/examples-shared/templates/nginx-placeholder-deployment.yaml deleted file mode 100644 index 0644588bda..0000000000 --- a/examples/helmfile/charts/examples-shared/templates/nginx-placeholder-deployment.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: nginx-placeholder -spec: - replicas: 1 - selector: - matchLabels: - app: nginx-placeholder - template: - metadata: - labels: - app: nginx-placeholder - spec: - containers: - - name: nginx-placeholder - image: nginx:latest - ports: - - containerPort: 80 diff --git a/examples/helmfile/charts/examples-shared/templates/nginx-placeholder-service.yaml b/examples/helmfile/charts/examples-shared/templates/nginx-placeholder-service.yaml deleted file mode 100644 index bfd4c06699..0000000000 --- a/examples/helmfile/charts/examples-shared/templates/nginx-placeholder-service.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: nginx-placeholder-service -spec: - selector: - app: nginx-placeholder - ports: - - protocol: TCP - port: 80 # The port exposed by the service - targetPort: 80 # The port exposed by the nginx container - type: ClusterIP diff --git a/examples/helmfile/charts/examples-shared/templates/serviceaccount.yaml b/examples/helmfile/charts/examples-shared/templates/serviceaccount.yaml deleted file mode 100644 index caa13a5e95..0000000000 --- a/examples/helmfile/charts/examples-shared/templates/serviceaccount.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if .Values.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "shared.serviceAccountName" . }} - labels: - {{- include "shared.labels" . | nindent 4 }} - {{- with .Values.serviceAccount.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -{{- end }} diff --git a/examples/helmfile/charts/examples-shared/values.yaml.gotmpl b/examples/helmfile/charts/examples-shared/values.yaml.gotmpl deleted file mode 100644 index 8ea59ad90b..0000000000 --- a/examples/helmfile/charts/examples-shared/values.yaml.gotmpl +++ /dev/null @@ -1,13 +0,0 @@ -environment: {{ .Values.environment }} - -ingress: - host: {{ .Values.ingressGroup.host }} - acmCertificateArn: {{ .Values.ingressGroup.acmCertificateArn }} - -nameOverride: "" -fullnameOverride: "" - -serviceAccount: - create: true - annotations: {} - name: "" diff --git a/examples/helmfile/destroy-inactive-preview-environments.js b/examples/helmfile/destroy-inactive-preview-environments.js index 11f48e5ac1..5996d2d6cf 100644 --- a/examples/helmfile/destroy-inactive-preview-environments.js +++ b/examples/helmfile/destroy-inactive-preview-environments.js @@ -7,9 +7,9 @@ async function main() { ); const previewReleases = releaseList - .filter((release) => release.namespace.startsWith("prv")) + .filter((release) => release.namespace.startsWith("copilotkit-examples")) .filter((release) => release.name === "next-openai") - .filter((release) => release.namespace !== "prv-main"); + .filter((release) => release.namespace !== "copilotkit-examples-main"); const inactiveReleases = previewReleases.filter( (release) => { @@ -27,7 +27,7 @@ async function main() { const pullRequestNumbers = []; for (const release of inactiveReleases) { - const environment = release.namespace.replace("prv-", ""); + const environment = release.namespace.replace("copilotkit-examples-", ""); const pullRequestNumber = environment.replace("pr-", ""); const namespace = release.namespace; console.log(`Deleting environment ${environment} in namespace ${namespace}`); diff --git a/examples/helmfile/environments/default.yaml b/examples/helmfile/environments/default.yaml deleted file mode 100644 index 318c2e16bb..0000000000 --- a/examples/helmfile/environments/default.yaml +++ /dev/null @@ -1,3 +0,0 @@ -ingressGroup: - host: "demos.devcopilotkit.com" - acmCertificateArn: "arn:aws:acm:us-east-1:058264219587:certificate/aac8e4f8-7c56-41f3-b9ca-8eae61944717" \ No newline at end of file diff --git a/examples/helmfile/generate-table.js b/examples/helmfile/generate-table.js deleted file mode 100644 index e6e07ccd9b..0000000000 --- a/examples/helmfile/generate-table.js +++ /dev/null @@ -1,124 +0,0 @@ -const fs = require("fs"); -const path = require("path"); -const json2md = require("json2md"); -const childProcess = require("child_process"); - -const ENVIRONMENT = process.env.ENVIRONMENT; -const NAMESPACE = process.env.NAMESPACE; - -if (!ENVIRONMENT) { - throw new Error("ENVIRONMENT is not set"); -} - -if (!NAMESPACE) { - throw new Error("NAMESPACE is not set"); -} - -console.log("ENVIRONMENT", ENVIRONMENT); -console.log("Getting release list") - -const testConfigs = {}; - -const releaseList = JSON.parse(childProcess.execSync( - `helmfile --state-values-set environment=${ENVIRONMENT},namespace=${NAMESPACE} --selector "name!=examples-shared" list --output json` -).toString()); - -function getReleaseDeployments(releaseName) { - const outputs = JSON.parse(childProcess.execSync( - `kubectl get configmap -n ${NAMESPACE} ${releaseName}-outputs -o jsonpath='{.data}' | jq` - ).toString()); - - const deployments = JSON.parse(outputs.deployments); - return deployments; -} - -const tableRows = []; - -for (const release of releaseList) { - const releaseName = release.name; - - let deployments = []; - - try { - deployments = getReleaseDeployments(releaseName); - } catch (error) { - continue; - } - - const row = { - name: releaseName, - previews: [], - }; - - const ui = deployments.find((deployment) => deployment.outputs.type === "ui"); - - if (ui) { - row.previews.push({ - label: "Preview", - url: ui.url - }); - - testConfigs[releaseName] = { - url: ui.url, - description: ui.outputs.description, - projectName: releaseName, - }; - } else { - throw new Error(`UI deployment not found for ${releaseName}`); - } - - const agentLgcPython = deployments.find((deployment) => deployment.outputs.type === "agent-lgc-python"); - - if (agentLgcPython) { - testConfigs[releaseName].lgcPythonDeploymentUrl = agentLgcPython.url; - - row.previews.push({ - label: "Preview (LangGraph Platform Python)", - url: `${ui.url}?lgcDeploymentUrl=${agentLgcPython.url}` - }); - } - - const agentLgcJs = deployments.find((deployment) => deployment.outputs.type === "agent-lgc-js"); - - if (agentLgcJs) { - testConfigs[releaseName].lgcJSDeploymentUrl = agentLgcJs.url; - - row.previews.push({ - label: "Preview (LangGraph Platform JS)", - url: `${ui.url}?lgcDeploymentUrl=${agentLgcJs.url}` - }); - } - - tableRows.push(row); -} - -function generateTable() { - const structure = []; - structure.push({ h1: "Previews" }); - - structure.push({ - p: `**Commit SHA:** ${process.env.GITHUB_SHA?.substring(0, 7)}`, - }); - - const rows = tableRows.map((release) => { - return { - Name: release.name, - Previews: release.previews.map((preview) => `[${preview.label}](${preview.url})`).join(" • "), - }; - }); - - structure.push({ - table: { - headers: ["Name", "Previews"], - rows, - }, - }); - - const md = json2md(structure); - console.log(md); - fs.writeFileSync(path.resolve(__dirname, "./preview-comment.md"), md); - - fs.writeFileSync(path.resolve(__dirname, "../e2e/test-config.json"), JSON.stringify(testConfigs, null, 2)); -} - -generateTable(); diff --git a/examples/helmfile/helmfile.yaml b/examples/helmfile/helmfile.yaml deleted file mode 100644 index c5e592c862..0000000000 --- a/examples/helmfile/helmfile.yaml +++ /dev/null @@ -1,67 +0,0 @@ -environments: - default: - values: - - ./environments/default.yaml ---- -helmDefaults: - wait: true - timeout: 300 ---- -releases: - - name: examples-shared - chart: ./charts/examples-shared - namespace: {{ .Values.namespace }} - values: [./charts/examples-shared/values.yaml.gotmpl] - labels: - metadata.copilotkit.preview: {{ hasPrefix "pr-" .Values.environment | quote }} - metadata.copilotkit.updated-at: {{ dateInZone "2006-01-02T15:04:05" (now) "UTC" }} - - - name: 'coagents-research-canvas' - chart: ./charts/example-app - installed: true - namespace: {{ .Values.namespace }} - values: [./values/coagents-research-canvas.yaml.gotmpl] - needs: [examples-shared] - labels: - metadata.copilotkit.preview: {{ hasPrefix "pr-" .Values.environment | quote }} - metadata.copilotkit.updated-at: {{ dateInZone "2006-01-02T15:04:05" (now) "UTC" }} - - - name: 'coagents-routing' - chart: ./charts/example-app - installed: true - namespace: {{ .Values.namespace }} - values: [./values/coagents-routing.yaml.gotmpl] - needs: [examples-shared] - labels: - metadata.copilotkit.preview: {{ hasPrefix "pr-" .Values.environment | quote }} - metadata.copilotkit.updated-at: {{ dateInZone "2006-01-02T15:04:05" (now) "UTC" }} - - - name: 'coagents-qa-text' - chart: ./charts/example-app - installed: true - namespace: {{ .Values.namespace }} - values: [./values/coagents-qa-text.yaml.gotmpl] - needs: [examples-shared] - labels: - metadata.copilotkit.preview: {{ hasPrefix "pr-" .Values.environment | quote }} - metadata.copilotkit.updated-at: {{ dateInZone "2006-01-02T15:04:05" (now) "UTC" }} - - - name: 'coagents-qa-native' - chart: ./charts/example-app - installed: true - namespace: {{ .Values.namespace }} - values: [./values/coagents-qa-native.yaml.gotmpl] - needs: [examples-shared] - labels: - metadata.copilotkit.preview: {{ hasPrefix "pr-" .Values.environment | quote }} - metadata.copilotkit.updated-at: {{ dateInZone "2006-01-02T15:04:05" (now) "UTC" }} - - - name: 'next-openai' - chart: ./charts/example-app - installed: true - namespace: {{ .Values.namespace }} - values: [./values/next-openai.yaml.gotmpl] - needs: [examples-shared] - labels: - metadata.copilotkit.preview: {{ hasPrefix "pr-" .Values.environment | quote }} - metadata.copilotkit.updated-at: {{ dateInZone "2006-01-02T15:04:05" (now) "UTC" }} \ No newline at end of file diff --git a/examples/helmfile/package.json b/examples/helmfile/package.json deleted file mode 100644 index 8898c10ef2..0000000000 --- a/examples/helmfile/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "helmfile", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": {}, - "author": "", - "license": "ISC", - "devDependencies": { - "json2md": "^2.0.1" - } -} diff --git a/examples/helmfile/pnpm-lock.yaml b/examples/helmfile/pnpm-lock.yaml deleted file mode 100644 index 9385387e3f..0000000000 --- a/examples/helmfile/pnpm-lock.yaml +++ /dev/null @@ -1,29 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - devDependencies: - json2md: - specifier: ^2.0.1 - version: 2.0.1 - -packages: - - indento@1.1.13: - resolution: {integrity: sha512-YZWk3mreBEM7sBPddsiQnW9Z8SGg/gNpFfscJq00HCDS7pxcQWWWMSVKJU7YkTRyDu1Zv2s8zaK8gQWKmCXHlg==} - - json2md@2.0.1: - resolution: {integrity: sha512-VbwmZ83qmUfKBS2pUOHlzNKEZFPBeJSbzEok3trMYyboZUgdHNn1XZfc1uT8UZs1GHCrmRUBXCfqw4YmmQuOhw==} - -snapshots: - - indento@1.1.13: {} - - json2md@2.0.1: - dependencies: - indento: 1.1.13 diff --git a/examples/helmfile/temp.json b/examples/helmfile/temp.json new file mode 100644 index 0000000000..65f20fa0fe --- /dev/null +++ b/examples/helmfile/temp.json @@ -0,0 +1,58 @@ +{ + "apiVersion": "v1", + "kind": "Namespace", + "metadata": { + "creationTimestamp": "2025-02-06T01:27:40Z", + "deletionTimestamp": "2025-02-06T01:29:46Z", + "labels": { + "kubernetes.io/metadata.name": "prv-pr-1312", + "name": "prv-pr-1312" + }, + "name": "prv-pr-1312", + "resourceVersion": "123885782", + "uid": "c2713036-4f0e-4209-805c-981c4af0df4e" + }, + "spec": { + "finalizers": [] + }, + "status": { + "conditions": [ + { + "lastTransitionTime": "2025-02-06T01:29:56Z", + "message": "All resources successfully discovered", + "reason": "ResourcesDiscovered", + "status": "False", + "type": "NamespaceDeletionDiscoveryFailure" + }, + { + "lastTransitionTime": "2025-02-06T01:29:56Z", + "message": "All legacy kube types successfully parsed", + "reason": "ParsedGroupVersions", + "status": "False", + "type": "NamespaceDeletionGroupVersionParsingFailure" + }, + { + "lastTransitionTime": "2025-02-06T01:29:56Z", + "message": "All content successfully deleted, may be waiting on finalization", + "reason": "ContentDeleted", + "status": "False", + "type": "NamespaceDeletionContentFailure" + }, + { + "lastTransitionTime": "2025-02-06T01:29:56Z", + "message": "Some resources are remaining: pods. has 6 resource instances", + "reason": "SomeResourcesRemain", + "status": "True", + "type": "NamespaceContentRemaining" + }, + { + "lastTransitionTime": "2025-02-06T01:32:34Z", + "message": "All content-preserving finalizers finished", + "reason": "ContentHasNoFinalizers", + "status": "False", + "type": "NamespaceFinalizersRemaining" + } + ], + "phase": "Terminating" + } +} diff --git a/examples/helmfile/values/coagents-qa-native.yaml.gotmpl b/examples/helmfile/values/coagents-qa-native.yaml.gotmpl deleted file mode 100644 index 6a4934c548..0000000000 --- a/examples/helmfile/values/coagents-qa-native.yaml.gotmpl +++ /dev/null @@ -1,84 +0,0 @@ -environment: "{{ .Values.environment }}" - -app: - name: coagents-qa-native - -deployments: - - name: coagents-qa-native-ui - type: ui - image: - repository: "058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:coagents-qa-native-ui" - tag: "{{ .Values.globalImageTag }}" - port: 3000 - command: ["npm", "start", "--", "-H", "0.0.0.0", "--port", "3000"] - livenessProbe: - httpGet: - path: / - port: 3000 - config: - secretsJson: {{ fetchSecretValue "ref+awssecrets://demos/coagents-research-canvas/ui/secrets" }} - env: - - name: REMOTE_ACTION_URL - value: "https://coagents-qa-native-agent-fastapi-prv-{{ .Values.environment }}.copilotkit-previews.com/copilotkit" - outputs: - type: ui - dependencies: local - description: "CoAgents QA Native" - - - name: coagents-qa-native-agent-fastapi - type: agent - image: - repository: "058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:coagents-qa-native-agent-python-local-deps" - tag: "{{ .Values.globalImageTag }}" - port: 8000 - livenessProbe: - httpGet: - path: /health - port: 8000 - config: - secretsJson: {{ fetchSecretValue "ref+awssecrets://demos/coagents-research-canvas/agent/secrets" }} - env: - - name: HOST - value: "0.0.0.0" - outputs: - type: agent-fastapi - dependencies: local - - - name: coagents-qa-native-agent-lgc-python - type: agent - image: - repository: "058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:coagents-qa-native-agent-python-local-deps" - tag: "{{ .Values.globalImageTag }}" - port: 8000 - livenessProbe: - httpGet: - path: "/store/items?key=test&namespace=test" - port: 8000 - command: ["/bin/sh", "-c","langgraph dev --no-browser --port=8000 --config=langgraph.json --host=0.0.0.0 --n-jobs-per-worker 1"] - config: - secretsJson: {{ fetchSecretValue "ref+awssecrets://demos/coagents-research-canvas/agent/secrets" }} - env: - - name: HOST - value: "0.0.0.0" - outputs: - type: agent-lgc-python - dependencies: local - - - name: coagents-qa-native-agent-lgc-js - type: agent - image: - repository: "058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:coagents-qa-native-agent-js-remote-deps" - tag: "{{ .Values.globalImageTag }}" - port: 8000 - livenessProbe: - httpGet: - path: "/store/items?key=test&namespace=test" - port: 8000 - config: - secretsJson: {{ fetchSecretValue "ref+awssecrets://demos/coagents-research-canvas/agent/secrets" }} - env: - - name: HOST - value: "0.0.0.0" - outputs: - type: agent-lgc-js - dependencies: remote diff --git a/examples/helmfile/values/coagents-qa-text.yaml.gotmpl b/examples/helmfile/values/coagents-qa-text.yaml.gotmpl deleted file mode 100644 index 48b3b00dc8..0000000000 --- a/examples/helmfile/values/coagents-qa-text.yaml.gotmpl +++ /dev/null @@ -1,86 +0,0 @@ -environment: "{{ .Values.environment }}" - -app: - name: coagents-qa-text - -deployments: - - name: coagents-qa-text-ui - type: ui - image: - repository: "058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:coagents-qa-text-ui" - tag: "{{ .Values.globalImageTag }}" - port: 3000 - command: ["npm", "start", "--", "-H", "0.0.0.0", "--port", "3000"] - livenessProbe: - httpGet: - path: / - port: 3000 - config: - secretsJson: {{ fetchSecretValue "ref+awssecrets://demos/coagents-research-canvas/ui/secrets" }} - env: - - name: REMOTE_ACTION_URL - value: "https://coagents-qa-text-agent-fastapi-prv-{{ .Values.environment }}.copilotkit-previews.com/copilotkit" - outputs: - type: ui - dependencies: local - description: "CoAgents QA Text" - - - name: coagents-qa-text-agent-fastapi - type: agent - image: - repository: "058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:coagents-qa-text-agent-python-local-deps" - tag: "{{ .Values.globalImageTag }}" - port: 8000 - livenessProbe: - httpGet: - path: /health - port: 8000 - initialDelaySeconds: 15 - config: - secretsJson: {{ fetchSecretValue "ref+awssecrets://demos/coagents-research-canvas/agent/secrets" }} - env: - - name: HOST - value: "0.0.0.0" - outputs: - type: agent-fastapi - dependencies: local - - - name: coagents-qa-text-agent-lgc-python - type: agent - image: - repository: "058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:coagents-qa-text-agent-python-local-deps" - tag: "{{ .Values.globalImageTag }}" - port: 8000 - livenessProbe: - httpGet: - path: "/store/items?key=test&namespace=test" - port: 8000 - command: ["/bin/sh", "-c","langgraph dev --no-browser --port=8000 --config=langgraph.json --host=0.0.0.0 --n-jobs-per-worker 1"] - config: - secretsJson: {{ fetchSecretValue "ref+awssecrets://demos/coagents-research-canvas/agent/secrets" }} - env: - - name: HOST - value: "0.0.0.0" - outputs: - type: agent-lgc-python - dependencies: local - - - name: coagents-qa-text-agent-lgc-js - type: agent - image: - repository: "058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:coagents-qa-text-agent-js-remote-deps" - tag: "{{ .Values.globalImageTag }}" - port: 8000 - livenessProbe: - httpGet: - path: "/store/items?key=test&namespace=test" - port: 8000 - config: - secretsJson: {{ fetchSecretValue "ref+awssecrets://demos/coagents-research-canvas/agent/secrets" }} - env: - - name: HOST - value: "0.0.0.0" - outputs: - type: agent-lgc-js - dependencies: remote - diff --git a/examples/helmfile/values/coagents-research-canvas.yaml.gotmpl b/examples/helmfile/values/coagents-research-canvas.yaml.gotmpl deleted file mode 100644 index cabe7b8b18..0000000000 --- a/examples/helmfile/values/coagents-research-canvas.yaml.gotmpl +++ /dev/null @@ -1,84 +0,0 @@ -environment: "{{ .Values.environment }}" - -app: - name: coagents-research-canvas - -deployments: - - name: coagents-research-canvas-ui - type: ui - image: - repository: "058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:coagents-research-canvas-ui" - tag: "{{ .Values.globalImageTag }}" - port: 3000 - command: ["npm", "start", "--", "-H", "0.0.0.0", "--port", "3000"] - livenessProbe: - httpGet: - path: / - port: 3000 - config: - secretsJson: {{ fetchSecretValue "ref+awssecrets://demos/coagents-research-canvas/ui/secrets" }} - env: - - name: REMOTE_ACTION_URL - value: "https://coagents-research-canvas-agent-fastapi-prv-{{ .Values.environment }}.copilotkit-previews.com/copilotkit" - outputs: - type: ui - dependencies: local - description: "CoAgents Research Canvas" - - - name: coagents-research-canvas-agent-fastapi - type: agent - image: - repository: "058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:coagents-research-canvas-agent-python-local-deps" - tag: "{{ .Values.globalImageTag }}" - port: 8000 - livenessProbe: - httpGet: - path: /health - port: 8000 - config: - secretsJson: {{ fetchSecretValue "ref+awssecrets://demos/coagents-research-canvas/agent/secrets" }} - env: - - name: HOST - value: "0.0.0.0" - outputs: - type: agent-fastapi - dependencies: local - - - name: coagents-research-canvas-agent-lgc-python - type: agent - image: - repository: "058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:coagents-research-canvas-agent-python-local-deps" - tag: "{{ .Values.globalImageTag }}" - port: 8000 - livenessProbe: - httpGet: - path: "/store/items?key=test&namespace=test" - port: 8000 - command: ["/bin/sh", "-c","langgraph dev --no-browser --port=8000 --config=langgraph.json --host=0.0.0.0 --n-jobs-per-worker 1"] - config: - secretsJson: {{ fetchSecretValue "ref+awssecrets://demos/coagents-research-canvas/agent/secrets" }} - env: - - name: HOST - value: "0.0.0.0" - outputs: - type: agent-lgc-python - dependencies: local - - - name: coagents-research-canvas-agent-lgc-js - type: agent - image: - repository: "058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:coagents-research-canvas-agent-js-remote-deps" - tag: "{{ .Values.globalImageTag }}" - port: 8000 - livenessProbe: - httpGet: - path: "/store/items?key=test&namespace=test" - port: 8000 - config: - secretsJson: {{ fetchSecretValue "ref+awssecrets://demos/coagents-research-canvas/agent/secrets" }} - env: - - name: HOST - value: "0.0.0.0" - outputs: - type: agent-lgc-js - dependencies: remote diff --git a/examples/helmfile/values/coagents-routing.yaml.gotmpl b/examples/helmfile/values/coagents-routing.yaml.gotmpl deleted file mode 100644 index a93fd7302b..0000000000 --- a/examples/helmfile/values/coagents-routing.yaml.gotmpl +++ /dev/null @@ -1,84 +0,0 @@ -environment: "{{ .Values.environment }}" - -app: - name: coagents-routing - -deployments: - - name: coagents-routing-ui - type: ui - image: - repository: "058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:coagents-routing-ui" - tag: "{{ .Values.globalImageTag }}" - port: 3000 - command: ["npm", "start", "--", "-H", "0.0.0.0", "--port", "3000"] - livenessProbe: - httpGet: - path: / - port: 3000 - config: - secretsJson: {{ fetchSecretValue "ref+awssecrets://demos/coagents-research-canvas/ui/secrets" }} - env: - - name: REMOTE_ACTION_URL - value: "https://coagents-routing-agent-fastapi-prv-{{ .Values.environment }}.copilotkit-previews.com/copilotkit" - outputs: - type: ui - dependencies: local - description: "CoAgents Routing" - - - name: coagents-routing-agent-fastapi - type: agent - image: - repository: "058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:coagents-routing-agent-python-local-deps" - tag: "{{ .Values.globalImageTag }}" - port: 8000 - livenessProbe: - httpGet: - path: /health - port: 8000 - config: - secretsJson: {{ fetchSecretValue "ref+awssecrets://demos/coagents-research-canvas/agent/secrets" }} - env: - - name: HOST - value: "0.0.0.0" - outputs: - type: agent-fastapi - dependencies: local - - - name: coagents-routing-agent-lgc-python - type: agent - image: - repository: "058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:coagents-routing-agent-python-local-deps" - tag: "{{ .Values.globalImageTag }}" - port: 8000 - livenessProbe: - httpGet: - path: "/store/items?key=test&namespace=test" - port: 8000 - command: ["/bin/sh", "-c","langgraph dev --no-browser --port=8000 --config=langgraph.json --host=0.0.0.0 --n-jobs-per-worker 1"] - config: - secretsJson: {{ fetchSecretValue "ref+awssecrets://demos/coagents-research-canvas/agent/secrets" }} - env: - - name: HOST - value: "0.0.0.0" - outputs: - type: agent-lgc-python - dependencies: local - - - name: coagents-routing-agent-lgc-js - type: agent - image: - repository: "058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:coagents-routing-agent-js-remote-deps" - tag: "{{ .Values.globalImageTag }}" - port: 8000 - livenessProbe: - httpGet: - path: "/store/items?key=test&namespace=test" - port: 8000 - config: - secretsJson: {{ fetchSecretValue "ref+awssecrets://demos/coagents-research-canvas/agent/secrets" }} - env: - - name: HOST - value: "0.0.0.0" - outputs: - type: agent-lgc-js - dependencies: remote diff --git a/examples/helmfile/values/next-openai.yaml.gotmpl b/examples/helmfile/values/next-openai.yaml.gotmpl deleted file mode 100644 index 555302508b..0000000000 --- a/examples/helmfile/values/next-openai.yaml.gotmpl +++ /dev/null @@ -1,23 +0,0 @@ -environment: "{{ .Values.environment }}" - -app: - name: next-openai - -deployments: - - name: next-openai - type: ui - image: - repository: "058264219587.dkr.ecr.us-east-1.amazonaws.com/coagents:next-openai" - tag: "{{ .Values.globalImageTag }}" - port: 3000 - command: ["npm", "run", "example-start", "--", "-H", "0.0.0.0", "--port", "3000"] - livenessProbe: - httpGet: - path: / - port: 3000 - config: - secretsJson: {{ fetchSecretValue "ref+awssecrets://demos/next-openai/secrets" }} - outputs: - type: ui - dependencies: local - description: "Next OpenAI" \ No newline at end of file diff --git a/infra/.gitignore b/infra/.gitignore new file mode 100644 index 0000000000..f1b810ff89 --- /dev/null +++ b/infra/.gitignore @@ -0,0 +1,12 @@ +*.js +!jest.config.js +*.d.ts +node_modules + +# CDK asset staging directory +.cdk.staging +cdk.out +preview-comment.md +cdk_outputs.json +cdk_outputs_processed.json +.env.test \ No newline at end of file diff --git a/infra/.npmignore b/infra/.npmignore new file mode 100644 index 0000000000..c1d6d45dcf --- /dev/null +++ b/infra/.npmignore @@ -0,0 +1,6 @@ +*.ts +!*.d.ts + +# CDK asset staging directory +.cdk.staging +cdk.out diff --git a/infra/README.md b/infra/README.md new file mode 100644 index 0000000000..9315fe5b9f --- /dev/null +++ b/infra/README.md @@ -0,0 +1,14 @@ +# Welcome to your CDK TypeScript project + +This is a blank project for CDK development with TypeScript. + +The `cdk.json` file tells the CDK Toolkit how to execute your app. + +## Useful commands + +* `npm run build` compile typescript to js +* `npm run watch` watch for changes and compile +* `npm run test` perform the jest unit tests +* `npx cdk deploy` deploy this stack to your default AWS account/region +* `npx cdk diff` compare deployed stack with current state +* `npx cdk synth` emits the synthesized CloudFormation template diff --git a/infra/bin/infra.ts b/infra/bin/infra.ts new file mode 100644 index 0000000000..6a2807f660 --- /dev/null +++ b/infra/bin/infra.ts @@ -0,0 +1,116 @@ +#!/usr/bin/env node +import "source-map-support/register"; +import * as cdk from "aws-cdk-lib"; +import { createAgentProjectStack, createNextOpenAIProjectStack, createUIProjectStack } from "../lib/utils"; + +// app +const app = new cdk.App(); + +/* + * Research Canvas + */ + +const coAgentsResearchCanvasAgentWithLocalDeps = createAgentProjectStack({ + app, + project: "coagents-research-canvas", + description: "CoAgents Research Canvas (Agent) - Local Depenencies", + dependencies: "Local" +}); + +const coAgentsResearchCanvasUIWithLocalDeps = createUIProjectStack({ + app, + project: "coagents-research-canvas", + description: "CoAgents Research Canvas (UI) - Local Depenencies", + dependencies: "Local", + selfHostedAgentProject: coAgentsResearchCanvasAgentWithLocalDeps.selfHostedAgent, + lgcAgentProjectPython: coAgentsResearchCanvasAgentWithLocalDeps.lgcAgentPython, + lgcAgentProjectJS: coAgentsResearchCanvasAgentWithLocalDeps.lgcAgentJS, + environmentVariables: {}, + customOutputs: { + "LgcJSDeploymentUrl": `https://coagents-research-canvas-st-08476feebc3a58e5925116da0d3ad635.default.us.langgraph.app` + } +}); + +/* + * CoAgents Routing Demo + */ + +const coAgentsRoutingAgentWithLocalDeps = createAgentProjectStack({ + app, + project: "coagents-routing", + description: "CoAgents Routing (Agent) - Local Dependencies", + dependencies: "Local" +}); + +const coAgentsRoutingUIWithLocalDeps = createUIProjectStack({ + app, + project: "coagents-routing", + description: "CoAgents Routing (UI) - Local Dependencies", + dependencies: "Local", + selfHostedAgentProject: coAgentsRoutingAgentWithLocalDeps.selfHostedAgent, + lgcAgentProjectPython: coAgentsRoutingAgentWithLocalDeps.lgcAgentPython, + lgcAgentProjectJS: coAgentsRoutingAgentWithLocalDeps.lgcAgentJS, + environmentVariables: {}, + customOutputs: { + "LgcJSDeploymentUrl": `https://coagents-routing-stg-js-4df4be4cab70578ca535df7e1c0b05cf.default.us.langgraph.app` + } +}); + +/* + * CoAgents QA Text Demo + */ + +const qaTextAgentWithLocalDeps = createAgentProjectStack({ + app, + project: "coagents-qa-text", + description: "CoAgents QA Text (Agent) - Local Dependencies", + dependencies: "Local" +}); + +const qaTextUIWithLocalDeps = createUIProjectStack({ + app, + project: "coagents-qa-text", + description: "CoAgents QA Text (UI) - Local Dependencies", + dependencies: "Local", + selfHostedAgentProject: qaTextAgentWithLocalDeps.selfHostedAgent, + lgcAgentProjectPython: qaTextAgentWithLocalDeps.lgcAgentPython, + lgcAgentProjectJS: qaTextAgentWithLocalDeps.lgcAgentJS, + environmentVariables: {}, + customOutputs: { + "LgcJSDeploymentUrl": `https://coagents-qa-text-stg-js-4d74616e480750d0a5d10d0c3c5d44a4.default.us.langgraph.app` + } +}); + +/* + * CoAgents QA Native Demo + */ + +const qaNativeAgentWithLocalDeps = createAgentProjectStack({ + app, + project: "coagents-qa-native", + description: "CoAgents QA Native (Agent) - Local Dependencies", + dependencies: "Local" +}); + +const qaNativeUIWithLocalDeps = createUIProjectStack({ + app, + project: "coagents-qa-native", + description: "CoAgents QA Native (UI) - Local Dependencies", + dependencies: "Local", + selfHostedAgentProject: qaNativeAgentWithLocalDeps.selfHostedAgent, + lgcAgentProjectPython: qaNativeAgentWithLocalDeps.lgcAgentPython, + lgcAgentProjectJS: qaNativeAgentWithLocalDeps.lgcAgentJS, + environmentVariables: {}, + customOutputs: { + "LgcJSDeploymentUrl": `https://coagents-qa-native-stg-js-036615e530e8593286ccf93d3003ffe2.default.us.langgraph.app` + } +}); + +/** + * Next OpenAI Demo + */ +createNextOpenAIProjectStack({ + app, + description: "Next OpenAI - Self Hosted", + variant: "self-hosted", +}); \ No newline at end of file diff --git a/infra/cdk.json b/infra/cdk.json new file mode 100644 index 0000000000..7baab3f6c1 --- /dev/null +++ b/infra/cdk.json @@ -0,0 +1,80 @@ +{ + "app": "npx ts-node --prefer-ts-exts bin/infra.ts", + "watch": { + "include": [ + "**" + ], + "exclude": [ + "README.md", + "cdk*.json", + "**/*.d.ts", + "**/*.js", + "tsconfig.json", + "package*.json", + "yarn.lock", + "node_modules", + "test" + ] + }, + "context": { + "@aws-cdk/aws-lambda:recognizeLayerVersion": true, + "@aws-cdk/core:checkSecretUsage": true, + "@aws-cdk/core:target-partitions": [ + "aws", + "aws-cn" + ], + "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, + "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, + "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, + "@aws-cdk/aws-iam:minimizePolicies": true, + "@aws-cdk/core:validateSnapshotRemovalPolicy": true, + "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, + "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, + "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, + "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, + "@aws-cdk/core:enablePartitionLiterals": true, + "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, + "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, + "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, + "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, + "@aws-cdk/aws-route53-patters:useCertificate": true, + "@aws-cdk/customresources:installLatestAwsSdkDefault": false, + "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, + "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, + "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, + "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, + "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, + "@aws-cdk/aws-redshift:columnId": true, + "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, + "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, + "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, + "@aws-cdk/aws-kms:aliasNameRef": true, + "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true, + "@aws-cdk/core:includePrefixInUniqueNameGeneration": true, + "@aws-cdk/aws-efs:denyAnonymousAccess": true, + "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": true, + "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": true, + "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": true, + "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": true, + "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": true, + "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": true, + "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": true, + "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": true, + "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": true, + "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": true, + "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": true, + "@aws-cdk/aws-eks:nodegroupNameAttribute": true, + "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": true, + "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": true, + "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": false, + "@aws-cdk/aws-s3:keepNotificationInImportedBucket": false, + "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": true, + "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": true, + "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": true, + "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": true, + "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": true, + "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": true, + "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": true, + "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": true + } +} diff --git a/infra/generate-table.js b/infra/generate-table.js new file mode 100644 index 0000000000..a23c61ef4e --- /dev/null +++ b/infra/generate-table.js @@ -0,0 +1,85 @@ +const fs = require("fs"); +const path = require("path"); +const json2md = require("json2md"); + +const file = fs.readFileSync( + path.resolve(__dirname, "./cdk_outputs.json"), + "utf8" +); + +function generateTable() { + const structure = []; + structure.push({ h1: "Previews" }); + + structure.push({ + p: `**Commit SHA:** ${process.env.GITHUB_SHA?.substring(0, 7)}`, + }); + + const json = JSON.parse(file); + + // Group entries by ProjectName + const projectGroups = Object.values(json).reduce((acc, entry) => { + if (!acc[entry.ProjectName]) { + acc[entry.ProjectName] = { + name: entry.ProjectName, + remote: "", + local: "", + lgcPythonDeploymentUrl: undefined, + lgcJSDeploymentUrl: undefined, + }; + } + + // Add URLs based on dependency type + if (entry.Dependencies === "Remote") { + acc[entry.ProjectName].remote = entry.FunctionUrl; + } else if (entry.Dependencies === "Local") { + acc[entry.ProjectName].local = entry.FunctionUrl; + } + + // Add LGC Python Deployment URL if it exists + if (entry.LgcPythonDeploymentUrl) { + acc[entry.ProjectName].lgcPythonDeploymentUrl = entry.LgcPythonDeploymentUrl; + } + + // Add LGC JS Deployment URL if it exists + if (entry.LgcJSDeploymentUrl) { + acc[entry.ProjectName].lgcJSDeploymentUrl = entry.LgcJSDeploymentUrl; + } + + return acc; + }, {}); + + // Convert grouped data to rows array + const rows = Object.values(projectGroups).map((project) => { + let previewMdxString = `[Preview](${project.local})`; + + if (project.lgcPythonDeploymentUrl) { + previewMdxString += ` • [Preview with LGC Python](${project.local}?lgcDeploymentUrl=${project.lgcPythonDeploymentUrl})`; + } + + if (project.lgcJSDeploymentUrl) { + previewMdxString += ` • [Preview with LGC JS](${project.local}?lgcDeploymentUrl=${project.lgcJSDeploymentUrl})`; + } + + const row = { + Name: project.name, + "Preview": previewMdxString, + }; + + return row; + }); + + structure.push({ + table: { + // headers: ["Name", "Preview (Local Dependencies)", "Preview (Remote Dependencies)"], + headers: ["Name", "Preview"], + rows, + }, + }); + + const md = json2md(structure); + console.log(md); + fs.writeFileSync(path.resolve(__dirname, "./preview-comment.md"), md); +} + +generateTable(); diff --git a/infra/get-e2e-tests-urls.js b/infra/get-e2e-tests-urls.js new file mode 100644 index 0000000000..5a57247776 --- /dev/null +++ b/infra/get-e2e-tests-urls.js @@ -0,0 +1,35 @@ +const fs = require("fs"); +const path = require("path"); + +const file = fs.readFileSync( + path.resolve(__dirname, "./cdk_outputs.json"), + "utf8" +); + +function generateTable() { + const json = JSON.parse(file); + const e2eUrls = {}; + + // Group entries by ProjectName + Object.values(json).forEach((value) => { + if (value.EndToEndProjectKey) { + e2eUrls[value.EndToEndProjectKey] = { + url: value.FunctionUrl, + description: value.ProjectDescription, + projectName: value.ProjectName + }; + + if (value.LgcPythonDeploymentUrl) { + e2eUrls[value.EndToEndProjectKey].lgcPythonDeploymentUrl = value.LgcPythonDeploymentUrl; + } + + if (value.LgcJSDeploymentUrl) { + e2eUrls[value.EndToEndProjectKey].lgcJSDeploymentUrl = value.LgcJSDeploymentUrl; + } + } + }, {}); + + console.log(JSON.stringify(e2eUrls, null, 2)); +} + +generateTable(); diff --git a/infra/jest.config.js b/infra/jest.config.js new file mode 100644 index 0000000000..08263b8954 --- /dev/null +++ b/infra/jest.config.js @@ -0,0 +1,8 @@ +module.exports = { + testEnvironment: 'node', + roots: ['/test'], + testMatch: ['**/*.test.ts'], + transform: { + '^.+\\.tsx?$': 'ts-jest' + } +}; diff --git a/infra/lib/demo-project-stack.ts b/infra/lib/demo-project-stack.ts new file mode 100644 index 0000000000..be76787b1f --- /dev/null +++ b/infra/lib/demo-project-stack.ts @@ -0,0 +1,175 @@ +import * as cdk from "aws-cdk-lib"; +import { Construct } from "constructs"; +import * as lambda from "aws-cdk-lib/aws-lambda"; +import * as ecr_assets from "aws-cdk-lib/aws-ecr-assets"; // Add this import +import * as path from "path"; +import * as secretsmanager from "aws-cdk-lib/aws-secretsmanager"; +import * as logs from "aws-cdk-lib/aws-logs"; // Add this import +import * as events from "aws-cdk-lib/aws-events"; +import * as targets from "aws-cdk-lib/aws-events-targets"; +import * as ecr from "aws-cdk-lib/aws-ecr"; +import { requireEnv } from "./utils"; + +export interface ProjectStackProps extends cdk.StackProps { + /** + * Path to the directory of the demo to deploy, relative to the root of the repository. + */ + projectName: string; + projectDescription: string; + demoDir: string; + /** + * Path to the Dockerfile to use, relative to the root of the repository. By default, this will be `${demoDir}/Dockerfile`. + */ + overrideDockerfile?: string; + environmentVariables?: { + [key: string]: string; + }; + environmentVariablesFromSecrets?: string[]; + buildSecrets?: string[]; + buildArgs?: Record; + port: string; + timeout?: number; + memorySize?: number; + includeInPRComment?: boolean; + outputEnvVariable?: string; + overrideBuildProps?: Partial; + imageTag: string; + outputs?: Record; + entrypoint?: string[]; + cmd?: string[]; +} + +export class PreviewProjectStack extends cdk.Stack { + fnUrl: string; + + constructor(scope: Construct, id: string, props: ProjectStackProps) { + const uniqueEnvironmentId = requireEnv("UNIQUE_ENV_ID"); + const processedId = `${id}${uniqueEnvironmentId}`; + + super(scope, processedId, props); + + const secrets = secretsmanager.Secret.fromSecretNameV2( + this, + "ApiKeys", + "previews/api-keys" + ); + + // Create explicit log groups + const logGroup = new logs.LogGroup(this, "FunctionLogGroup", { + logGroupName: `/aws/lambda/previews/${processedId}-Fn`, + removalPolicy: cdk.RemovalPolicy.DESTROY, + retention: logs.RetentionDays.ONE_WEEK, // Adjust retention as needed + }); + + let environmentVariables: Record = {}; + let buildSecrets: Record = {}; + + if (props.environmentVariables) { + environmentVariables = { ...props.environmentVariables }; + } + + if (props.environmentVariablesFromSecrets) { + for (const secret of props.environmentVariablesFromSecrets) { + environmentVariables[secret] = secrets + .secretValueFromJson(secret) + .unsafeUnwrap(); + } + } + + if(props.buildSecrets) { + for (const secret of props.buildSecrets) { + buildSecrets[secret] = `id=${secret}`; + } + } + + const buildArgs: Record = { + APP_DIR: props.demoDir, + }; + + if (props.buildArgs) { + Object.assign(buildArgs, props.buildArgs); + } + + const ecrRepository = ecr.Repository.fromRepositoryName(this, "ECRRepo", "coagents"); + + const fn = new lambda.Function(this, `Function`, { + logGroup: logGroup, + runtime: lambda.Runtime.FROM_IMAGE, + architecture: lambda.Architecture.X86_64, + handler: lambda.Handler.FROM_IMAGE, + environment: { + ...environmentVariables, + PORT: props.port.toString(), + AWS_LWA_INVOKE_MODE: "RESPONSE_STREAM", + }, + code: lambda.Code.fromEcrImage(ecrRepository, { + tagOrDigest: props.imageTag, + entrypoint: props.entrypoint, + cmd: props.cmd, + }), + timeout: cdk.Duration.seconds(props.timeout ?? 300), + memorySize: props.memorySize ?? 2048, + }); + + // const eventRule = new events.Rule(this, 'LambdaWarmUpSchedule', { + // schedule: events.Schedule.rate(cdk.Duration.minutes(1)), + // }); + + // eventRule.addTarget(new targets.LambdaFunction(fn)); + + // Add Function URL with streaming support + const fnUrl = fn.addFunctionUrl({ + authType: lambda.FunctionUrlAuthType.NONE, + cors: { + allowedOrigins: ["*"], + allowedMethods: [lambda.HttpMethod.ALL], + allowedHeaders: ["*"], + allowCredentials: true, + }, + invokeMode: lambda.InvokeMode.RESPONSE_STREAM, + }); + + this.fnUrl = fnUrl.url; + + // Output the Function URL + new cdk.CfnOutput(this, "FunctionUrl", { + value: fnUrl.url, + }); + + new cdk.CfnOutput(this, "IncludeInComment", { + value: `${props.includeInPRComment ?? false}`, + }); + + new cdk.CfnOutput(this, "StackId", { + value: this.stackId, + }); + + new cdk.CfnOutput(this, "StackName", { + value: this.stackName, + }); + + new cdk.CfnOutput(this, "ProjectName", { + value: props.projectName, + }); + + new cdk.CfnOutput(this, "ProjectDescription", { + value: props.projectDescription, + }); + + new cdk.CfnOutput(this, "UniqueEnvironmentId", { + value: `${uniqueEnvironmentId}`, + }); + + if (props.outputs) { + for (const [key, value] of Object.entries(props.outputs)) { + new cdk.CfnOutput(this, key, { + value: value, + }); + } + } + + // Add tag for PR number to all resources + cdk.Tags.of(this).add("env-id", uniqueEnvironmentId); + cdk.Tags.of(this).add("preview-env", "true"); + } +} diff --git a/infra/lib/utils.ts b/infra/lib/utils.ts new file mode 100644 index 0000000000..ac2bf9a091 --- /dev/null +++ b/infra/lib/utils.ts @@ -0,0 +1,257 @@ +import { App } from "aws-cdk-lib"; +import { PreviewProjectStack } from "./demo-project-stack"; + +export function requireEnv(name: string): string { + const value = process.env[name]; + if (!value) { + throw new Error(`Required environment variable ${name} is missing`); + } + return value; +} + +export function toCdkStackName(input: string) { + return input + .split("-") // Split the string by hyphens + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) // Capitalize each word + .join(""); // Join the words back together +} + +export function createAgentProjectStack({ + app, + project, + description, + dependencies, +}: { + app: App; + project: string; + description: string; + dependencies: "Remote" | "Local"; +}): { + selfHostedAgent: PreviewProjectStack; + lgcAgentPython: PreviewProjectStack; + lgcAgentJS: PreviewProjectStack; +} { + const cdkStackName = + toCdkStackName(project) + "Agent" + dependencies + "Deps"; + const dockerfile = + dependencies === "Remote" + ? `examples/Dockerfile.agent-remote-deps` + : `examples/Dockerfile.agent-local-deps`; + const GITHUB_ACTIONS_RUN_ID = requireEnv("GITHUB_ACTIONS_RUN_ID"); + + const outputs: Record = { + Dependencies: dependencies, + }; + + if (process.env.GITHUB_PR_NUMBER) { + outputs["PRNumber"] = process.env.GITHUB_PR_NUMBER; + } + + const selfHostedAgent = new PreviewProjectStack(app, cdkStackName, { + projectName: project, + projectDescription: description, + demoDir: `examples/${project}/agent`, + overrideDockerfile: dockerfile, + environmentVariablesFromSecrets: [ + "OPENAI_API_KEY", + "ANTHROPIC_API_KEY", + "GOOGLE_API_KEY", + "TAVILY_API_KEY", + ], + port: "8000", + includeInPRComment: false, + env: { + account: process.env.CDK_DEFAULT_ACCOUNT, + }, + imageTag: `${project}-agent-python-${ + dependencies === "Remote" ? "remote-deps" : "local-deps" + }-${GITHUB_ACTIONS_RUN_ID}`, + outputs: { + ...outputs, + LangGraphCloud: "false", + SelfHosted: "true" + }, + }); + + const lgcAgentPython = new PreviewProjectStack(app, `${cdkStackName}LGCPython`, { + projectName: project, + projectDescription: `${description} - LangGraph Cloud Python`, + demoDir: `examples/${project}/agent`, + overrideDockerfile: dockerfile, + environmentVariablesFromSecrets: [ + "OPENAI_API_KEY", + "ANTHROPIC_API_KEY", + "GOOGLE_API_KEY", + "TAVILY_API_KEY", + "LANGSMITH_API_KEY", + ], + port: "8000", + includeInPRComment: false, + env: { + account: process.env.CDK_DEFAULT_ACCOUNT, + }, + imageTag: `${project}-agent-python-${ + dependencies === "Remote" ? "remote-deps" : "local-deps" + }-${GITHUB_ACTIONS_RUN_ID}`, + entrypoint: ["/bin/sh", "-c"], + cmd: ["langgraph dev --no-browser --port=8000 --config=langgraph.json --host=0.0.0.0"], + outputs: { + ...outputs, + LangGraphCloud: "false", + SelfHosted: "false" + }, + }); + + const lgcAgentJS = new PreviewProjectStack(app, `${cdkStackName}LGCJS`, { + projectName: project, + projectDescription: `${description} - LangGraph Cloud JS`, + demoDir: `examples/${project}/agent`, + overrideDockerfile: dockerfile, + environmentVariablesFromSecrets: [ + "OPENAI_API_KEY", + "ANTHROPIC_API_KEY", + "GOOGLE_API_KEY", + "TAVILY_API_KEY", + "LANGSMITH_API_KEY", + ], + port: "8000", + includeInPRComment: false, + env: { + account: process.env.CDK_DEFAULT_ACCOUNT, + }, + imageTag: `${project}-agent-js-${ + dependencies === "Remote" ? "remote-deps" : "local-deps" + }-${GITHUB_ACTIONS_RUN_ID}`, + entrypoint: ["/bin/sh", "-c"], + cmd: ["pnpx @langchain/langgraph-cli dev --config=langgraph.json --no-browser --port 8000 --host 0.0.0.0"], + outputs: { + ...outputs, + LangGraphCloud: "false", + SelfHosted: "false" + }, + }); + + return { selfHostedAgent, lgcAgentPython, lgcAgentJS }; +} + +export function createUIProjectStack({ + app, + project, + description, + dependencies, + selfHostedAgentProject, + lgcAgentProjectPython, + lgcAgentProjectJS, + environmentVariables, + environmentVariablesFromSecrets, + customOutputs, +}: { + app: App; + project: string; + description: string; + dependencies: "Remote" | "Local"; + selfHostedAgentProject: PreviewProjectStack; + lgcAgentProjectPython: PreviewProjectStack; + lgcAgentProjectJS: PreviewProjectStack; + environmentVariables?: Record; + environmentVariablesFromSecrets?: string[]; + customOutputs?: Record; +}) { + const cdkStackName = toCdkStackName(project) + "UI" + dependencies + "Deps"; + const dockerfile = + dependencies === "Remote" + ? `examples/Dockerfile.ui-remote-deps` + : `examples/Dockerfile.ui-local-deps`; + const GITHUB_ACTIONS_RUN_ID = requireEnv("GITHUB_ACTIONS_RUN_ID"); + + const outputs: Record = { + Dependencies: dependencies, + EndToEndProjectKey: `${project}-ui-deps-${dependencies.toLocaleLowerCase()}`, + LgcPythonDeploymentUrl: `${lgcAgentProjectPython.fnUrl}`, + LgcJSDeploymentUrl: `${lgcAgentProjectJS.fnUrl}`, + }; + + if (customOutputs) { + Object.assign(outputs, customOutputs); + } + + if (process.env.GITHUB_PR_NUMBER) { + outputs["PRNumber"] = process.env.GITHUB_PR_NUMBER; + } + + return new PreviewProjectStack(app, cdkStackName, { + projectName: project, + projectDescription: `${description}`, + demoDir: `examples/${project}/ui`, + overrideDockerfile: dockerfile, + environmentVariablesFromSecrets: [ + "OPENAI_API_KEY", + "LANGSMITH_API_KEY", + ...(environmentVariablesFromSecrets ?? []), + ], + environmentVariables: { + REMOTE_ACTION_URL: `${selfHostedAgentProject.fnUrl}/copilotkit`, + ...environmentVariables, + }, + buildSecrets: ["OPENAI_API_KEY"], + port: "3000", + includeInPRComment: true, + env: { + account: process.env.CDK_DEFAULT_ACCOUNT, + }, + imageTag: `${project}-ui-${GITHUB_ACTIONS_RUN_ID}`, + outputs, + }); +} + +export function createNextOpenAIProjectStack({ + app, + description, + variant, + environmentVariables, + environmentVariablesFromSecrets, +}: { + app: App; + description: string; + variant: "self-hosted" | "against-cloud-prod" | "against-cloud-staging"; + environmentVariables?: Record; + environmentVariablesFromSecrets?: string[]; +}) { + const cdkStackName = toCdkStackName(`next-openai-${variant}`); + const dockerfile = `CopilotKit/examples/next-openai/Dockerfile`; + const GITHUB_ACTIONS_RUN_ID = requireEnv("GITHUB_ACTIONS_RUN_ID"); + + const outputs: Record = { + Variant: variant, + Dependencies: "Local", + EndToEndProjectKey: `next-openai-${variant}`, + }; + + if (process.env.GITHUB_PR_NUMBER) { + outputs["PRNumber"] = process.env.GITHUB_PR_NUMBER; + } + + return new PreviewProjectStack(app, cdkStackName, { + projectName: `next-openai`, + projectDescription: `${description}`, + demoDir: `CopilotKit/examples/next-openai`, + overrideDockerfile: dockerfile, + environmentVariablesFromSecrets: [ + "OPENAI_API_KEY", + "ANTHROPIC_API_KEY", + "GOOGLE_API_KEY", + "GROQ_API_KEY", + ...(environmentVariablesFromSecrets ?? []), + ], + environmentVariables: { + ...(environmentVariables ?? {}), + }, + port: "3000", + includeInPRComment: true, + env: { + account: process.env.CDK_DEFAULT_ACCOUNT, + }, + imageTag: `next-openai-${GITHUB_ACTIONS_RUN_ID}`, + outputs, + }); +} diff --git a/infra/package.json b/infra/package.json new file mode 100644 index 0000000000..124222721f --- /dev/null +++ b/infra/package.json @@ -0,0 +1,28 @@ +{ + "name": "infra", + "version": "0.1.0", + "bin": { + "infra": "bin/infra.js" + }, + "scripts": { + "build": "tsc", + "watch": "tsc -w", + "test": "jest", + "cdk": "cdk" + }, + "devDependencies": { + "@types/jest": "^29.5.14", + "@types/node": "22.7.9", + "aws-cdk": "2.165.0", + "jest": "^29.7.0", + "json2md": "^2.0.1", + "ts-jest": "^29.2.5", + "ts-node": "^10.9.2", + "typescript": "~5.6.3" + }, + "dependencies": { + "aws-cdk-lib": "2.165.0", + "constructs": "^10.0.0", + "source-map-support": "^0.5.21" + } +} \ No newline at end of file diff --git a/infra/pnpm-lock.yaml b/infra/pnpm-lock.yaml new file mode 100644 index 0000000000..7f1cdfee03 --- /dev/null +++ b/infra/pnpm-lock.yaml @@ -0,0 +1,2803 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + aws-cdk-lib: + specifier: 2.165.0 + version: 2.165.0(constructs@10.4.2) + constructs: + specifier: ^10.0.0 + version: 10.4.2 + source-map-support: + specifier: ^0.5.21 + version: 0.5.21 + devDependencies: + '@types/jest': + specifier: ^29.5.14 + version: 29.5.14 + '@types/node': + specifier: 22.7.9 + version: 22.7.9 + aws-cdk: + specifier: 2.165.0 + version: 2.165.0 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.7.9)(ts-node@10.9.2(@types/node@22.7.9)(typescript@5.6.3)) + json2md: + specifier: ^2.0.1 + version: 2.0.1 + ts-jest: + specifier: ^29.2.5 + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.7.9)(ts-node@10.9.2(@types/node@22.7.9)(typescript@5.6.3)))(typescript@5.6.3) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@22.7.9)(typescript@5.6.3) + typescript: + specifier: ~5.6.3 + version: 5.6.3 + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@aws-cdk/asset-awscli-v1@2.2.209': + resolution: {integrity: sha512-tL7aBDzx/QBuZoQso9OST2BMCoev89v01iQZicOKlR0J6vWQLPiqZfn4vd9nissFbM4X+xIwi3UKasPBTQL0WQ==} + + '@aws-cdk/asset-kubectl-v20@2.1.3': + resolution: {integrity: sha512-cDG1w3ieM6eOT9mTefRuTypk95+oyD7P5X/wRltwmYxU7nZc3+076YEVS6vrjDKr3ADYbfn0lDKpfB1FBtO9CQ==} + + '@aws-cdk/asset-node-proxy-agent-v6@2.1.0': + resolution: {integrity: sha512-7bY3J8GCVxLupn/kNmpPc5VJz8grx+4RKfnnJiO1LG+uxkZfANZG3RMHhE+qQxxwkyQ9/MfPtTpf748UhR425A==} + + '@aws-cdk/cloud-assembly-schema@38.0.1': + resolution: {integrity: sha512-KvPe+NMWAulfNVwY7jenFhzhuLhLqJ/OPy5jx7wUstbjnYnjRVLpUHPU3yCjXFE0J8cuJVdx95BJ4rOs66Pi9w==} + bundledDependencies: + - jsonschema + - semver + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.2': + resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.2': + resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.2': + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.9': + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.5.14': + resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} + + '@types/node@22.7.9': + resolution: {integrity: sha512-jrTfRC7FM6nChvU7X2KqcrgquofrWLFDeYC1hKfwNWomVvrn7JIksqf344WN2X/y8xrgqBd2dJATZV4GbatBfg==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + aws-cdk-lib@2.165.0: + resolution: {integrity: sha512-jCIUcaNDhAO/Yxik29L2LJiXkZImbEOlw/dWwhlcIx1eJyxUW+IWuMbGjXEMg8/QH56FBA5TLkZpTTsRstHS/Q==} + engines: {node: '>= 14.15.0'} + peerDependencies: + constructs: ^10.0.0 + bundledDependencies: + - '@balena/dockerignore' + - case + - fs-extra + - ignore + - jsonschema + - minimatch + - punycode + - semver + - table + - yaml + - mime-types + + aws-cdk@2.165.0: + resolution: {integrity: sha512-9j7i/qVBGmGJqu1xAKtawYo5AqI+6mI4pGmTdzNmrNfynDCrLVuVKSqf2LnhMh2KPWetEMiSPyyekfvXGWgZbw==} + engines: {node: '>= 14.15.0'} + hasBin: true + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-preset-current-node-syntax@1.1.0: + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001677: + resolution: {integrity: sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cjs-module-lexer@1.4.1: + resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + constructs@10.4.2: + resolution: {integrity: sha512-wsNxBlAott2qg8Zv87q3eYZYgheb9lchtBfjHzzLHtXbttwSrHPs1NNQbBrmbb1YZvYg2+Vh0Dor76w4mFxJkA==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.5.50: + resolution: {integrity: sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indento@1.1.13: + resolution: {integrity: sha512-YZWk3mreBEM7sBPddsiQnW9Z8SGg/gNpFfscJq00HCDS7pxcQWWWMSVKJU7YkTRyDu1Zv2s8zaK8gQWKmCXHlg==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json2md@2.0.1: + resolution: {integrity: sha512-VbwmZ83qmUfKBS2pUOHlzNKEZFPBeJSbzEok3trMYyboZUgdHNn1XZfc1uT8UZs1GHCrmRUBXCfqw4YmmQuOhw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-jest@29.2.5: + resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/transform': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@aws-cdk/asset-awscli-v1@2.2.209': {} + + '@aws-cdk/asset-kubectl-v20@2.1.3': {} + + '@aws-cdk/asset-node-proxy-agent-v6@2.1.0': {} + + '@aws-cdk/cloud-assembly-schema@38.0.1': {} + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.2': {} + + '@babel/core@7.26.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + convert-source-map: 2.0.0 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.2': + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 + + '@babel/helper-compilation-targets@7.25.9': + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.25.9': {} + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + + '@babel/parser@7.26.2': + dependencies: + '@babel/types': 7.26.0 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + + '@babel/traverse@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + debug: 4.3.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@bcoe/v8-coverage@0.2.3': {} + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/console@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@types/node': 22.7.9 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@22.7.9)(typescript@5.6.3))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.7.9 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@22.7.9)(ts-node@10.9.2(@types/node@22.7.9)(typescript@5.6.3)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.7.9 + jest-mock: 29.7.0 + + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + + '@jest/expect@29.7.0': + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 22.7.9 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/globals@29.7.0': + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/reporters@29.7.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 22.7.9 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/source-map@29.6.3': + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@29.7.0': + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.26.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.8 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 22.7.9 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@sinclair/typebox@0.27.8': {} + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.26.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.26.0 + + '@types/graceful-fs@4.1.9': + dependencies: + '@types/node': 22.7.9 + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/jest@29.5.14': + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + + '@types/node@22.7.9': + dependencies: + undici-types: 6.19.8 + + '@types/stack-utils@2.0.3': {} + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.33': + dependencies: + '@types/yargs-parser': 21.0.3 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@4.1.3: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + async@3.2.6: {} + + aws-cdk-lib@2.165.0(constructs@10.4.2): + dependencies: + '@aws-cdk/asset-awscli-v1': 2.2.209 + '@aws-cdk/asset-kubectl-v20': 2.1.3 + '@aws-cdk/asset-node-proxy-agent-v6': 2.1.0 + '@aws-cdk/cloud-assembly-schema': 38.0.1 + constructs: 10.4.2 + + aws-cdk@2.165.0: + optionalDependencies: + fsevents: 2.3.2 + + babel-jest@29.7.0(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.26.0) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@6.1.1: + dependencies: + '@babel/helper-plugin-utils': 7.25.9 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 + + babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.0) + + babel-preset-jest@29.6.3(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0) + + balanced-match@1.0.2: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.24.2: + dependencies: + caniuse-lite: 1.0.30001677 + electron-to-chromium: 1.5.50 + node-releases: 2.0.18 + update-browserslist-db: 1.1.1(browserslist@4.24.2) + + bs-logger@0.2.6: + dependencies: + fast-json-stable-stringify: 2.1.0 + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-from@1.1.2: {} + + callsites@3.1.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001677: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + char-regex@1.0.2: {} + + ci-info@3.9.0: {} + + cjs-module-lexer@1.4.1: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + co@4.6.0: {} + + collect-v8-coverage@1.0.2: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + concat-map@0.0.1: {} + + constructs@10.4.2: {} + + convert-source-map@2.0.0: {} + + create-jest@29.7.0(@types/node@22.7.9)(ts-node@10.9.2(@types/node@22.7.9)(typescript@5.6.3)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@22.7.9)(ts-node@10.9.2(@types/node@22.7.9)(typescript@5.6.3)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + create-require@1.1.1: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + dedent@1.5.3: {} + + deepmerge@4.3.1: {} + + detect-newline@3.1.0: {} + + diff-sequences@29.6.3: {} + + diff@4.0.2: {} + + ejs@3.1.10: + dependencies: + jake: 10.9.2 + + electron-to-chromium@1.5.50: {} + + emittery@0.13.1: {} + + emoji-regex@8.0.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + escalade@3.2.0: {} + + escape-string-regexp@2.0.0: {} + + esprima@4.0.1: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + exit@0.1.2: {} + + expect@29.7.0: + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + + fast-json-stable-stringify@2.1.0: {} + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + fs.realpath@1.0.0: {} + + fsevents@2.3.2: + optional: true + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-package-type@0.1.0: {} + + get-stream@6.0.1: {} + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@11.12.0: {} + + graceful-fs@4.2.11: {} + + has-flag@4.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + html-escaper@2.0.2: {} + + human-signals@2.1.0: {} + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + imurmurhash@0.1.4: {} + + indento@1.1.13: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-arrayish@0.2.1: {} + + is-core-module@2.15.1: + dependencies: + hasown: 2.0.2 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-fn@2.1.0: {} + + is-number@7.0.0: {} + + is-stream@2.0.1: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@5.2.1: + dependencies: + '@babel/core': 7.26.0 + '@babel/parser': 7.26.2 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.26.0 + '@babel/parser': 7.26.2 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@4.0.1: + dependencies: + debug: 4.3.7 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + jest-changed-files@29.7.0: + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + + jest-circus@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.7.9 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.3 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.1.0 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@29.7.0(@types/node@22.7.9)(ts-node@10.9.2(@types/node@22.7.9)(typescript@5.6.3)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.7.9)(typescript@5.6.3)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@22.7.9)(ts-node@10.9.2(@types/node@22.7.9)(typescript@5.6.3)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@22.7.9)(ts-node@10.9.2(@types/node@22.7.9)(typescript@5.6.3)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@29.7.0(@types/node@22.7.9)(ts-node@10.9.2(@types/node@22.7.9)(typescript@5.6.3)): + dependencies: + '@babel/core': 7.26.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.7.9 + ts-node: 10.9.2(@types/node@22.7.9)(typescript@5.6.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-docblock@29.7.0: + dependencies: + detect-newline: 3.1.0 + + jest-each@29.7.0: + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.7.9 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-haste-map@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 22.7.9 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-leak-detector@29.7.0: + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.26.2 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 22.7.9 + jest-util: 29.7.0 + + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: + jest-resolve: 29.7.0 + + jest-regex-util@29.6.3: {} + + jest-resolve-dependencies@29.7.0: + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + jest-resolve@29.7.0: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.8 + resolve.exports: 2.0.2 + slash: 3.0.0 + + jest-runner@29.7.0: + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.7.9 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + + jest-runtime@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.7.9 + chalk: 4.1.2 + cjs-module-lexer: 1.4.1 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + jest-snapshot@29.7.0: + dependencies: + '@babel/core': 7.26.0 + '@babel/generator': 7.26.2 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.26.0 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 22.7.9 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-watcher@29.7.0: + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.7.9 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + + jest-worker@29.7.0: + dependencies: + '@types/node': 22.7.9 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@29.7.0(@types/node@22.7.9)(ts-node@10.9.2(@types/node@22.7.9)(typescript@5.6.3)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.7.9)(typescript@5.6.3)) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@22.7.9)(ts-node@10.9.2(@types/node@22.7.9)(typescript@5.6.3)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + jsesc@3.0.2: {} + + json-parse-even-better-errors@2.3.1: {} + + json2md@2.0.1: + dependencies: + indento: 1.1.13 + + json5@2.2.3: {} + + kleur@3.0.3: {} + + leven@3.1.0: {} + + lines-and-columns@1.2.4: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash.memoize@4.1.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + make-dir@4.0.0: + dependencies: + semver: 7.6.3 + + make-error@1.3.6: {} + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + merge-stream@2.0.0: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mimic-fn@2.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + ms@2.1.3: {} + + natural-compare@1.4.0: {} + + node-int64@0.4.0: {} + + node-releases@2.0.18: {} + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-try@2.2.0: {} + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pirates@4.0.6: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + pure-rand@6.1.0: {} + + react-is@18.3.1: {} + + require-directory@2.1.1: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@5.0.0: {} + + resolve.exports@2.0.2: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + semver@6.3.1: {} + + semver@7.6.3: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@3.0.7: {} + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + sprintf-js@1.0.3: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + tmpl@1.0.5: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.7.9)(ts-node@10.9.2(@types/node@22.7.9)(typescript@5.6.3)))(typescript@5.6.3): + dependencies: + bs-logger: 0.2.6 + ejs: 3.1.10 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@22.7.9)(ts-node@10.9.2(@types/node@22.7.9)(typescript@5.6.3)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.6.3 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.26.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.0) + + ts-node@10.9.2(@types/node@22.7.9)(typescript@5.6.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.7.9 + acorn: 8.14.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.6.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + type-detect@4.0.8: {} + + type-fest@0.21.3: {} + + typescript@5.6.3: {} + + undici-types@6.19.8: {} + + update-browserslist-db@1.1.1(browserslist@4.24.2): + dependencies: + browserslist: 4.24.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + v8-compile-cache-lib@3.0.1: {} + + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} diff --git a/infra/test/infra.test.ts b/infra/test/infra.test.ts new file mode 100644 index 0000000000..2ee2d6937d --- /dev/null +++ b/infra/test/infra.test.ts @@ -0,0 +1,17 @@ +// import * as cdk from 'aws-cdk-lib'; +// import { Template } from 'aws-cdk-lib/assertions'; +// import * as Infra from '../lib/infra-stack'; + +// example test. To run these tests, uncomment this file along with the +// example resource in lib/infra-stack.ts +test('SQS Queue Created', () => { +// const app = new cdk.App(); +// // WHEN +// const stack = new Infra.InfraStack(app, 'MyTestStack'); +// // THEN +// const template = Template.fromStack(stack); + +// template.hasResourceProperties('AWS::SQS::Queue', { +// VisibilityTimeout: 300 +// }); +}); diff --git a/infra/tsconfig.json b/infra/tsconfig.json new file mode 100644 index 0000000000..aaa7dc510f --- /dev/null +++ b/infra/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "commonjs", + "lib": [ + "es2020", + "dom" + ], + "declaration": true, + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": false, + "inlineSourceMap": true, + "inlineSources": true, + "experimentalDecorators": true, + "strictPropertyInitialization": false, + "typeRoots": [ + "./node_modules/@types" + ] + }, + "exclude": [ + "node_modules", + "cdk.out" + ] +}