From 6a8bd3abd150150cbee3dbc1d04fa1c8a1a20538 Mon Sep 17 00:00:00 2001 From: Luke Shay Date: Sun, 10 Sep 2023 15:05:13 -0500 Subject: [PATCH 01/13] chore: updated deps --- .changeset/config.json | 5 +- .eslintrc.cjs | 4 +- .github/FUNDING.yml | 6 +- .github/ISSUE_TEMPLATE/bug-report.yml | 88 +- .github/ISSUE_TEMPLATE/config.yml | 10 +- .github/ISSUE_TEMPLATE/feature-request.yml | 70 +- .github/workflows/cd-dev.yml | 125 +- .github/workflows/cd-prod.yml | 58 +- .github/workflows/ci.yml | 94 +- .github/workflows/deploy.yml | 174 +- .github/workflows/stale.yml | 40 +- .prettierrc.cjs | 2 +- .yarnrc.yml | 8 +- apps/docs/.astro/types.d.ts | 244 ++ apps/infra/cdk.context.json | 4 + apps/infra/package.json | 6 +- apps/infra/src/bin/infra.ts | 66 +- apps/infra/src/lib/constants/environments.ts | 36 +- .../src/lib/constructs/basic-graph-widget.ts | 17 +- .../src/lib/constructs/distribution-metric.ts | 19 +- .../infra/src/lib/stacks/certificate-stack.ts | 41 +- .../infra/src/lib/stacks/github-oidc-stack.ts | 70 +- .../src/lib/stacks/github-users-stack.ts | 91 + apps/infra/src/lib/stacks/monitoring-stack.ts | 32 +- apps/infra/src/lib/stacks/redirect-stack.ts | 63 +- apps/infra/src/lib/stacks/website-stack.ts | 186 +- .../src/lib/types/astro-aws-stack-props.ts | 22 +- apps/www/README.md | 2 +- apps/www/astro.config.ts | 16 +- apps/www/package.json | 2 +- apps/www/postcss.config.cjs | 2 +- .../outline/create-clipboard-document-icon.ts | 4 +- apps/www/src/pages/docs/index.md | 16 +- apps/www/tailwind.config.cjs | 2 +- constraints.pro | 2 +- package.json | 22 +- packages/adapter/README.md | 6 +- packages/adapter/package.json | 2 +- packages/adapter/src/__tests__/index.test.ts | 164 +- packages/adapter/src/args.ts | 17 +- packages/adapter/src/constants.ts | 2 +- packages/adapter/src/index.ts | 48 +- .../src/lambda/__tests__/helpers.test.ts | 41 +- packages/adapter/src/lambda/constants.ts | 2 +- packages/adapter/src/lambda/handler.ts | 103 +- packages/adapter/src/lambda/helpers.ts | 53 +- packages/adapter/src/lambda/index.ts | 24 +- packages/adapter/src/log.ts | 10 +- packages/adapter/src/shared.ts | 20 +- packages/constructs/README.md | 42 +- packages/constructs/package.json | 6 +- .../astro-aws-cloudfront-distribution.ts | 91 +- .../src/constructs/astro-aws-origin.ts | 91 +- .../astro-aws-s3-bucket-deployment.ts | 63 +- .../src/constructs/astro-aws-s3-bucket.ts | 59 +- .../constructs/src/constructs/astro-aws.ts | 133 +- packages/constructs/src/index.ts | 2 +- .../src/types/astro-aws-construct.ts | 12 +- packages/constructs/src/types/output.ts | 2 +- packages/constructs/src/types/partial-by.ts | 2 +- scripts/bin.js | 2 +- scripts/package.json | 2 +- scripts/src/cmds/build.ts | 44 +- scripts/src/index.ts | 8 +- scripts/src/utils/arg-util.ts | 4 +- scripts/src/utils/config-util.ts | 22 +- scripts/src/utils/esbuild-util.ts | 49 +- scripts/src/utils/pkg-util.ts | 17 +- scripts/src/utils/shell-util.ts | 5 +- scripts/src/utils/ts-util.ts | 22 +- yarn.lock | 2486 +++++++++++++++-- 71 files changed, 3966 insertions(+), 1339 deletions(-) create mode 100644 apps/docs/.astro/types.d.ts create mode 100644 apps/infra/src/lib/stacks/github-users-stack.ts diff --git a/.changeset/config.json b/.changeset/config.json index 5b4dd11..e38f30c 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -2,7 +2,10 @@ "$schema": "https://unpkg.com/@changesets/config@2.2.0/schema.json", "access": "public", "baseBranch": "main", - "changelog": ["@changesets/changelog-github", { "repo": "lukeshay/astro-aws" }], + "changelog": [ + "@changesets/changelog-github", + { "repo": "lukeshay/astro-aws" } + ], "commit": false, "fixed": [], "ignore": ["@astro-aws/www", "@astro-aws/infra"], diff --git a/.eslintrc.cjs b/.eslintrc.cjs index a72400d..9f19f4e 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,4 +1,4 @@ -require("@rushstack/eslint-patch/modern-module-resolution"); +require("@rushstack/eslint-patch/modern-module-resolution") /** @type {import("eslint").Linter.Config} */ module.exports = { @@ -23,4 +23,4 @@ module.exports = { }, }, }, -}; +} diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 0eaabc3..b6fefd5 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,8 +1,8 @@ github: - - lukeshay + - lukeshay custom: - - https://account.venmo.com/u/LukeShay - - https://paypal.me/rlshay + - https://account.venmo.com/u/LukeShay + - https://paypal.me/rlshay open_collective: https://opencollective.com/astro-aws # patreon: # Replace with a single Patreon username # ko_fi: # Replace with a single Ko-fi username diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 1bd0cbd..e10db8d 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -3,53 +3,53 @@ description: "If something isn't working as expected 🤔." title: "[Bug]: " labels: ["needs triage", "bug"] body: - - type: markdown - attributes: - value: Thanks for taking the time to file a bug report! Please fill out this form as completely as possible. + - type: markdown + attributes: + value: Thanks for taking the time to file a bug report! Please fill out this form as completely as possible. - - type: checkboxes - id: input1 - attributes: - label: "💻" - options: - - label: Would you like to work on a fix? + - type: checkboxes + id: input1 + attributes: + label: "💻" + options: + - label: Would you like to work on a fix? - - type: textarea - attributes: - label: Input code - description: You must write here the minimal input code necessary to reproduce the bug. - placeholder: | - ```js - new Stack(app, "Stack", {}); - ``` - validations: - required: true + - type: textarea + attributes: + label: Input code + description: You must write here the minimal input code necessary to reproduce the bug. + placeholder: | + ```js + new Stack(app, "Stack", {}); + ``` + validations: + required: true - - type: textarea - attributes: - label: Current and expected behavior - description: A clear and concise description of what Babel is doing and what you would expect. - validations: - required: true + - type: textarea + attributes: + label: Current and expected behavior + description: A clear and concise description of what Babel is doing and what you would expect. + validations: + required: true - - type: textarea - attributes: - label: Environment - placeholder: | - - Astro AWS version(s): - - Astro version(s): - - Node: - - npm/Yarn version: [e.g. npm 7/Yarn 2.3] - - AWS CDK version(s): - validations: - required: true + - type: textarea + attributes: + label: Environment + placeholder: | + - Astro AWS version(s): + - Astro version(s): + - Node: + - npm/Yarn version: [e.g. npm 7/Yarn 2.3] + - AWS CDK version(s): + validations: + required: true - - type: textarea - attributes: - label: Possible solution - description: "If you have suggestions on a fix for the bug." + - type: textarea + attributes: + label: Possible solution + description: "If you have suggestions on a fix for the bug." - - type: textarea - attributes: - label: Additional context - description: "Add any other context about the problem here. Or a screenshot if applicable." + - type: textarea + attributes: + label: Additional context + description: "Add any other context about the problem here. Or a screenshot if applicable." diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 2c7af1c..7e8064b 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,7 +1,7 @@ blank_issues_enabled: false contact_links: - - name: 🗣 Ask a Question, Discuss - url: https://github.com/lukeshay/astro-aws/discussions - - name: 🤗 Support the Project - url: https://github.com/sponsors/astro-aws - about: Support Astro AWS financially. + - name: 🗣 Ask a Question, Discuss + url: https://github.com/lukeshay/astro-aws/discussions + - name: 🤗 Support the Project + url: https://github.com/sponsors/astro-aws + about: Support Astro AWS financially. diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml index 83239c8..c37f3bc 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.yml +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -2,43 +2,43 @@ name: "🚀 Feature Request" description: "I have a specific suggestion for Babel!" labels: ["needs triage", "enhancement"] body: - - type: markdown - attributes: - value: Thanks for taking the time to suggest a new feature! Please fill out this form as completely as possible. + - type: markdown + attributes: + value: Thanks for taking the time to suggest a new feature! Please fill out this form as completely as possible. - - type: checkboxes - id: input1 - attributes: - label: "💻" - description: | - Check this if you would like to implement a PR, we are more than happy to help you go through the process - options: - - label: Would you like to work on this feature? + - type: checkboxes + id: input1 + attributes: + label: "💻" + description: | + Check this if you would like to implement a PR, we are more than happy to help you go through the process + options: + - label: Would you like to work on this feature? - - type: textarea - attributes: - label: What problem are you trying to solve? - description: | - A concise description of what the problem is. - placeholder: | - I have an issue when [...] - validations: - required: true + - type: textarea + attributes: + label: What problem are you trying to solve? + description: | + A concise description of what the problem is. + placeholder: | + I have an issue when [...] + validations: + required: true - - type: textarea - attributes: - label: Describe the solution you'd like - validations: - required: true + - type: textarea + attributes: + label: Describe the solution you'd like + validations: + required: true - - type: textarea - attributes: - label: Describe alternatives you've considered - validations: - required: true + - type: textarea + attributes: + label: Describe alternatives you've considered + validations: + required: true - - type: textarea - attributes: - label: Documentation, Adoption, Migration Strategy - description: | - If you can, explain how users will be able to use this and how it might be documented. Maybe a mock-up? + - type: textarea + attributes: + label: Documentation, Adoption, Migration Strategy + description: | + If you can, explain how users will be able to use this and how it might be documented. Maybe a mock-up? diff --git a/.github/workflows/cd-dev.yml b/.github/workflows/cd-dev.yml index 6006e2b..39df841 100644 --- a/.github/workflows/cd-dev.yml +++ b/.github/workflows/cd-dev.yml @@ -1,78 +1,67 @@ name: CD on: - workflow_run: - workflows: - - CI - branches: - - main - types: - - completed + workflow_run: + workflows: + - CI + branches: + - main + types: + - completed env: - CI: true - TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} - TURBO_TEAM: ${{ secrets.TURBO_TEAM }} + CI: true + TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} + TURBO_TEAM: ${{ secrets.TURBO_TEAM }} permissions: - id-token: write - contents: read - deployments: write + id-token: write + contents: read + deployments: write jobs: - prepare-yarn-cache: - name: Cache dependencies - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: "18" - cache: "yarn" - - run: yarn install --mode=skip-build - env: - YARN_ENABLE_SCRIPTS: false - deploy-dev: - name: Deploy Dev - needs: [prepare-yarn-cache] - concurrency: - group: ${{ format('{0}-{1}', github.workflow, github.job) }} - uses: ./.github/workflows/deploy.yml + prepare-yarn-cache: + name: Cache dependencies + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: - environment_name: development - environment_url: https://dev.astro-aws.org/ - stack_environment: DEV - secrets: inherit - deploy-dev-node-16: - name: Deploy Dev Node 16 - needs: [prepare-yarn-cache] - concurrency: - group: ${{ format('{0}-{1}', github.workflow, github.job) }} - uses: ./.github/workflows/deploy.yml - with: - environment_name: development-node-16 - environment_url: https://node16.dev.astro-aws.org/ - stack_environment: NODE16 - secrets: inherit - deploy-dev-node-18: - name: Deploy Dev Node 18 - needs: [prepare-yarn-cache] - concurrency: - group: ${{ format('{0}-{1}', github.workflow, github.job) }} - uses: ./.github/workflows/deploy.yml - with: - environment_name: development-node-18 - environment_url: https://node18.dev.astro-aws.org/ - stack_environment: NODE18 - secrets: inherit - deploy-dev-edge: - name: Deploy Dev Edge - needs: [prepare-yarn-cache] - concurrency: - group: ${{ format('{0}-{1}', github.workflow, github.job) }} - uses: ./.github/workflows/deploy.yml - with: - environment_name: development-edge - environment_url: https://edge.dev.astro-aws.org/ - stack_environment: EDGE - secrets: inherit + node-version: "18" + cache: "yarn" + - run: yarn install --mode=skip-build + env: + YARN_ENABLE_SCRIPTS: false + deploy-dev: + name: Deploy Dev + needs: [prepare-yarn-cache] + concurrency: + group: ${{ format('{0}-{1}', github.workflow, github.job) }} + uses: ./.github/workflows/deploy.yml + with: + environment_name: development + environment_url: https://dev.astro-aws.org/ + stack_environment: DEV + secrets: inherit + deploy-dev-ssr: + name: Deploy Dev SSR + needs: [prepare-yarn-cache] + concurrency: + group: ${{ format('{0}-{1}', github.workflow, github.job) }} + uses: ./.github/workflows/deploy.yml + with: + environment_name: development-ssr + environment_url: https://ssr.dev.astro-aws.org/ + stack_environment: SSR + secrets: inherit + deploy-dev-edge: + name: Deploy Dev Edge + needs: [prepare-yarn-cache] + concurrency: + group: ${{ format('{0}-{1}', github.workflow, github.job) }} + uses: ./.github/workflows/deploy.yml + with: + environment_name: development-edge + environment_url: https://edge.dev.astro-aws.org/ + stack_environment: EDGE + secrets: inherit diff --git a/.github/workflows/cd-prod.yml b/.github/workflows/cd-prod.yml index 241166a..48f8e05 100644 --- a/.github/workflows/cd-prod.yml +++ b/.github/workflows/cd-prod.yml @@ -1,39 +1,39 @@ name: CD on: - workflow_dispatch: + workflow_dispatch: env: - CI: true - TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} - TURBO_TEAM: ${{ secrets.TURBO_TEAM }} + CI: true + TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} + TURBO_TEAM: ${{ secrets.TURBO_TEAM }} permissions: - id-token: write - contents: read - deployments: write + id-token: write + contents: read + deployments: write jobs: - prepare-yarn-cache: - name: Cache dependencies - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: "18" - cache: "yarn" - - run: yarn install --mode=skip-build - env: - YARN_ENABLE_SCRIPTS: false - deploy-prod: - name: Deploy Prod - needs: [prepare-yarn-cache] - concurrency: - group: ${{ format('{0}-{1}', github.workflow, github.job) }} - uses: ./.github/workflows/deploy.yml + prepare-yarn-cache: + name: Cache dependencies + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: - environment_name: production - environment_url: https://astro-aws.org/ - stack_environment: PROD - secrets: inherit + node-version: "18" + cache: "yarn" + - run: yarn install --mode=skip-build + env: + YARN_ENABLE_SCRIPTS: false + deploy-prod: + name: Deploy Prod + needs: [prepare-yarn-cache] + concurrency: + group: ${{ format('{0}-{1}', github.workflow, github.job) }} + uses: ./.github/workflows/deploy.yml + with: + environment_name: production + environment_url: https://astro-aws.org/ + stack_environment: PROD + secrets: inherit diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8a995c4..bbf7e2b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,55 +1,53 @@ name: CI on: - pull_request: - push: - branches: - - "main" + pull_request: + push: + branches: + - "main" env: - CI: true - TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} - TURBO_TEAM: ${{ secrets.TURBO_TEAM }} + CI: true + TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} + TURBO_TEAM: ${{ secrets.TURBO_TEAM }} jobs: - prepare-yarn-cache: - name: Cache dependencies - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: "18" - cache: "yarn" - - run: yarn install --mode=skip-build - env: - YARN_ENABLE_SCRIPTS: false - check: - name: Check - runs-on: ubuntu-22.04 - needs: prepare-yarn-cache - strategy: - fail-fast: false - matrix: - node_version: - - 16 - - 18 - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node_version }} - cache: "yarn" - - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-region: us-east-2 - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - - run: yarn install --mode=skip-build - - run: yarn build - - run: yarn constraints - - if: matrix.node_version == 18 - run: yarn test - - run: yarn lint - - run: yarn prettier - - run: yarn synth + prepare-yarn-cache: + name: Cache dependencies + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: "18" + cache: "yarn" + - run: yarn install --mode=skip-build + env: + YARN_ENABLE_SCRIPTS: false + check: + name: Check + runs-on: ubuntu-22.04 + needs: prepare-yarn-cache + strategy: + fail-fast: false + matrix: + node_version: + - 18 + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node_version }} + cache: "yarn" + - uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-region: us-east-2 + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + - run: yarn install --mode=skip-build + - run: yarn build + - run: yarn constraints + - run: yarn test + - run: yarn lint + - run: yarn prettier + - run: yarn synth diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 137374e..6d04780 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,97 +1,97 @@ name: Deploy on: - workflow_call: - inputs: - node_version: - description: The version of node to use - required: false - type: string - default: "18" - stack_environment: - description: The stack environment to deploy - required: true - type: string - environment_name: - description: The GitHub environment name - required: true - type: string - environment_url: - description: The GitHub environment url - required: true - type: string - aws_session_name: - description: AWS session name - required: false - type: string - aws_region: - description: The AWS region - required: false - type: string - default: us-east-2 - ref: - description: The git ref to checkout - required: false - type: string - repository: - description: The git repository to checkout - required: false - type: string - secrets: - AWS_ACCESS_KEY_ID: - required: true - AWS_SECRET_ACCESS_KEY: - required: true - AWS_ACCOUNT_ID: - required: true - TURBO_TOKEN: - required: false - TURBO_TEAM: - required: false - WEB_ACL_ARN: - required: true + workflow_call: + inputs: + node_version: + description: The version of node to use + required: false + type: string + default: "18" + stack_environment: + description: The stack environment to deploy + required: true + type: string + environment_name: + description: The GitHub environment name + required: true + type: string + environment_url: + description: The GitHub environment url + required: true + type: string + aws_session_name: + description: AWS session name + required: false + type: string + aws_region: + description: The AWS region + required: false + type: string + default: us-east-2 + ref: + description: The git ref to checkout + required: false + type: string + repository: + description: The git repository to checkout + required: false + type: string + secrets: + AWS_ACCESS_KEY_ID: + required: true + AWS_SECRET_ACCESS_KEY: + required: true + AWS_ACCOUNT_ID: + required: true + TURBO_TOKEN: + required: false + TURBO_TEAM: + required: false + WEB_ACL_ARN: + required: true env: - CI: true + CI: true permissions: - id-token: write - contents: read - deployments: write + id-token: write + contents: read + deployments: write jobs: - deploy: - name: Deploy - runs-on: ubuntu-22.04 + deploy: + name: Deploy + runs-on: ubuntu-22.04 + env: + TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} + TURBO_TEAM: ${{ secrets.TURBO_TEAM }} + environment: + name: ${{ inputs.environment_name }} + url: ${{ inputs.environment_url }} + steps: + - run: echo "::add-mask::${{ secrets.AWS_ACCOUNT_ID }}" + - uses: actions/checkout@v3 + with: + ref: ${{ inputs.ref }} + repository: ${{ inputs.repository }} + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-region: ${{ inputs.aws_region }} + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + - uses: actions/setup-node@v3 + with: + node-version: ${{ inputs.node_version }} + cache: "yarn" + - run: yarn install --mode=skip-build + - run: yarn deploy:one infra -- ${{ inputs.stack_environment }} env: - TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} - TURBO_TEAM: ${{ secrets.TURBO_TEAM }} - environment: - name: ${{ inputs.environment_name }} - url: ${{ inputs.environment_url }} - steps: - - run: echo "::add-mask::${{ secrets.AWS_ACCOUNT_ID }}" - - uses: actions/checkout@v3 - with: - ref: ${{ inputs.ref }} - repository: ${{ inputs.repository }} - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-region: ${{ inputs.aws_region }} - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - - uses: actions/setup-node@v3 - with: - node-version: ${{ inputs.node_version }} - cache: "yarn" - - run: yarn install --mode=skip-build - - run: yarn deploy:one infra -- ${{ inputs.stack_environment }} - env: - WEB_ACL_ARN: ${{ secrets.WEB_ACL_ARN }} - # - run: | - # export TIME="$(TZ=GMT date +'%Y-%m-%d_%H-%M-%S')" - # git tag "${{ inputs.stack_environment }}_latest" --force - # git tag "${{ inputs.stack_environment }}_${TIME}" - # git push origin "${{ inputs.stack_environment }}_latest" --force - # git push origin "${{ inputs.stack_environment }}_${TIME}" + WEB_ACL_ARN: ${{ secrets.WEB_ACL_ARN }} + # - run: | + # export TIME="$(TZ=GMT date +'%Y-%m-%d_%H-%M-%S')" + # git tag "${{ inputs.stack_environment }}_latest" --force + # git tag "${{ inputs.stack_environment }}_${TIME}" + # git push origin "${{ inputs.stack_environment }}_latest" --force + # git push origin "${{ inputs.stack_environment }}_${TIME}" diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 231b93d..65134bd 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -1,26 +1,26 @@ name: "Stale issue handler" on: - workflow_dispatch: - schedule: - - cron: "40 23 * * *" + workflow_dispatch: + schedule: + - cron: "40 23 * * *" permissions: - issues: write + issues: write jobs: - stale: - runs-on: ubuntu-22.04 - if: github.repository_owner == 'lukeshay' - steps: - - uses: actions/stale@v7 - name: "Close stale issues with no reproduction" - with: - close-issue-message: "This issue has been automatically closed because it received no activity. If you think this was closed by accident, please leave a comment. If you are running into a similar issue, please open a new issue with a reproduction. Thank you." - days-before-issue-close: 7 - days-before-issue-stale: 7 - days-before-pr-close: -1 - days-before-pr-stale: -1 - exempt-issue-labels: "blocked,keep,needs triage" - only-labels: "needs more info" - operations-per-run: 300 - stale-issue-label: "stale" + stale: + runs-on: ubuntu-22.04 + if: github.repository_owner == 'lukeshay' + steps: + - uses: actions/stale@v7 + name: "Close stale issues with no reproduction" + with: + close-issue-message: "This issue has been automatically closed because it received no activity. If you think this was closed by accident, please leave a comment. If you are running into a similar issue, please open a new issue with a reproduction. Thank you." + days-before-issue-close: 7 + days-before-issue-stale: 7 + days-before-pr-close: -1 + days-before-pr-stale: -1 + exempt-issue-labels: "blocked,keep,needs triage" + only-labels: "needs more info" + operations-per-run: 300 + stale-issue-label: "stale" diff --git a/.prettierrc.cjs b/.prettierrc.cjs index 9beba64..157327d 100644 --- a/.prettierrc.cjs +++ b/.prettierrc.cjs @@ -1 +1 @@ -module.exports = require("@lshay/prettier-config"); +module.exports = require("@lshay/prettier-config") diff --git a/.yarnrc.yml b/.yarnrc.yml index f484efa..d5d7c13 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -1,9 +1,9 @@ nodeLinker: node-modules plugins: - - path: .yarn/plugins/@yarnpkg/plugin-constraints.cjs - spec: "@yarnpkg/plugin-constraints" - - path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs - spec: "@yarnpkg/plugin-workspace-tools" + - path: .yarn/plugins/@yarnpkg/plugin-constraints.cjs + spec: "@yarnpkg/plugin-constraints" + - path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs + spec: "@yarnpkg/plugin-workspace-tools" yarnPath: .yarn/releases/yarn-3.4.1.cjs diff --git a/apps/docs/.astro/types.d.ts b/apps/docs/.astro/types.d.ts new file mode 100644 index 0000000..240bf9a --- /dev/null +++ b/apps/docs/.astro/types.d.ts @@ -0,0 +1,244 @@ +declare module "astro:content" { + interface Render { + ".mdx": Promise<{ + Content: import("astro").MarkdownInstance<{}>["Content"] + headings: import("astro").MarkdownHeading[] + remarkPluginFrontmatter: Record + }> + } +} + +declare module "astro:content" { + interface Render { + ".md": Promise<{ + Content: import("astro").MarkdownInstance<{}>["Content"] + headings: import("astro").MarkdownHeading[] + remarkPluginFrontmatter: Record + }> + } +} + +declare module "astro:content" { + export { z } from "astro/zod" + + type Flatten = T extends { [K: string]: infer U } ? U : never + + export type CollectionKey = keyof AnyEntryMap + export type CollectionEntry = Flatten + + export type ContentCollectionKey = keyof ContentEntryMap + export type DataCollectionKey = keyof DataEntryMap + + // This needs to be in sync with ImageMetadata + export type ImageFunction = () => import("astro/zod").ZodObject<{ + src: import("astro/zod").ZodString + width: import("astro/zod").ZodNumber + height: import("astro/zod").ZodNumber + format: import("astro/zod").ZodUnion< + [ + import("astro/zod").ZodLiteral<"png">, + import("astro/zod").ZodLiteral<"jpg">, + import("astro/zod").ZodLiteral<"jpeg">, + import("astro/zod").ZodLiteral<"tiff">, + import("astro/zod").ZodLiteral<"webp">, + import("astro/zod").ZodLiteral<"gif">, + import("astro/zod").ZodLiteral<"svg">, + ] + > + }> + + type BaseSchemaWithoutEffects = + | import("astro/zod").AnyZodObject + | import("astro/zod").ZodUnion< + [BaseSchemaWithoutEffects, ...BaseSchemaWithoutEffects[]] + > + | import("astro/zod").ZodDiscriminatedUnion< + string, + import("astro/zod").AnyZodObject[] + > + | import("astro/zod").ZodIntersection< + BaseSchemaWithoutEffects, + BaseSchemaWithoutEffects + > + + type BaseSchema = + | BaseSchemaWithoutEffects + | import("astro/zod").ZodEffects + + export type SchemaContext = { image: ImageFunction } + + type DataCollectionConfig = { + type: "data" + schema?: S | ((context: SchemaContext) => S) + } + + type ContentCollectionConfig = { + type?: "content" + schema?: S | ((context: SchemaContext) => S) + } + + type CollectionConfig = + | ContentCollectionConfig + | DataCollectionConfig + + export function defineCollection( + input: CollectionConfig, + ): CollectionConfig + + type AllValuesOf = T extends any ? T[keyof T] : never + type ValidContentEntrySlug = AllValuesOf< + ContentEntryMap[C] + >["slug"] + + export function getEntryBySlug< + C extends keyof ContentEntryMap, + E extends ValidContentEntrySlug | (string & {}), + >( + collection: C, + // Note that this has to accept a regular string too, for SSR + entrySlug: E, + ): E extends ValidContentEntrySlug + ? Promise> + : Promise | undefined> + + export function getDataEntryById< + C extends keyof DataEntryMap, + E extends keyof DataEntryMap[C], + >(collection: C, entryId: E): Promise> + + export function getCollection< + C extends keyof AnyEntryMap, + E extends CollectionEntry, + >( + collection: C, + filter?: (entry: CollectionEntry) => entry is E, + ): Promise + export function getCollection( + collection: C, + filter?: (entry: CollectionEntry) => unknown, + ): Promise[]> + + export function getEntry< + C extends keyof ContentEntryMap, + E extends ValidContentEntrySlug | (string & {}), + >(entry: { + collection: C + slug: E + }): E extends ValidContentEntrySlug + ? Promise> + : Promise | undefined> + export function getEntry< + C extends keyof DataEntryMap, + E extends keyof DataEntryMap[C] | (string & {}), + >(entry: { + collection: C + id: E + }): E extends keyof DataEntryMap[C] + ? Promise + : Promise | undefined> + export function getEntry< + C extends keyof ContentEntryMap, + E extends ValidContentEntrySlug | (string & {}), + >( + collection: C, + slug: E, + ): E extends ValidContentEntrySlug + ? Promise> + : Promise | undefined> + export function getEntry< + C extends keyof DataEntryMap, + E extends keyof DataEntryMap[C] | (string & {}), + >( + collection: C, + id: E, + ): E extends keyof DataEntryMap[C] + ? Promise + : Promise | undefined> + + /** Resolve an array of entry references from the same collection */ + export function getEntries( + entries: { + collection: C + slug: ValidContentEntrySlug + }[], + ): Promise[]> + export function getEntries( + entries: { + collection: C + id: keyof DataEntryMap[C] + }[], + ): Promise[]> + + export function reference( + collection: C, + ): import("astro/zod").ZodEffects< + import("astro/zod").ZodString, + C extends keyof ContentEntryMap + ? { + collection: C + slug: ValidContentEntrySlug + } + : { + collection: C + id: keyof DataEntryMap[C] + } + > + // Allow generic `string` to avoid excessive type errors in the config + // if `dev` is not running to update as you edit. + // Invalid collection names will be caught at build time. + export function reference( + collection: C, + ): import("astro/zod").ZodEffects + + type ReturnTypeOrOriginal = T extends (...args: any[]) => infer R ? R : T + type InferEntrySchema = + import("astro/zod").infer< + ReturnTypeOrOriginal["schema"]> + > + + type ContentEntryMap = { + docs: { + "guides/01-getting-started.md": { + id: "guides/01-getting-started.md" + slug: "guides/01-getting-started" + body: string + collection: "docs" + data: InferEntrySchema<"docs"> + } & { render(): Render[".md"] } + "index.mdx": { + id: "index.mdx" + slug: "index" + body: string + collection: "docs" + data: InferEntrySchema<"docs"> + } & { render(): Render[".mdx"] } + "reference/architecture.md": { + id: "reference/architecture.md" + slug: "reference/architecture" + body: string + collection: "docs" + data: InferEntrySchema<"docs"> + } & { render(): Render[".md"] } + "reference/packages/adapter.md": { + id: "reference/packages/adapter.md" + slug: "reference/packages/adapter" + body: string + collection: "docs" + data: InferEntrySchema<"docs"> + } & { render(): Render[".md"] } + "reference/packages/constructs.md": { + id: "reference/packages/constructs.md" + slug: "reference/packages/constructs" + body: string + collection: "docs" + data: InferEntrySchema<"docs"> + } & { render(): Render[".md"] } + } + } + + type DataEntryMap = {} + + type AnyEntryMap = ContentEntryMap & DataEntryMap + + type ContentConfig = typeof import("../src/content/config") +} diff --git a/apps/infra/cdk.context.json b/apps/infra/cdk.context.json index f89c6df..d43aa62 100644 --- a/apps/infra/cdk.context.json +++ b/apps/infra/cdk.context.json @@ -1,5 +1,9 @@ { "acknowledged-issue-numbers": [8607], + "hosted-zone:account=357382603627:domainName=astro-aws.org:region=us-east-1": { + "Id": "/hostedzone/Z07804331OLCIOIZL4YQN", + "Name": "astro-aws.org." + }, "hosted-zone:account=738697399292:domainName=astro-aws.org:region=us-east-1": { "Id": "/hostedzone/Z0584480MGUI8KRBPWM", "Name": "astro-aws.org." diff --git a/apps/infra/package.json b/apps/infra/package.json index 45329d1..140cc7b 100644 --- a/apps/infra/package.json +++ b/apps/infra/package.json @@ -31,8 +31,8 @@ "@astro-aws/constructs": "workspace:^", "@astro-aws/www": "workspace:^", "@types/node": "^18.14.0", - "aws-cdk": "^2.65.0", - "aws-cdk-lib": "^2.65.0", + "aws-cdk": "^2.94.0", + "aws-cdk-lib": "^2.94.0", "constructs": "^10.1.253", "eslint": "^8.34.0", "prettier": "^2.8.4", @@ -43,7 +43,7 @@ "eslint-config-get-off-my-lawn": "^7.2.0" }, "engines": { - "node": "16.x || 18.x" + "node": "18.x" }, "cli": { "clean": [ diff --git a/apps/infra/src/bin/infra.ts b/apps/infra/src/bin/infra.ts index 584bb83..1757a40 100644 --- a/apps/infra/src/bin/infra.ts +++ b/apps/infra/src/bin/infra.ts @@ -1,27 +1,51 @@ -import { App, Tags } from "aws-cdk-lib"; +import { App, Tags } from "aws-cdk-lib/core" -import { Environments, ENVIRONMENT_PROPS } from "../lib/constants/environments.js"; -import { MonitoringStack } from "../lib/stacks/monitoring-stack.js"; -import { WebsiteStack } from "../lib/stacks/website-stack.js"; -import { RedirectStack } from "../lib/stacks/redirect-stack.js"; -import type { CertificateStackProps } from "../lib/stacks/certificate-stack.js"; -import { CertificateStack } from "../lib/stacks/certificate-stack.js"; +import { + Environments, + ENVIRONMENT_PROPS, +} from "../lib/constants/environments.js" +import { MonitoringStack } from "../lib/stacks/monitoring-stack.js" +import { WebsiteStack } from "../lib/stacks/website-stack.js" +import { RedirectStack } from "../lib/stacks/redirect-stack.js" +import type { CertificateStackProps } from "../lib/stacks/certificate-stack.js" +import { CertificateStack } from "../lib/stacks/certificate-stack.js" +import { GitHubOIDCStack } from "../lib/stacks/github-oidc-stack.js" +import { GitHubUsersStack } from "../lib/stacks/github-users-stack.js" -const app = new App(); +const app = new App() -const createStackName = (environment: string, stack: string) => `AstroAWS-${environment}-${stack}`; +const createStackName = (environment: string, stack: string) => + `AstroAWS-${environment}-${stack}` Object.entries(ENVIRONMENT_PROPS).forEach(([environment, environmentProps]) => { - const monitoringStack = new MonitoringStack(app, createStackName(environment, "Monitoring"), environmentProps); + const monitoringStack = new MonitoringStack( + app, + createStackName(environment, "Monitoring"), + environmentProps, + ) - let certificateStack: CertificateStack | undefined; + let certificateStack: CertificateStack | undefined if (environmentProps.hostedZoneName) { certificateStack = new CertificateStack( app, createStackName(environment, "Certificate"), environmentProps as CertificateStackProps, - ); + ) + } + + if (environment === Environments.DEV) { + new GitHubUsersStack( + app, + createStackName(environment, "GitHubUsers"), + environmentProps, + ) + + new GitHubOIDCStack( + app, + createStackName(environment, "GitHubOIDC"), + environmentProps, + ) } new WebsiteStack(app, createStackName(environment, "Website"), { @@ -29,28 +53,28 @@ Object.entries(ENVIRONMENT_PROPS).forEach(([environment, environmentProps]) => { certificate: certificateStack?.certificate, cloudwatchDashboard: monitoringStack.cloudwatchDashboard, hostedZone: certificateStack?.hostedZone, - }); + }) if (environment === Environments.PROD && environmentProps.hostedZoneName) { const redirectProps = { ...environmentProps, alias: ["www", environmentProps.alias].filter(Boolean).join("."), - }; + } const redirectCertificateStack = new CertificateStack( app, - createStackName(environment, "RedirectCertificate", redirectProps), + createStackName(environment, "RedirectCertificate"), redirectProps as CertificateStackProps, - ); + ) - new RedirectStack(app, createStackName(environment, "Redirect", redirectProps), { + new RedirectStack(app, createStackName(environment, "Redirect"), { ...redirectProps, certificate: redirectCertificateStack.certificate, cloudwatchDashboard: monitoringStack.cloudwatchDashboard, hostedZone: redirectCertificateStack.hostedZone, - }); + }) } - Tags.of(app).add("Project", "AstroAWS"); - Tags.of(app).add("Environment", environment); -}); + Tags.of(app).add("Project", "AstroAWS") + Tags.of(app).add("Environment", environment) +}) diff --git a/apps/infra/src/lib/constants/environments.ts b/apps/infra/src/lib/constants/environments.ts index de04901..76bf15e 100644 --- a/apps/infra/src/lib/constants/environments.ts +++ b/apps/infra/src/lib/constants/environments.ts @@ -1,6 +1,6 @@ -import { env } from "node:process"; +import { env } from "node:process" -import type { AstroAWSStackProps } from "../types/astro-aws-stack-props.js"; +import type { AstroAWSStackProps } from "../types/astro-aws-stack-props.js" const base = { analyticsReporting: false, @@ -10,38 +10,30 @@ const base = { region: "us-west-2", }, terminationProtection: false, -}; +} -export const Environments = { +const Environments = { DEV: "DEV", - DEV_NODE_16: "NODE16", - DEV_NODE_18: "NODE18", + SSR: "SSR", EDGE: "EDGE", PERSONAL: "PERSONAL", PROD: "PROD", -} as const; +} as const -export type Environment = (typeof Environments)[keyof typeof Environments]; +type Environment = (typeof Environments)[keyof typeof Environments] -export const ENVIRONMENT_PROPS: Record = { +const ENVIRONMENT_PROPS: Record = { [Environments.DEV]: { ...base, - alias: "dev", + alias: "static.dev", environment: Environments.DEV, hostedZoneName: "astro-aws.org", output: "static", }, - [Environments.DEV_NODE_16]: { + [Environments.SSR]: { ...base, - alias: "node16.dev", - environment: Environments.DEV_NODE_16, - hostedZoneName: "astro-aws.org", - output: "server", - }, - [Environments.DEV_NODE_18]: { - ...base, - alias: "node18.dev", - environment: Environments.DEV_NODE_18, + alias: "ssr.dev", + environment: Environments.SSR, hostedZoneName: "astro-aws.org", output: "server", }, @@ -67,4 +59,6 @@ export const ENVIRONMENT_PROPS: Record = { environment: Environments.PERSONAL, output: "static", }, -} as const; +} as const + +export { Environments, ENVIRONMENT_PROPS, type Environment } diff --git a/apps/infra/src/lib/constructs/basic-graph-widget.ts b/apps/infra/src/lib/constructs/basic-graph-widget.ts index d68f77f..f9076af 100644 --- a/apps/infra/src/lib/constructs/basic-graph-widget.ts +++ b/apps/infra/src/lib/constructs/basic-graph-widget.ts @@ -1,19 +1,22 @@ -import type { GraphWidgetProps, Metric } from "aws-cdk-lib/aws-cloudwatch"; -import { GraphWidget } from "aws-cdk-lib/aws-cloudwatch"; +import type { GraphWidgetProps, Metric } from "aws-cdk-lib/aws-cloudwatch" +import { GraphWidget } from "aws-cdk-lib/aws-cloudwatch" -export type BasicGraphWidgetProps = Omit & { - metric: Metric; -}; +export type BasicGraphWidgetProps = Omit< + GraphWidgetProps, + "left" | "right" | "title" +> & { + metric: Metric +} export class BasicGraphWidget extends GraphWidget { public constructor(props: BasicGraphWidgetProps) { - const { metric, ...graphWidgetProps } = props; + const { metric, ...graphWidgetProps } = props super({ width: 12, ...graphWidgetProps, left: [metric], title: metric.label, - }); + }) } } diff --git a/apps/infra/src/lib/constructs/distribution-metric.ts b/apps/infra/src/lib/constructs/distribution-metric.ts index 4cc5014..182b2a3 100644 --- a/apps/infra/src/lib/constructs/distribution-metric.ts +++ b/apps/infra/src/lib/constructs/distribution-metric.ts @@ -1,14 +1,17 @@ -import type { Distribution } from "aws-cdk-lib/aws-cloudfront"; -import type { MetricProps } from "aws-cdk-lib/aws-cloudwatch"; -import { Metric } from "aws-cdk-lib/aws-cloudwatch"; +import type { Distribution } from "aws-cdk-lib/aws-cloudfront" +import type { MetricProps } from "aws-cdk-lib/aws-cloudwatch" +import { Metric } from "aws-cdk-lib/aws-cloudwatch" -export type DistributionMetricProps = Omit & { - distribution: Distribution; -}; +export type DistributionMetricProps = Omit< + MetricProps, + "dimensionsMap" | "namespace" +> & { + distribution: Distribution +} export class DistributionMetric extends Metric { public constructor(props: DistributionMetricProps) { - const { distribution, ...metricProps } = props; + const { distribution, ...metricProps } = props super({ ...metricProps, @@ -17,6 +20,6 @@ export class DistributionMetric extends Metric { Region: "Global", }, namespace: "AWS/CloudFront", - }); + }) } } diff --git a/apps/infra/src/lib/stacks/certificate-stack.ts b/apps/infra/src/lib/stacks/certificate-stack.ts index e39c7f6..8a252b9 100644 --- a/apps/infra/src/lib/stacks/certificate-stack.ts +++ b/apps/infra/src/lib/stacks/certificate-stack.ts @@ -1,39 +1,46 @@ -import { Stack } from "aws-cdk-lib"; -import { Certificate, CertificateValidation } from "aws-cdk-lib/aws-certificatemanager"; -import type { Construct } from "constructs"; -import type { IHostedZone } from "aws-cdk-lib/aws-route53"; -import { HostedZone } from "aws-cdk-lib/aws-route53"; +import { Stack } from "aws-cdk-lib/core" +import { + Certificate, + CertificateValidation, +} from "aws-cdk-lib/aws-certificatemanager" +import type { Construct } from "constructs" +import type { IHostedZone } from "aws-cdk-lib/aws-route53" +import { HostedZone } from "aws-cdk-lib/aws-route53" -import type { AstroAWSStackProps } from "../types/astro-aws-stack-props.js"; +import type { AstroAWSStackProps } from "../types/astro-aws-stack-props.js" export type CertificateStackProps = AstroAWSStackProps & { - hostedZoneName: string; -}; + hostedZoneName: string +} export class CertificateStack extends Stack { - public readonly certificate: Certificate; - public readonly hostedZone: IHostedZone; - - public constructor(scope: Construct, id: string, props: CertificateStackProps) { + public readonly certificate: Certificate + public readonly hostedZone: IHostedZone + + public constructor( + scope: Construct, + id: string, + props: CertificateStackProps, + ) { super(scope, id, { ...props, env: { ...props.env, region: "us-east-1", }, - }); + }) - const { hostedZoneName, alias } = props; + const { hostedZoneName, alias } = props - const domainName = [alias, hostedZoneName].filter(Boolean).join("."); + const domainName = [alias, hostedZoneName].filter(Boolean).join(".") this.hostedZone = HostedZone.fromLookup(this, "HostedZone", { domainName: hostedZoneName, - }); + }) this.certificate = new Certificate(this, "Certificate", { domainName, validation: CertificateValidation.fromDns(this.hostedZone), - }); + }) } } diff --git a/apps/infra/src/lib/stacks/github-oidc-stack.ts b/apps/infra/src/lib/stacks/github-oidc-stack.ts index 5f3c8d0..2215324 100644 --- a/apps/infra/src/lib/stacks/github-oidc-stack.ts +++ b/apps/infra/src/lib/stacks/github-oidc-stack.ts @@ -1,20 +1,30 @@ -import * as cdk from "aws-cdk-lib"; -import type { Construct } from "constructs"; -import { FederatedPrincipal, ManagedPolicy, OpenIdConnectProvider, Role } from "aws-cdk-lib/aws-iam"; +import * as cdk from "aws-cdk-lib/core" +import type { Construct } from "constructs" +import { + FederatedPrincipal, + ManagedPolicy, + OpenIdConnectProvider, + Role, +} from "aws-cdk-lib/aws-iam" -import type { AstroAWSStackProps } from "../types/astro-aws-stack-props"; +import type { AstroAWSStackProps } from "../types/astro-aws-stack-props" +import { Environments } from "../constants/environments" -export type GitHubOIDCStackProps = AstroAWSStackProps; +export type GitHubOIDCStackProps = AstroAWSStackProps export class GitHubOIDCStack extends cdk.Stack { - public constructor(scope: Construct, id: string, props: GitHubOIDCStackProps) { - super(scope, id, props); + public constructor( + scope: Construct, + id: string, + props: GitHubOIDCStackProps, + ) { + super(scope, id, props) const gitHubOIDC = new OpenIdConnectProvider(this, "GitHubOIDC", { clientIds: ["sts.amazonaws.com"], thumbprints: ["6938fd4d98bab03faadb97b34396831e3780aea1"], url: "https://token.actions.githubusercontent.com", - }); + }) new Role(this, "GitHubOIDCAdminRole", { assumedBy: new FederatedPrincipal( @@ -24,30 +34,38 @@ export class GitHubOIDCStack extends cdk.Stack { "token.actions.githubusercontent.com:aud": "sts.amazonaws.com", }, StringLike: { - "token.actions.githubusercontent.com:sub": "repo:lukeshay/astro-aws:*", + "token.actions.githubusercontent.com:sub": + "repo:lukeshay/astro-aws:main", }, }, "sts:AssumeRoleWithWebIdentity", ), - managedPolicies: [ManagedPolicy.fromAwsManagedPolicyName("AdministratorAccess")], + managedPolicies: [ + ManagedPolicy.fromAwsManagedPolicyName("AdministratorAccess"), + ], roleName: "GitHubOIDCAdminRole", - }); + }) - new Role(this, "GitHubOIDCReadOnlyRole", { - assumedBy: new FederatedPrincipal( - gitHubOIDC.openIdConnectProviderArn, - { - StringEquals: { - "token.actions.githubusercontent.com:aud": "sts.amazonaws.com", + if (props.environment !== Environments.PROD) { + new Role(this, "GitHubOIDCReadOnlyRole", { + assumedBy: new FederatedPrincipal( + gitHubOIDC.openIdConnectProviderArn, + { + StringEquals: { + "token.actions.githubusercontent.com:aud": "sts.amazonaws.com", + }, + StringLike: { + "token.actions.githubusercontent.com:sub": + "repo:lukeshay/astro-aws:*", + }, }, - StringLike: { - "token.actions.githubusercontent.com:sub": "repo:lukeshay/astro-aws:*", - }, - }, - "sts:AssumeRoleWithWebIdentity", - ), - managedPolicies: [ManagedPolicy.fromAwsManagedPolicyName("ReadOnlyAccess")], - roleName: "GitHubOIDCReadOnlyRole", - }); + "sts:AssumeRoleWithWebIdentity", + ), + managedPolicies: [ + ManagedPolicy.fromAwsManagedPolicyName("ReadOnlyAccess"), + ], + roleName: "GitHubOIDCReadOnlyRole", + }) + } } } diff --git a/apps/infra/src/lib/stacks/github-users-stack.ts b/apps/infra/src/lib/stacks/github-users-stack.ts new file mode 100644 index 0000000..c54b4de --- /dev/null +++ b/apps/infra/src/lib/stacks/github-users-stack.ts @@ -0,0 +1,91 @@ +import type { Construct } from "constructs" +import { + ManagedPolicy, + User, + AccessKey, + Policy, + PolicyStatement, + Effect, +} from "aws-cdk-lib/aws-iam" +import { SecretValue, Stack } from "aws-cdk-lib/core" + +import type { AstroAWSStackProps } from "../types/astro-aws-stack-props" +import { Secret } from "aws-cdk-lib/aws-secretsmanager" + +export type GitHubUsersStackProps = AstroAWSStackProps + +export class GitHubUsersStack extends Stack { + public constructor( + scope: Construct, + id: string, + props: GitHubUsersStackProps, + ) { + super(scope, id, props) + + const adminUser = new User(this, "GitHubAdminUser", { + managedPolicies: [ + ManagedPolicy.fromAwsManagedPolicyName("AdministratorAccess"), + ], + path: "/astro-aws/users/", + userName: "GitHubAdminUser", + }) + + const readOnlyUser = new User(this, "GitHubReadOnlyUser", { + managedPolicies: [ + ManagedPolicy.fromAwsManagedPolicyName("ReadOnlyAccess"), + ], + path: "/astro-aws/users/", + userName: "GitHubReadOnlyUser", + }) + + const adminAccessKey = new AccessKey(this, "GitHubAdminAccessKey", { + user: adminUser, + }) + + const readOnlyAccessKey = new AccessKey(this, "GitHubReadOnlyAccessKey", { + user: readOnlyUser, + }) + + const adminAccessKeys = new Secret(this, "GitHubAdminUserAccessKeys", { + secretName: "/astro-aws/users/github/GitHubAdminUser/access-keys", + secretObjectValue: { + accessKeyId: SecretValue.unsafePlainText(adminAccessKey.accessKeyId), + secretAccessKey: adminAccessKey.secretAccessKey, + }, + }) + + const readOnlyAccessKeys = new Secret( + this, + "GitHubReadOnlyUserAccessKeys", + { + secretName: "/astro-aws/users/github/GitHubReadOnlyUser/access-keys", + secretObjectValue: { + accessKeyId: SecretValue.unsafePlainText( + readOnlyAccessKey.accessKeyId, + ), + secretAccessKey: readOnlyAccessKey.secretAccessKey, + }, + }, + ) + + const denyGetGitHubKeysPolicy = new Policy( + this, + "DenyGetGitHubKeysPolicy", + { + statements: [ + new PolicyStatement({ + actions: ["secretsmanager:GetSecretValue"], + effect: Effect.DENY, + resources: [ + readOnlyAccessKeys.secretArn, + adminAccessKeys.secretArn, + ], + }), + ], + }, + ) + + adminUser.attachInlinePolicy(denyGetGitHubKeysPolicy) + readOnlyUser.attachInlinePolicy(denyGetGitHubKeysPolicy) + } +} diff --git a/apps/infra/src/lib/stacks/monitoring-stack.ts b/apps/infra/src/lib/stacks/monitoring-stack.ts index d15d62d..a4f10fa 100644 --- a/apps/infra/src/lib/stacks/monitoring-stack.ts +++ b/apps/infra/src/lib/stacks/monitoring-stack.ts @@ -1,24 +1,32 @@ -import { Stack } from "aws-cdk-lib"; -import { Dashboard } from "aws-cdk-lib/aws-cloudwatch"; -import type { Construct } from "constructs"; +import { Stack } from "aws-cdk-lib/core" +import { Dashboard } from "aws-cdk-lib/aws-cloudwatch" +import type { Construct } from "constructs" -import type { AstroAWSStackProps } from "../types/astro-aws-stack-props"; +import type { AstroAWSStackProps } from "../types/astro-aws-stack-props" -export type MonitoringStackProps = AstroAWSStackProps; +export type MonitoringStackProps = AstroAWSStackProps export class MonitoringStack extends Stack { - public readonly cloudwatchDashboard: Dashboard; + public readonly cloudwatchDashboard: Dashboard - public constructor(scope: Construct, id: string, props: MonitoringStackProps) { - super(scope, id, props); + public constructor( + scope: Construct, + id: string, + props: MonitoringStackProps, + ) { + super(scope, id, props) const { environment, env: { region }, - } = props; + } = props - this.cloudwatchDashboard = new Dashboard(this, `AstroAWSDashboard-${environment}-${region}`, { - dashboardName: `AstroAWS-${environment}-${region}`, - }); + this.cloudwatchDashboard = new Dashboard( + this, + `AstroAWSDashboard-${environment}-${region}`, + { + dashboardName: `AstroAWS-${environment}-${region}`, + }, + ) } } diff --git a/apps/infra/src/lib/stacks/redirect-stack.ts b/apps/infra/src/lib/stacks/redirect-stack.ts index 78a90db..0d9f11c 100644 --- a/apps/infra/src/lib/stacks/redirect-stack.ts +++ b/apps/infra/src/lib/stacks/redirect-stack.ts @@ -1,30 +1,41 @@ -import { Stack, Duration } from "aws-cdk-lib"; -import type { Certificate } from "aws-cdk-lib/aws-certificatemanager"; -import { Distribution, Function, FunctionCode, FunctionEventType } from "aws-cdk-lib/aws-cloudfront"; -import type { Construct } from "constructs"; -import type { Dashboard } from "aws-cdk-lib/aws-cloudwatch"; -import type { IHostedZone } from "aws-cdk-lib/aws-route53"; -import { AaaaRecord, ARecord, RecordTarget } from "aws-cdk-lib/aws-route53"; -import { CloudFrontTarget } from "aws-cdk-lib/aws-route53-targets"; -import { HttpOrigin } from "aws-cdk-lib/aws-cloudfront-origins"; +import { Stack, Duration } from "aws-cdk-lib/core" +import type { Certificate } from "aws-cdk-lib/aws-certificatemanager" +import { + Distribution, + Function, + FunctionCode, + FunctionEventType, +} from "aws-cdk-lib/aws-cloudfront" +import type { Construct } from "constructs" +import type { Dashboard } from "aws-cdk-lib/aws-cloudwatch" +import type { IHostedZone } from "aws-cdk-lib/aws-route53" +import { AaaaRecord, ARecord, RecordTarget } from "aws-cdk-lib/aws-route53" +import { CloudFrontTarget } from "aws-cdk-lib/aws-route53-targets" +import { HttpOrigin } from "aws-cdk-lib/aws-cloudfront-origins" -import { DistributionMetric } from "../constructs/distribution-metric.js"; -import { BasicGraphWidget } from "../constructs/basic-graph-widget.js"; -import type { AstroAWSStackProps } from "../types/astro-aws-stack-props.js"; +import { DistributionMetric } from "../constructs/distribution-metric.js" +import { BasicGraphWidget } from "../constructs/basic-graph-widget.js" +import type { AstroAWSStackProps } from "../types/astro-aws-stack-props.js" export type RedirectStackProps = AstroAWSStackProps & { - cloudwatchDashboard: Dashboard; - certificate: Certificate; - hostedZone: IHostedZone; -}; + cloudwatchDashboard: Dashboard + certificate: Certificate + hostedZone: IHostedZone +} export class RedirectStack extends Stack { public constructor(scope: Construct, id: string, props: RedirectStackProps) { - super(scope, id, props); + super(scope, id, props) - const { hostedZoneName, alias, cloudwatchDashboard, hostedZone, certificate } = props; + const { + hostedZoneName, + alias, + cloudwatchDashboard, + hostedZone, + certificate, + } = props - const domainName = [alias, hostedZoneName].filter(Boolean).join("."); + const domainName = [alias, hostedZoneName].filter(Boolean).join(".") const wwwRedirectFunction = new Function(this, "WwwRedirectFunction", { code: FunctionCode.fromInline(` @@ -40,7 +51,7 @@ export class RedirectStack extends Stack { } } `), - }); + }) const distribution = new Distribution(this, "WWWRedirectDistribution", { certificate, @@ -54,19 +65,19 @@ export class RedirectStack extends Stack { origin: new HttpOrigin(domainName.replace("www.", "")), }, domainNames: [domainName], - }); + }) new ARecord(this, "ARecord", { recordName: domainName, target: RecordTarget.fromAlias(new CloudFrontTarget(distribution)), zone: hostedZone, - }); + }) new AaaaRecord(this, "AaaaRecord", { recordName: domainName, target: RecordTarget.fromAlias(new CloudFrontTarget(distribution)), zone: hostedZone, - }); + }) const distribution5xxErrorRateMetric = new DistributionMetric({ distribution, @@ -74,7 +85,7 @@ export class RedirectStack extends Stack { metricName: "5xxErrorRate", period: Duration.minutes(5), statistic: "Sum", - }); + }) const distributionRequestsMetric = new DistributionMetric({ distribution, @@ -82,11 +93,11 @@ export class RedirectStack extends Stack { metricName: "Requests", period: Duration.minutes(5), statistic: "Sum", - }); + }) cloudwatchDashboard.addWidgets( new BasicGraphWidget({ metric: distribution5xxErrorRateMetric }), new BasicGraphWidget({ metric: distributionRequestsMetric }), - ); + ) } } diff --git a/apps/infra/src/lib/stacks/website-stack.ts b/apps/infra/src/lib/stacks/website-stack.ts index 347e424..6cff1ee 100644 --- a/apps/infra/src/lib/stacks/website-stack.ts +++ b/apps/infra/src/lib/stacks/website-stack.ts @@ -1,40 +1,57 @@ -import { env } from "node:process"; - -import { CfnOutput, Duration, Stack } from "aws-cdk-lib"; -import type { Certificate } from "aws-cdk-lib/aws-certificatemanager"; -import { CachePolicy, PriceClass, ResponseHeadersPolicy } from "aws-cdk-lib/aws-cloudfront"; -import { Architecture } from "aws-cdk-lib/aws-lambda"; -import type { Construct } from "constructs"; -import { AstroAWS } from "@astro-aws/constructs"; -import type { Dashboard } from "aws-cdk-lib/aws-cloudwatch"; -import type { IHostedZone } from "aws-cdk-lib/aws-route53"; -import { AaaaRecord, ARecord, RecordTarget } from "aws-cdk-lib/aws-route53"; -import { CloudFrontTarget } from "aws-cdk-lib/aws-route53-targets"; -import { BlockPublicAccess, Bucket, BucketEncryption } from "aws-cdk-lib/aws-s3"; - -import { DistributionMetric } from "../constructs/distribution-metric.js"; -import { BasicGraphWidget } from "../constructs/basic-graph-widget.js"; -import { Environments } from "../constants/environments.js"; -import type { AstroAWSStackProps } from "../types/astro-aws-stack-props.js"; +import { env } from "node:process" + +import { CfnOutput, Duration, Stack } from "aws-cdk-lib/core" +import type { Certificate } from "aws-cdk-lib/aws-certificatemanager" +import { + CachePolicy, + PriceClass, + ResponseHeadersPolicy, +} from "aws-cdk-lib/aws-cloudfront" +import { Architecture } from "aws-cdk-lib/aws-lambda" +import type { Construct } from "constructs" +import { AstroAWS } from "@astro-aws/constructs" +import type { Dashboard } from "aws-cdk-lib/aws-cloudwatch" +import type { IHostedZone } from "aws-cdk-lib/aws-route53" +import { AaaaRecord, ARecord, RecordTarget } from "aws-cdk-lib/aws-route53" +import { CloudFrontTarget } from "aws-cdk-lib/aws-route53-targets" +import { + BlockPublicAccess, + Bucket, + BucketAccessControl, + BucketEncryption, +} from "aws-cdk-lib/aws-s3" + +import { DistributionMetric } from "../constructs/distribution-metric.js" +import { BasicGraphWidget } from "../constructs/basic-graph-widget.js" +import { Environments } from "../constants/environments.js" +import type { AstroAWSStackProps } from "../types/astro-aws-stack-props.js" export type WebsiteStackProps = AstroAWSStackProps & { - cloudwatchDashboard: Dashboard; - certificate?: Certificate; - hostedZone?: IHostedZone; -}; + cloudwatchDashboard: Dashboard + certificate?: Certificate + hostedZone?: IHostedZone +} export class WebsiteStack extends Stack { public constructor(scope: Construct, id: string, props: WebsiteStackProps) { - super(scope, id, props); + super(scope, id, props) - const { hostedZoneName, alias, cloudwatchDashboard, environment, output, certificate, hostedZone } = props; + const { + hostedZoneName, + alias, + cloudwatchDashboard, + environment, + output, + certificate, + hostedZone, + } = props - const domainName = [alias, hostedZoneName].filter(Boolean).join("."); - const domainNames = [domainName].filter(Boolean); + const domainName = [alias, hostedZoneName].filter(Boolean).join(".") + const domainNames = [domainName].filter(Boolean) const cachePolicy = new CachePolicy(this, "CachePolicy", { minTtl: Duration.days(365), - }); + }) // const cfLogInjestFunction = Function.fromFunctionAttributes(this, "CfLogInjestLambda", { // architecture: Architecture.ARM_64, @@ -43,9 +60,10 @@ export class WebsiteStack extends Stack { // }); const accessLogBucket = new Bucket(this, "AccessLogBucket", { + accessControl: BucketAccessControl.LOG_DELIVERY_WRITE, blockPublicAccess: BlockPublicAccess.BLOCK_ALL, encryption: BucketEncryption.S3_MANAGED, - }); + }) // accessLogBucket.addObjectCreatedNotification(new LambdaDestination(cfLogInjestFunction), { // prefix: "cloudfront/", @@ -58,14 +76,19 @@ export class WebsiteStack extends Stack { comment: environment, defaultBehavior: { cachePolicy, - responseHeadersPolicy: new ResponseHeadersPolicy(this, "ResponseHeadersPolicy", { - securityHeadersBehavior: { - contentSecurityPolicy: { - contentSecurityPolicy: "default-src 'self'; upgrade-insecure-requests", - override: true, + responseHeadersPolicy: new ResponseHeadersPolicy( + this, + "ResponseHeadersPolicy", + { + securityHeadersBehavior: { + contentSecurityPolicy: { + contentSecurityPolicy: + "default-src 'self'; upgrade-insecure-requests", + override: true, + }, }, }, - }), + ), }, domainNames, errorResponses: [ @@ -76,34 +99,44 @@ export class WebsiteStack extends Stack { ], logBucket: accessLogBucket, logFilePrefix: "cloudfront/", - priceClass: environment === Environments.PROD ? PriceClass.PRICE_CLASS_ALL : PriceClass.PRICE_CLASS_100, - webAclId: env.WEB_ACL_ARN && env.WEB_ACL_ARN.length > 0 ? env.WEB_ACL_ARN : undefined, + priceClass: + environment === Environments.PROD + ? PriceClass.PRICE_CLASS_ALL + : PriceClass.PRICE_CLASS_100, + webAclId: + env.WEB_ACL_ARN && env.WEB_ACL_ARN.length > 0 + ? env.WEB_ACL_ARN + : undefined, }, lambdaFunction: { - architecture: output === "edge" ? Architecture.X86_64 : Architecture.ARM_64, + architecture: + output === "edge" ? Architecture.X86_64 : Architecture.ARM_64, }, s3Bucket: { serverAccessLogsBucket: accessLogBucket, serverAccessLogsPrefix: "s3/", }, }, - node16: environment === Environments.DEV_NODE_16, outDir: `../www/dist/${output === "static" ? "static" : "server"}`, output, - }); + }) if (hostedZone) { new ARecord(this, "ARecord", { recordName: domainName, - target: RecordTarget.fromAlias(new CloudFrontTarget(astroAwsConstruct.cdk.cloudfrontDistribution)), + target: RecordTarget.fromAlias( + new CloudFrontTarget(astroAwsConstruct.cdk.cloudfrontDistribution), + ), zone: hostedZone, - }); + }) new AaaaRecord(this, "AaaaRecord", { recordName: domainName, - target: RecordTarget.fromAlias(new CloudFrontTarget(astroAwsConstruct.cdk.cloudfrontDistribution)), + target: RecordTarget.fromAlias( + new CloudFrontTarget(astroAwsConstruct.cdk.cloudfrontDistribution), + ), zone: hostedZone, - }); + }) } const distribution5xxErrorRateMetric = new DistributionMetric({ @@ -112,7 +145,7 @@ export class WebsiteStack extends Stack { metricName: "5xxErrorRate", period: Duration.minutes(5), statistic: "Sum", - }); + }) const distributionRequestsMetric = new DistributionMetric({ distribution: astroAwsConstruct.cdk.cloudfrontDistribution, @@ -120,54 +153,59 @@ export class WebsiteStack extends Stack { metricName: "Requests", period: Duration.minutes(5), statistic: "Sum", - }); + }) const widgets = [ new BasicGraphWidget({ metric: distribution5xxErrorRateMetric }), new BasicGraphWidget({ metric: distributionRequestsMetric }), - ]; + ] if (astroAwsConstruct.cdk.lambdaFunction) { - const lambdaFailureRateMetric = astroAwsConstruct.cdk.lambdaFunction.metricErrors({ - label: "Lambda failure rate", - period: Duration.minutes(5), - statistic: "sum", - }); - - const lambdaInvocationsMetric = astroAwsConstruct.cdk.lambdaFunction.metricInvocations({ - label: "Lambda invocations", - period: Duration.minutes(5), - statistic: "sum", - }); - - const lambdaDurationMetric = astroAwsConstruct.cdk.lambdaFunction.metricDuration({ - label: "Lambda duration", - period: Duration.minutes(5), - statistic: "avg", - }); - - const lambdaThrottlesMetric = astroAwsConstruct.cdk.lambdaFunction.metricThrottles({ - label: "Lambda throttles", - period: Duration.minutes(5), - statistic: "sum", - }); + const lambdaFailureRateMetric = + astroAwsConstruct.cdk.lambdaFunction.metricErrors({ + label: "Lambda failure rate", + period: Duration.minutes(5), + statistic: "sum", + }) + + const lambdaInvocationsMetric = + astroAwsConstruct.cdk.lambdaFunction.metricInvocations({ + label: "Lambda invocations", + period: Duration.minutes(5), + statistic: "sum", + }) + + const lambdaDurationMetric = + astroAwsConstruct.cdk.lambdaFunction.metricDuration({ + label: "Lambda duration", + period: Duration.minutes(5), + statistic: "avg", + }) + + const lambdaThrottlesMetric = + astroAwsConstruct.cdk.lambdaFunction.metricThrottles({ + label: "Lambda throttles", + period: Duration.minutes(5), + statistic: "sum", + }) widgets.push( new BasicGraphWidget({ metric: lambdaFailureRateMetric }), new BasicGraphWidget({ metric: lambdaInvocationsMetric }), new BasicGraphWidget({ metric: lambdaDurationMetric }), new BasicGraphWidget({ metric: lambdaThrottlesMetric }), - ); + ) } - cloudwatchDashboard.addWidgets(...widgets); + cloudwatchDashboard.addWidgets(...widgets) new CfnOutput(this, "CloudFrontDistributionId", { value: astroAwsConstruct.cdk.cloudfrontDistribution.distributionId, - }); + }) new CfnOutput(this, "CloudFrontDomainName", { - value: astroAwsConstruct.cdk.cloudfrontDistribution.distributionDomainName, - }); + value: + astroAwsConstruct.cdk.cloudfrontDistribution.distributionDomainName, + }) } } diff --git a/apps/infra/src/lib/types/astro-aws-stack-props.ts b/apps/infra/src/lib/types/astro-aws-stack-props.ts index e72991c..06fddc3 100644 --- a/apps/infra/src/lib/types/astro-aws-stack-props.ts +++ b/apps/infra/src/lib/types/astro-aws-stack-props.ts @@ -1,17 +1,17 @@ -import type { StackProps } from "aws-cdk-lib"; +import type { StackProps } from "aws-cdk-lib/core" -import type { Environment } from "../constants/environments.js"; +import type { Environment } from "../constants/environments.js" export type AstroAWSStackProps = Readonly< Omit & { env: { - account: string; - region: string; - }; - environment: Environment; - alias?: string; - hostedZoneName?: string; - output: "edge" | "server" | "static"; - skipDashboard?: boolean; + account: string + region: string + } + environment: Environment + alias?: string + hostedZoneName?: string + output: "edge" | "server" | "static" + skipDashboard?: boolean } ->; +> diff --git a/apps/www/README.md b/apps/www/README.md index f159a93..68f43cd 100644 --- a/apps/www/README.md +++ b/apps/www/README.md @@ -91,7 +91,7 @@ export const SIDEBAR = { { text: "Another Section", header: true }, { text: "Page 4", link: "en/page-4" }, ], -}; +} ``` Note the top-level `en` key: This is needed for multi-language support. You can change it to whatever language you'd like, or add new languages as you go. More details on this below. diff --git a/apps/www/astro.config.ts b/apps/www/astro.config.ts index 7dfcb85..0f36974 100644 --- a/apps/www/astro.config.ts +++ b/apps/www/astro.config.ts @@ -1,12 +1,12 @@ -import process from "node:process"; +import process from "node:process" -import { defineConfig } from "astro/config"; -import aws from "@astro-aws/adapter"; -import mdx from "@astrojs/mdx"; -import sitemap from "@astrojs/sitemap"; -import remarkToc from "remark-toc"; +import { defineConfig } from "astro/config" +import aws from "@astro-aws/adapter" +import mdx from "@astrojs/mdx" +import sitemap from "@astrojs/sitemap" +import remarkToc from "remark-toc" -const isSSR = process.env.SSR_BUILD === "true"; +const isSSR = process.env.SSR_BUILD === "true" // https://astro.build/config export default defineConfig({ @@ -23,4 +23,4 @@ export default defineConfig({ outDir: isSSR ? "dist/server" : "dist/static", output: isSSR ? "server" : "static", site: `https://astro-aws.org/`, -}); +}) diff --git a/apps/www/package.json b/apps/www/package.json index fb9c84b..be8ddf5 100644 --- a/apps/www/package.json +++ b/apps/www/package.json @@ -53,6 +53,6 @@ "prettier": "^2.8.4" }, "engines": { - "node": "16.x || 18.x" + "node": "18.x" } } diff --git a/apps/www/postcss.config.cjs b/apps/www/postcss.config.cjs index 80cd5ff..65994d3 100644 --- a/apps/www/postcss.config.cjs +++ b/apps/www/postcss.config.cjs @@ -3,4 +3,4 @@ module.exports = { autoprefixer: {}, tailwindcss: {}, }, -}; +} diff --git a/apps/www/src/components/html/icons/24/outline/create-clipboard-document-icon.ts b/apps/www/src/components/html/icons/24/outline/create-clipboard-document-icon.ts index 5f5f021..cf371ab 100644 --- a/apps/www/src/components/html/icons/24/outline/create-clipboard-document-icon.ts +++ b/apps/www/src/components/html/icons/24/outline/create-clipboard-document-icon.ts @@ -1,7 +1,7 @@ export const createClipboardDocumentIcon = ({ class: clazz, }: { - class: string; + class: string }) => ` -`; +` diff --git a/apps/www/src/pages/docs/index.md b/apps/www/src/pages/docs/index.md index 9799453..aafb75e 100644 --- a/apps/www/src/pages/docs/index.md +++ b/apps/www/src/pages/docs/index.md @@ -80,20 +80,24 @@ pnpm i @astro-aws/constructs ### Modify `lib/hello-cdk-stack.ts` to contain the following ```ts -import { Stack } from "aws-cdk-lib"; -import type { StackProps } from "aws-cdk-lib"; -import { AstroAWSConstruct } from "@astro-aws/constructs"; +import { Stack } from "aws-cdk-lib/core" +import type { StackProps } from "aws-cdk-lib/core" +import { AstroAWSConstruct } from "@astro-aws/constructs" export interface HelloCdkStackProps extends StackProps {} export class HelloCdkStack extends Stack { - public constructor(scope: Construct, id: string, props: HelloCdkStackProps) { - super(scope, id, props); + public constructor( + scope: Construct, + id: string, + props: HelloCdkStackProps, + ) { + super(scope, id, props) new AstroAWSConstruct(this, "AstroAWSConstruct", { output: "server", websiteDir: "../my-astro-project", - }); + }) } } ``` diff --git a/apps/www/tailwind.config.cjs b/apps/www/tailwind.config.cjs index d03e8bd..f958413 100644 --- a/apps/www/tailwind.config.cjs +++ b/apps/www/tailwind.config.cjs @@ -18,4 +18,4 @@ module.exports = { theme: { extend: {}, }, -}; +} diff --git a/constraints.pro b/constraints.pro index 284e884..d39622d 100644 --- a/constraints.pro +++ b/constraints.pro @@ -30,7 +30,7 @@ gen_enforced_dependency(WorkspaceCwd, DependencyIdent, 'workspace:^', Dependency % This rule will enforce that all packages must have an correct engines.node field % Keep in sync with the range inside packages/yarnpkg-cli/sources/main.ts -gen_enforced_field(WorkspaceCwd, 'engines.node', '16.x || 18.x'). +gen_enforced_field(WorkspaceCwd, 'engines.node', '18.x'). % Required to make the package work with the GitHub Package Registry gen_enforced_field(WorkspaceCwd, 'repository.type', 'git'). diff --git a/package.json b/package.json index c30a9b9..2800630 100644 --- a/package.json +++ b/package.json @@ -41,19 +41,19 @@ }, "dependencies": { "@changesets/changelog-github": "^0.4.8", - "@changesets/cli": "^2.26.0", - "@lshay/eslint-config": "^0.2.2", - "@lshay/prettier-config": "^0.5.3", - "@rushstack/eslint-patch": "^1.2.0", - "eslint": "^8.34.0", - "eslint-import-resolver-typescript": "^3.5.3", - "eslint-plugin-import": "^2.27.5", - "prettier": "^2.8.4", - "turbo": "^1.8.0", - "typescript": "^4.9.5" + "@changesets/cli": "^2.26.2", + "@lshay/eslint-config": "^0.3.5", + "@lshay/prettier-config": "^0.6.0", + "@rushstack/eslint-patch": "^1.3.3", + "eslint": "^8.48.0", + "eslint-import-resolver-typescript": "^3.6.0", + "eslint-plugin-import": "^2.28.1", + "prettier": "^3.0.3", + "turbo": "^1.10.13", + "typescript": "^5.2.2" }, "packageManager": "yarn@3.4.1", "engines": { - "node": "16.x || 18.x" + "node": "18.x" } } diff --git a/packages/adapter/README.md b/packages/adapter/README.md index 6dad1c8..87b1bbe 100644 --- a/packages/adapter/README.md +++ b/packages/adapter/README.md @@ -33,13 +33,13 @@ pnpm add @astro-aws/adapter 2. Add the following to your `astro.config.mjs` file. ```js -import { defineConfig } from "astro/config"; -import astroAws from "@astro-aws/adapter"; +import { defineConfig } from "astro/config" +import astroAws from "@astro-aws/adapter" export default defineConfig({ output: "server", adapter: astroAws(), -}); +}) ``` ## Example diff --git a/packages/adapter/package.json b/packages/adapter/package.json index 557dd9f..b99e397 100644 --- a/packages/adapter/package.json +++ b/packages/adapter/package.json @@ -67,7 +67,7 @@ "astro": ">=1" }, "engines": { - "node": "16.x || 18.x" + "node": "18.x" }, "publishConfig": { "access": "public" diff --git a/packages/adapter/src/__tests__/index.test.ts b/packages/adapter/src/__tests__/index.test.ts index 07b2d78..9b4fcfa 100644 --- a/packages/adapter/src/__tests__/index.test.ts +++ b/packages/adapter/src/__tests__/index.test.ts @@ -1,38 +1,38 @@ // eslint-disable-next-line eslint-comments/disable-enable-pair /* eslint-disable @typescript-eslint/no-unsafe-assignment */ -import { writeFile } from "node:fs/promises"; -import { URL, fileURLToPath } from "node:url"; +import { writeFile } from "node:fs/promises" +import { URL, fileURLToPath } from "node:url" -import { afterEach, beforeEach, describe, expect, test, vi } from "vitest"; -import { faker } from "@faker-js/faker"; -import type { AstroConfig, AstroIntegration, RouteData } from "astro"; +import { afterEach, beforeEach, describe, expect, test, vi } from "vitest" +import { faker } from "@faker-js/faker" +import type { AstroConfig, AstroIntegration, RouteData } from "astro" -import type { Args } from "../args.js"; -import { ADAPTER_NAME } from "../constants.js"; -import { astroAWSFunctions, getAdapter } from "../index.js"; -import { bundleEntry } from "../shared.js"; +import type { Args } from "../args.js" +import { ADAPTER_NAME } from "../constants.js" +import { astroAWSFunctions, getAdapter } from "../index.js" +import { bundleEntry } from "../shared.js" -vi.mock("node:fs/promises"); -vi.mock("../shared.js"); +vi.mock("node:fs/promises") +vi.mock("../shared.js") describe("index.ts", () => { afterEach(() => { - vi.resetAllMocks(); - }); + vi.resetAllMocks() + }) describe("getAdapter", () => { - let args: Args, result: ReturnType; + let args: Args, result: ReturnType beforeEach(() => { args = { binaryMediaTypes: [faker.datatype.string()], - }; - }); + } + }) describe("when there are arguments", () => { beforeEach(() => { - result = getAdapter(args); - }); + result = getAdapter(args) + }) test("should return the adapter info", () => { expect(result).toStrictEqual({ @@ -40,14 +40,14 @@ describe("index.ts", () => { exports: ["handler"], name: ADAPTER_NAME, serverEntrypoint: `${ADAPTER_NAME}/lambda/index.js`, - }); - }); - }); + }) + }) + }) describe("when there are **not** arguments", () => { beforeEach(() => { - result = getAdapter(); - }); + result = getAdapter() + }) test("should return the adapter info", () => { expect(result).toStrictEqual({ @@ -55,46 +55,52 @@ describe("index.ts", () => { exports: ["handler"], name: ADAPTER_NAME, serverEntrypoint: `${ADAPTER_NAME}/lambda/index.js`, - }); - }); - }); - }); + }) + }) + }) + }) describe("astroAWSFunctions", () => { - let result: AstroIntegration, args: Args; + let result: AstroIntegration, args: Args beforeEach(() => { args = { binaryMediaTypes: [faker.datatype.string()], - }; - }); + } + }) describe("always", () => { beforeEach(() => { - result = astroAWSFunctions(args); - }); + result = astroAWSFunctions(args) + }) test("should return the name and hooks", () => { expect(result).toStrictEqual({ hooks: expect.any(Object), name: ADAPTER_NAME, - }); - }); - }); + }) + }) + }) describe("hooks", () => { let config: AstroConfig, routes: RouteData[], - astroConfigSetup: NonNullable, - astroConfigDone: NonNullable, - astroBuildDone: NonNullable, + astroConfigSetup: NonNullable< + AstroIntegration["hooks"]["astro:config:setup"] + >, + astroConfigDone: NonNullable< + AstroIntegration["hooks"]["astro:config:done"] + >, + astroBuildDone: NonNullable< + AstroIntegration["hooks"]["astro:build:done"] + >, updateConfig: vi.MockedFunction, - setAdapter: vi.MockedFunction; + setAdapter: vi.MockedFunction beforeEach(() => { - result = astroAWSFunctions(args); + result = astroAWSFunctions(args) - const outDir = new URL(`file://${faker.system.directoryPath()}/`); + const outDir = new URL(`file://${faker.system.directoryPath()}/`) config = { build: { @@ -102,7 +108,7 @@ describe("index.ts", () => { serverEntry: "entry.mjs", }, outDir, - } as unknown as AstroConfig; + } as unknown as AstroConfig routes = [ { route: faker.datatype.string(), @@ -113,75 +119,75 @@ describe("index.ts", () => { { route: faker.datatype.string(), } as unknown as RouteData, - ]; + ] - updateConfig = vi.fn(); - setAdapter = vi.fn(); + updateConfig = vi.fn() + setAdapter = vi.fn() /* eslint-disable @typescript-eslint/no-non-null-assertion*/ - astroConfigSetup = result.hooks["astro:config:setup"]!; - astroConfigDone = result.hooks["astro:config:done"]!; - astroBuildDone = result.hooks["astro:build:done"]!; + astroConfigSetup = result.hooks["astro:config:setup"]! + astroConfigDone = result.hooks["astro:config:done"]! + astroBuildDone = result.hooks["astro:build:done"]! /* eslint-enable @typescript-eslint/no-non-null-assertion*/ - }); + }) describe("astro:config:setup", () => { beforeEach(async () => { await astroConfigSetup({ config, updateConfig, - } as unknown as Parameters[0]); - }); + } as unknown as Parameters[0]) + }) test("should call updateConfig", () => { - expect(updateConfig).toHaveBeenCalledTimes(1); + expect(updateConfig).toHaveBeenCalledTimes(1) expect(updateConfig).toHaveBeenCalledWith({ build: { client: new URL("client/", config.outDir), server: new URL("server/", config.outDir), serverEntry: "entry.mjs", }, - }); - }); - }); + }) + }) + }) describe("astro:config:done", () => { beforeEach(async () => { await astroConfigDone({ config, setAdapter, - } as unknown as Parameters[0]); - }); + } as unknown as Parameters[0]) + }) test("should call setAdapter", () => { - expect(setAdapter).toHaveBeenCalledTimes(1); - expect(setAdapter).toHaveBeenCalledWith(getAdapter(args)); - }); - }); + expect(setAdapter).toHaveBeenCalledTimes(1) + expect(setAdapter).toHaveBeenCalledWith(getAdapter(args)) + }) + }) describe("astro:build:done", () => { beforeEach(async () => { await astroConfigDone({ config, setAdapter, - } as unknown as Parameters[0]); + } as unknown as Parameters[0]) await astroBuildDone({ routes, - } as unknown as Parameters[0]); - }); + } as unknown as Parameters[0]) + }) test("should call writeFile 2 times", () => { - expect(writeFile).toHaveBeenCalledTimes(2); - }); + expect(writeFile).toHaveBeenCalledTimes(2) + }) test("should call writeFile with the routes", () => { expect(writeFile).toHaveBeenNthCalledWith( 1, fileURLToPath(new URL("routes.json", config.outDir)), JSON.stringify(routes, undefined, 2), - ); - }); + ) + }) test("should call writeFile with the invalidate paths", () => { expect(writeFile).toHaveBeenNthCalledWith( @@ -192,18 +198,20 @@ describe("index.ts", () => { undefined, 2, ), - ); - }); + ) + }) test("should call bundleEntry", () => { - expect(bundleEntry).toHaveBeenCalledTimes(1); + expect(bundleEntry).toHaveBeenCalledTimes(1) expect(bundleEntry).toHaveBeenCalledWith( - fileURLToPath(new URL(config.build.serverEntry, config.build.server)), + fileURLToPath( + new URL(config.build.serverEntry, config.build.server), + ), fileURLToPath(new URL("lambda", config.outDir)), args, - ); - }); - }); - }); - }); -}); + ) + }) + }) + }) + }) +}) diff --git a/packages/adapter/src/args.ts b/packages/adapter/src/args.ts index 76793c1..01df82f 100644 --- a/packages/adapter/src/args.ts +++ b/packages/adapter/src/args.ts @@ -1,14 +1,17 @@ -import type { BuildOptions } from "esbuild"; +import type { BuildOptions } from "esbuild" -export type EsBuildOptions = Omit; +export type EsBuildOptions = Omit< + BuildOptions, + "bundle" | "entryPoints" | "outdir" | "platform" +> export type Args = { /** Specifies what media types need to be base64 encoded. */ - binaryMediaTypes?: string[]; + binaryMediaTypes?: string[] /** Configures ESBuild options that are not configured automatically. */ - esBuildOptions?: EsBuildOptions; + esBuildOptions?: EsBuildOptions /** Enables a log message that prints the request the lambda receives. */ - logFnRequest?: boolean; + logFnRequest?: boolean /** Enables a log message that prints the response the lambda returns. */ - logFnResponse?: boolean; -}; + logFnResponse?: boolean +} diff --git a/packages/adapter/src/constants.ts b/packages/adapter/src/constants.ts index 87af6aa..1f51e27 100644 --- a/packages/adapter/src/constants.ts +++ b/packages/adapter/src/constants.ts @@ -1 +1 @@ -export const ADAPTER_NAME = "@astro-aws/adapter"; +export const ADAPTER_NAME = "@astro-aws/adapter" diff --git a/packages/adapter/src/index.ts b/packages/adapter/src/index.ts index 304653d..163c74f 100644 --- a/packages/adapter/src/index.ts +++ b/packages/adapter/src/index.ts @@ -1,22 +1,22 @@ -import { writeFile } from "node:fs/promises"; -import { fileURLToPath } from "node:url"; +import { writeFile } from "node:fs/promises" +import { fileURLToPath } from "node:url" -import type { AstroAdapter, AstroConfig, AstroIntegration } from "astro"; +import type { AstroAdapter, AstroConfig, AstroIntegration } from "astro" -import type { Args } from "./args.js"; -import { bundleEntry } from "./shared.js"; -import { ADAPTER_NAME } from "./constants.js"; -import { warn } from "./log.js"; +import type { Args } from "./args.js" +import { bundleEntry } from "./shared.js" +import { ADAPTER_NAME } from "./constants.js" +import { warn } from "./log.js" export const getAdapter = (args: Args = {}): AstroAdapter => ({ args, exports: ["handler"], name: ADAPTER_NAME, serverEntrypoint: `${ADAPTER_NAME}/lambda/index.js`, -}); +}) export const astroAWSFunctions = (args: Args = {}): AstroIntegration => { - let astroConfig: AstroConfig; + let astroConfig: AstroConfig /* eslint-disable sort-keys */ return { @@ -29,40 +29,44 @@ export const astroAWSFunctions = (args: Args = {}): AstroIntegration => { server: new URL("server/", config.outDir), serverEntry: "entry.mjs", }, - }); + }) }, "astro:config:done": ({ config, setAdapter }) => { - setAdapter(getAdapter(args)); + setAdapter(getAdapter(args)) - astroConfig = config; + astroConfig = config if (config.output === "static") { - warn('`output: "server"` is required to use this adapter.'); - warn("Otherwise, this adapter is not required to deploy a static site to AWS."); + warn('`output: "server"` is required to use this adapter.') + warn( + "Otherwise, this adapter is not required to deploy a static site to AWS.", + ) } }, "astro:build:done": async ({ routes }) => { await writeFile( fileURLToPath(new URL("routes.json", astroConfig.outDir)), JSON.stringify(routes, undefined, 2), - ); + ) - const invalidationPaths = routes.map((route) => route.route); + const invalidationPaths = routes.map((route) => route.route) await writeFile( fileURLToPath(new URL("invalidationPaths.json", astroConfig.outDir)), JSON.stringify(invalidationPaths, undefined, 2), - ); + ) await bundleEntry( - fileURLToPath(new URL(astroConfig.build.serverEntry, astroConfig.build.server)), + fileURLToPath( + new URL(astroConfig.build.serverEntry, astroConfig.build.server), + ), fileURLToPath(new URL("lambda", astroConfig.outDir)), args, - ); + ) }, }, - }; + } /* eslint-enable sort-keys */ -}; +} -export default astroAWSFunctions; +export default astroAWSFunctions diff --git a/packages/adapter/src/lambda/__tests__/helpers.test.ts b/packages/adapter/src/lambda/__tests__/helpers.test.ts index 85cc97a..c46855a 100644 --- a/packages/adapter/src/lambda/__tests__/helpers.test.ts +++ b/packages/adapter/src/lambda/__tests__/helpers.test.ts @@ -1,10 +1,14 @@ -import type { App } from "astro/app"; -import { beforeEach, describe, expect, test, vi } from "vitest"; -import { faker } from "@faker-js/faker"; +import type { App } from "astro/app" +import { beforeEach, describe, expect, test, vi } from "vitest" +import { faker } from "@faker-js/faker" +<<<<<<< HEAD import { createLambdaFunctionResponse, createLambdaEdgeFunctionResponse } from "../helpers.js"; +======= +import { createLambdaFunctionResponse } from "../helpers.js" +>>>>>>> ddb6036 (chore: updated deps) -const knownBinaryMediaTypes = new Set(["image/png", "image/jpeg"]); +const knownBinaryMediaTypes = new Set(["image/png", "image/jpeg"]) describe("helpers", () => { describe("createFunctionResponse", () => { @@ -12,29 +16,33 @@ describe("helpers", () => { app: App, fnResponse: Awaited>, body: string, - headers: Record; + headers: Record beforeEach(async () => { - body = faker.datatype.string(); + body = faker.datatype.string() headers = { "content-type": "text/plain", - }; + } response = new Response(body, { headers, status: 200, - }); + }) app = { setCookieHeaders: vi.fn(() => []), - } as unknown as App; + } as unknown as App - fnResponse = await createLambdaFunctionResponse(app, response, knownBinaryMediaTypes); - }); + fnResponse = await createLambdaFunctionResponse( + app, + response, + knownBinaryMediaTypes, + ) + }) test("creates function response", () => { - expect(app.setCookieHeaders).toHaveBeenCalledTimes(1); - expect(app.setCookieHeaders).toHaveBeenCalledWith(response); + expect(app.setCookieHeaders).toHaveBeenCalledTimes(1) + expect(app.setCookieHeaders).toHaveBeenCalledWith(response) expect(fnResponse).toStrictEqual({ body, @@ -42,6 +50,7 @@ describe("helpers", () => { headers, isBase64Encoded: false, statusCode: 200, +<<<<<<< HEAD }); }); }); @@ -105,3 +114,9 @@ describe("helpers", () => { }); }); }); +======= + }) + }) + }) +}) +>>>>>>> ddb6036 (chore: updated deps) diff --git a/packages/adapter/src/lambda/constants.ts b/packages/adapter/src/lambda/constants.ts index 56963c2..2f56b75 100644 --- a/packages/adapter/src/lambda/constants.ts +++ b/packages/adapter/src/lambda/constants.ts @@ -34,4 +34,4 @@ export const DISALLOWED_EDGE_HEADERS = [ "Via", "X-Amz-Cf-.*", "X-Edge-.*", -].map((str) => new RegExp(`^${str.toLowerCase()}$`, "u")); +].map((str) => new RegExp(`^${str.toLowerCase()}$`, "u")) diff --git a/packages/adapter/src/lambda/handler.ts b/packages/adapter/src/lambda/handler.ts index 1569022..f3768fb 100644 --- a/packages/adapter/src/lambda/handler.ts +++ b/packages/adapter/src/lambda/handler.ts @@ -1,57 +1,80 @@ -import type { NodeApp } from "astro/app/node"; -import type { APIGatewayProxyEventV2, CloudFrontRequestEvent } from "aws-lambda"; +import type { NodeApp } from "astro/app/node" +import type { APIGatewayProxyEventV2, CloudFrontRequestEvent } from "aws-lambda" -import type { Args } from "../args.js"; -import { log } from "../log.js"; +import type { Args } from "../args.js" +import { log } from "../log.js" -import { createLambdaEdgeFunctionResponse, createLambdaFunctionResponse, createRequestBody } from "./helpers.js"; +import { + createLambdaEdgeFunctionResponse, + createLambdaFunctionResponse, + createRequestBody, +} from "./helpers.js" export const createHandler = - (app: NodeApp, knownBinaryMediaTypes: Set, { logFnResponse, logFnRequest }: Args) => + ( + app: NodeApp, + knownBinaryMediaTypes: Set, + { logFnResponse, logFnRequest }: Args, + ) => async (originalEvent: APIGatewayProxyEventV2 | CloudFrontRequestEvent) => { if (logFnRequest) { - log("function request", JSON.stringify(originalEvent, undefined, 2)); + log("function request", JSON.stringify(originalEvent, undefined, 2)) } if ("Records" in originalEvent) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const cloudfrontRequest = originalEvent.Records[0]!.cf.request; + const cloudfrontRequest = originalEvent.Records[0]!.cf.request - const { body, headers: eventHeaders, querystring, uri, method } = cloudfrontRequest; + const { + body, + headers: eventHeaders, + querystring, + uri, + method, + } = cloudfrontRequest const headers = new Headers( Object.fromEntries( - Object.entries(eventHeaders).map(([key, value]) => [value[0]?.key ?? key, value[0]?.value]), + Object.entries(eventHeaders).map(([key, value]) => [ + value[0]?.key ?? key, + value[0]?.value, + ]), ) as HeadersInit, - ); + ) - const scheme = headers.get("x-forwarded-protocol") ?? "https"; - const host = headers.get("x-forwarded-host") ?? headers.get("host") ?? ""; - const qs = querystring.length ? `?${querystring}` : ""; - const url = new URL(`${uri}${qs}`, `${scheme}://${host}`); + const scheme = headers.get("x-forwarded-protocol") ?? "https" + const host = headers.get("x-forwarded-host") ?? headers.get("host") ?? "" + const qs = querystring.length ? `?${querystring}` : "" + const url = new URL(`${uri}${qs}`, `${scheme}://${host}`) const request = new Request(url, { - body: body?.data ? createRequestBody(method, body.data, body.encoding) : undefined, + body: body?.data + ? createRequestBody(method, body.data, body.encoding) + : undefined, headers, method, - }); - const routeData = app.match(request); + }) + const routeData = app.match(request) if (!routeData) { - return cloudfrontRequest; + return cloudfrontRequest } - const response = await app.render(request, routeData); - const fnResponse = await createLambdaEdgeFunctionResponse(app, response, knownBinaryMediaTypes); + const response = await app.render(request, routeData) + const fnResponse = await createLambdaEdgeFunctionResponse( + app, + response, + knownBinaryMediaTypes, + ) if (logFnResponse) { - log("function response", JSON.stringify(fnResponse, undefined, 2)); + log("function response", JSON.stringify(fnResponse, undefined, 2)) } - return fnResponse; + return fnResponse } - const event = originalEvent; + const event = originalEvent const { body: requestBody, @@ -63,38 +86,42 @@ export const createHandler = requestContext: { http: { method }, }, - } = event; + } = event const headers = new Headers({ ...eventHeaders, cookie: cookies?.join("; ") ?? "", - }); + }) - const scheme = eventHeaders["x-forwarded-protocol"] ?? "https"; - const host = eventHeaders["x-forwarded-host"] ?? eventHeaders.host ?? ""; - const qs = rawQueryString.length ? `?${rawQueryString}` : ""; - const url = new URL(`${rawPath}${qs}`, `${scheme}://${host}`); + const scheme = eventHeaders["x-forwarded-protocol"] ?? "https" + const host = eventHeaders["x-forwarded-host"] ?? eventHeaders.host ?? "" + const qs = rawQueryString.length ? `?${rawQueryString}` : "" + const url = new URL(`${rawPath}${qs}`, `${scheme}://${host}`) const request = new Request(url, { body: createRequestBody(method, requestBody, isBase64Encoded), headers, method, - }); - const routeData = app.match(request); + }) + const routeData = app.match(request) if (!routeData) { return { body: "Not found", statusCode: 404, - }; + } } - const response = await app.render(request, routeData); - const fnResponse = await createLambdaFunctionResponse(app, response, knownBinaryMediaTypes); + const response = await app.render(request, routeData) + const fnResponse = await createLambdaFunctionResponse( + app, + response, + knownBinaryMediaTypes, + ) if (logFnResponse) { - log("function response", JSON.stringify(fnResponse, undefined, 2)); + log("function response", JSON.stringify(fnResponse, undefined, 2)) } - return fnResponse; - }; + return fnResponse + } diff --git a/packages/adapter/src/lambda/helpers.ts b/packages/adapter/src/lambda/helpers.ts index 285de21..5ce5e20 100644 --- a/packages/adapter/src/lambda/helpers.ts +++ b/packages/adapter/src/lambda/helpers.ts @@ -1,40 +1,51 @@ -import { Buffer } from "node:buffer"; +import { Buffer } from "node:buffer" -import type { APIGatewayProxyResultV2, CloudFrontHeaders, CloudFrontRequestResult } from "aws-lambda"; -import type { NodeApp } from "astro/app/node"; +import type { + APIGatewayProxyResultV2, + CloudFrontHeaders, + CloudFrontRequestResult, +} from "aws-lambda" +import type { NodeApp } from "astro/app/node" -import { DISALLOWED_EDGE_HEADERS } from "./constants.js"; +import { DISALLOWED_EDGE_HEADERS } from "./constants.js" -export const parseContentType = (header?: string | null) => header?.split(";")[0] ?? ""; +export const parseContentType = (header?: string | null) => + header?.split(";")[0] ?? "" -export const createRequestBody = (method: string, body: string | undefined, isBase64Encoded: boolean | string) => { +export const createRequestBody = ( + method: string, + body: string | undefined, + isBase64Encoded: boolean | string, +) => { if (method !== "GET" && method !== "HEAD" && body) { const encoding = typeof isBase64Encoded === "boolean" ? isBase64Encoded ? "base64" : "utf-8" - : (isBase64Encoded as BufferEncoding); + : (isBase64Encoded as BufferEncoding) - return encoding === "base64" ? Buffer.from(body, encoding).toString() : body; + return encoding === "base64" ? Buffer.from(body, encoding).toString() : body } - return undefined; -}; + return undefined +} export const createLambdaFunctionResponse = async ( app: NodeApp, response: Response, knownBinaryMediaTypes: Set, ): Promise => { - const cookies = [...app.setCookieHeaders(response)]; + const cookies = [...app.setCookieHeaders(response)] - response.headers.delete("Set-Cookie"); + response.headers.delete("Set-Cookie") - const headers = Object.fromEntries(response.headers.entries()); - const responseContentType = parseContentType(headers["content-type"]); - const isBase64Encoded = knownBinaryMediaTypes.has(responseContentType); - const body = isBase64Encoded ? Buffer.from(await response.arrayBuffer()).toString("base64") : await response.text(); + const headers = Object.fromEntries(response.headers.entries()) + const responseContentType = parseContentType(headers["content-type"]) + const isBase64Encoded = knownBinaryMediaTypes.has(responseContentType) + const body = isBase64Encoded + ? Buffer.from(await response.arrayBuffer()).toString("base64") + : await response.text() return { body, @@ -42,8 +53,8 @@ export const createLambdaFunctionResponse = async ( headers, isBase64Encoded, statusCode: response.status, - }; -}; + } +} export const createLambdaEdgeFunctionResponse = async ( app: NodeApp, @@ -52,7 +63,7 @@ export const createLambdaEdgeFunctionResponse = async ( ): Promise => { const cookies = [...app.setCookieHeaders(response)]; - const responseHeadersObj = Object.fromEntries(response.headers.entries()); + const responseHeadersObj = Object.fromEntries(response.headers.entries()) const headers: CloudFrontHeaders = { ...Object.fromEntries( @@ -84,5 +95,5 @@ export const createLambdaEdgeFunctionResponse = async ( headers, status: String(response.status), statusDescription: response.statusText, - }; -}; + } +} diff --git a/packages/adapter/src/lambda/index.ts b/packages/adapter/src/lambda/index.ts index c151c9f..d31597d 100644 --- a/packages/adapter/src/lambda/index.ts +++ b/packages/adapter/src/lambda/index.ts @@ -1,19 +1,19 @@ -import { polyfill } from "@astrojs/webapi"; -import type { SSRManifest } from "astro"; -import { NodeApp } from "astro/app/node"; +import { polyfill } from "@astrojs/webapi" +import type { SSRManifest } from "astro" +import { NodeApp } from "astro/app/node" -import type { Args } from "../args.js"; +import type { Args } from "../args.js" -import { createHandler } from "./handler.js"; +import { createHandler } from "./handler.js" polyfill(globalThis, { exclude: "window document", -}); +}) export const createExports = (manifest: SSRManifest, args: Args) => { - const app = new NodeApp(manifest); + const app = new NodeApp(manifest) - const { binaryMediaTypes = [] } = args; + const { binaryMediaTypes = [] } = args const knownBinaryMediaTypes = new Set([ "application/epub+zip", @@ -66,9 +66,9 @@ export const createExports = (manifest: SSRManifest, args: Args) => { "video/webm", "video/x-msvideo", ...binaryMediaTypes, - ]); + ]) - const handler = createHandler(app, knownBinaryMediaTypes, args); + const handler = createHandler(app, knownBinaryMediaTypes, args) - return { handler }; -}; + return { handler } +} diff --git a/packages/adapter/src/log.ts b/packages/adapter/src/log.ts index 7bf7699..be191b4 100644 --- a/packages/adapter/src/log.ts +++ b/packages/adapter/src/log.ts @@ -1,9 +1,9 @@ -import { ADAPTER_NAME } from "./constants.js"; +import { ADAPTER_NAME } from "./constants.js" export const warn = (message?: unknown, ...optionalParams: unknown[]) => { - console.warn(`[${ADAPTER_NAME}]`, message, ...optionalParams); -}; + console.warn(`[${ADAPTER_NAME}]`, message, ...optionalParams) +} export const log = (message?: unknown, ...optionalParams: unknown[]) => { - console.log(`[${ADAPTER_NAME}]`, message, ...optionalParams); -}; + console.log(`[${ADAPTER_NAME}]`, message, ...optionalParams) +} diff --git a/packages/adapter/src/shared.ts b/packages/adapter/src/shared.ts index 657ca8c..473cd66 100644 --- a/packages/adapter/src/shared.ts +++ b/packages/adapter/src/shared.ts @@ -1,8 +1,8 @@ -import type { BuildOptions } from "esbuild"; -import { build } from "esbuild"; -import { mergeAndConcat } from "merge-anything"; +import type { BuildOptions } from "esbuild" +import { build } from "esbuild" +import { mergeAndConcat } from "merge-anything" -import type { Args } from "./args.js"; +import type { Args } from "./args.js" const DEFAULT_CONFIG: BuildOptions = { allowOverwrite: true, @@ -11,7 +11,7 @@ const DEFAULT_CONFIG: BuildOptions = { metafile: true, platform: "node", target: "node16", -}; +} export const createEsBuildConfig = ( entryFile: string, @@ -34,6 +34,10 @@ export const createEsBuildConfig = ( }, }) as BuildOptions -export const bundleEntry = async (entryFile: string, outDir: string, args: Args) => { - await build(createEsBuildConfig(entryFile, outDir, args)); -}; +export const bundleEntry = async ( + entryFile: string, + outDir: string, + args: Args, +) => { + await build(createEsBuildConfig(entryFile, outDir, args)) +} diff --git a/packages/constructs/README.md b/packages/constructs/README.md index 20b597b..1024893 100644 --- a/packages/constructs/README.md +++ b/packages/constructs/README.md @@ -20,20 +20,20 @@ pnpm add @astro-aws/constructs constructs aws-cdk-lib 2. Add the construct to your CDK stack. ```ts -import { Stack } from "aws-cdk-lib"; -import type { StackProps } from "aws-cdk-lib"; -import { AstroAWS } from "@astro-aws/constructs"; +import { Stack } from "aws-cdk-lib/core" +import type { StackProps } from "aws-cdk-lib/core" +import { AstroAWS } from "@astro-aws/constructs" export interface MyAstroStackProps extends StackProps {} export class MyAstroStack extends Stack { public constructor(scope: Construct, id: string, props: MyAstroStackProps) { - super(scope, id, props); + super(scope, id, props) new AstroAWS(this, "AstroAWS", { output: "server", websitePath: "..", // Replace with the path to your website code. - }); + }) } } ``` @@ -56,20 +56,20 @@ pnpm add @astro-aws/constructs constructs aws-cdk-lib 2. Add the construct to your CDK stack. ```ts -import { Stack } from "aws-cdk-lib"; -import type { StackProps } from "aws-cdk-lib"; -import { AstroAWS } from "@astro-aws/constructs"; +import { Stack } from "aws-cdk-lib/core" +import type { StackProps } from "aws-cdk-lib/core" +import { AstroAWS } from "@astro-aws/constructs" export interface MyAstroStackProps extends StackProps {} export class MyAstroStack extends Stack { public constructor(scope: Construct, id: string, props: MyAstroStackProps) { - super(scope, id, props); + super(scope, id, props) new AstroAWS(this, "AstroAWS", { output: "edge", websitePath: "..", // Replace with the path to your website code. - }); + }) } } ``` @@ -92,20 +92,20 @@ pnpm add @astro-aws/constructs constructs aws-cdk-lib 2. Add the construct to your CDK stack. ```ts -import { Stack } from "aws-cdk-lib"; -import type { StackProps } from "aws-cdk-lib"; -import { AstroAWS } from "@astro-aws/constructs"; +import { Stack } from "aws-cdk-lib/core" +import type { StackProps } from "aws-cdk-lib/core" +import { AstroAWS } from "@astro-aws/constructs" export interface MyAstroStackProps extends StackProps {} export class MyAstroStack extends Stack { public constructor(scope: Construct, id: string, props: MyAstroStackProps) { - super(scope, id, props); + super(scope, id, props) new AstroAWS(this, "AstroAWS", { output: "static", websitePath: "..", // Replace with the path to your website code. - }); + }) } } ``` @@ -115,15 +115,15 @@ export class MyAstroStack extends Stack { All the resources created by the `AstroAWS` construct can be customized. We expose every prop of the resources that is customizable. The props can be set by passing them in to the `cdk` field on the `AstroAWS` construct props. Depending on the deployment method, not all of the props will be used. The constructed can be access through the `cdk` field on the `AstroAWS` construct object. ```ts -import { Stack, CfnOutput } from "aws-cdk-lib"; -import type { StackProps } from "aws-cdk-lib"; -import { AstroAWS } from "@astro-aws/constructs"; +import { Stack, CfnOutput } from "aws-cdk-lib/core" +import type { StackProps } from "aws-cdk-lib/core" +import { AstroAWS } from "@astro-aws/constructs" export interface MyAstroStackProps extends StackProps {} export class MyAstroStack extends Stack { public constructor(scope: Construct, id: string, props: MyAstroStackProps) { - super(scope, id, props); + super(scope, id, props) const astroAWS = new AstroAWS(this, "AstroAWS", { cdk: { @@ -133,11 +133,11 @@ export class MyAstroStack extends Stack { }, output: "server", websitePath: "..", // Replace with the path to your website code. - }); + }) new CfnOutput(this, "DistributionDomainName", { value: astroAWS.cdk.cloudfrontDistribution.distributionDomainName, - }); + }) } } ``` diff --git a/packages/constructs/package.json b/packages/constructs/package.json index 795140d..d476546 100644 --- a/packages/constructs/package.json +++ b/packages/constructs/package.json @@ -37,18 +37,18 @@ "devDependencies": { "@astro-aws/scripts": "workspace:^", "@types/node": "^18.14.0", - "aws-cdk-lib": "^2.65.0", + "aws-cdk-lib": "^2.0.0", "constructs": "^10.1.253", "eslint": "^8.34.0", "prettier": "^2.8.4", "typescript": "^4.9.5" }, "peerDependencies": { - "aws-cdk-lib": "^2.40.0", + "aws-cdk-lib": "^2.0.0", "constructs": "^10.1.0" }, "engines": { - "node": "16.x || 18.x" + "node": "18.x" }, "publishConfig": { "access": "public" diff --git a/packages/constructs/src/constructs/astro-aws-cloudfront-distribution.ts b/packages/constructs/src/constructs/astro-aws-cloudfront-distribution.ts index 5ad9fba..ce01d1a 100644 --- a/packages/constructs/src/constructs/astro-aws-cloudfront-distribution.ts +++ b/packages/constructs/src/constructs/astro-aws-cloudfront-distribution.ts @@ -1,5 +1,5 @@ -import { type Construct } from "constructs"; -import { Version, type Function } from "aws-cdk-lib/aws-lambda"; +import { type Construct } from "constructs" +import { Version, type Function } from "aws-cdk-lib/aws-lambda" import { AllowedMethods, Distribution, @@ -15,47 +15,58 @@ import { type FunctionAssociation, type IOrigin, ViewerProtocolPolicy, -} from "aws-cdk-lib/aws-cloudfront"; +} from "aws-cdk-lib/aws-cloudfront" -import { AstroAWSBaseConstruct } from "../types/astro-aws-construct.js"; -import { type Output } from "../types/output.js"; +import { AstroAWSBaseConstruct } from "../types/astro-aws-construct.js" +import { type Output } from "../types/output.js" export type AstroAWSCloudfrontDistributionCdkProps = { - cloudfrontDistribution?: Omit & { - defaultBehavior?: Omit; - apiBehavior?: Omit; - }; -}; + cloudfrontDistribution?: Omit< + DistributionProps, + "apiBehavior" | "defaultBehavior" + > & { + defaultBehavior?: Omit + apiBehavior?: Omit + } +} export type AstroAWSCloudfrontDistributionProps = { - output: Output; - lambdaFunction?: Function; - origin: IOrigin; - lambdaFunctionOrigin?: IOrigin; - cdk?: AstroAWSCloudfrontDistributionCdkProps; -}; + output: Output + lambdaFunction?: Function + origin: IOrigin + lambdaFunctionOrigin?: IOrigin + cdk?: AstroAWSCloudfrontDistributionCdkProps +} export type AstroAWSCloudfrontDistributionCdk = { - cloudfrontDistribution: Distribution; - redirectToIndexCloudfrontFunction?: CfFunction; -}; + cloudfrontDistribution: Distribution + redirectToIndexCloudfrontFunction?: CfFunction +} export class AstroAWSCloudfrontDistribution extends AstroAWSBaseConstruct< AstroAWSCloudfrontDistributionProps, AstroAWSCloudfrontDistributionCdk > { - #redirectToIndexCloudfrontFunction?: CfFunction; - #cloudfrontDistribution: Distribution; + #redirectToIndexCloudfrontFunction?: CfFunction + #cloudfrontDistribution: Distribution - public constructor(scope: Construct, id: string, props: AstroAWSCloudfrontDistributionProps) { - super(scope, id, props); + public constructor( + scope: Construct, + id: string, + props: AstroAWSCloudfrontDistributionProps, + ) { + super(scope, id, props) const functionAssociations: FunctionAssociation[] = - this.props.cdk?.cloudfrontDistribution?.defaultBehavior?.functionAssociations ?? []; + this.props.cdk?.cloudfrontDistribution?.defaultBehavior + ?.functionAssociations ?? [] if (this.props.output === "static") { - this.#redirectToIndexCloudfrontFunction = new CfFunction(this, "RedirectToIndexFunction", { - code: FunctionCode.fromInline(` + this.#redirectToIndexCloudfrontFunction = new CfFunction( + this, + "RedirectToIndexFunction", + { + code: FunctionCode.fromInline(` function handler(event) { var request = event.request; var uri = request.uri; @@ -69,26 +80,28 @@ export class AstroAWSCloudfrontDistribution extends AstroAWSBaseConstruct< return request; } `), - }); + }, + ) functionAssociations.push({ eventType: FunctionEventType.VIEWER_REQUEST, function: this.#redirectToIndexCloudfrontFunction, - }); + }) } - const edgeLambdas: EdgeLambda[] = this.props.cdk?.cloudfrontDistribution?.defaultBehavior?.edgeLambdas ?? []; + const edgeLambdas: EdgeLambda[] = + this.props.cdk?.cloudfrontDistribution?.defaultBehavior?.edgeLambdas ?? [] if (this.props.output === "edge" && this.props.lambdaFunction) { const functionVersion = new Version(this, "LambdaVersion", { lambda: this.props.lambdaFunction, - }); + }) edgeLambdas.push({ eventType: LambdaEdgeEventType.ORIGIN_REQUEST, functionVersion, includeBody: true, - }); + }) } this.#cloudfrontDistribution = new Distribution(this, "Distribution", { @@ -98,8 +111,10 @@ export class AstroAWSCloudfrontDistribution extends AstroAWSBaseConstruct< "/api/*": { allowedMethods: AllowedMethods.ALLOW_ALL, origin: this.props.lambdaFunctionOrigin, - originRequestPolicy: OriginRequestPolicy.USER_AGENT_REFERER_HEADERS, - responseHeadersPolicy: ResponseHeadersPolicy.CORS_ALLOW_ALL_ORIGINS_WITH_PREFLIGHT_AND_SECURITY_HEADERS, + originRequestPolicy: + OriginRequestPolicy.USER_AGENT_REFERER_HEADERS, + responseHeadersPolicy: + ResponseHeadersPolicy.CORS_ALLOW_ALL_ORIGINS_WITH_PREFLIGHT_AND_SECURITY_HEADERS, viewerProtocolPolicy: ViewerProtocolPolicy.REDIRECT_TO_HTTPS, ...this.props.cdk?.cloudfrontDistribution?.apiBehavior, }, @@ -109,7 +124,8 @@ export class AstroAWSCloudfrontDistribution extends AstroAWSBaseConstruct< defaultBehavior: { origin: this.props.origin, originRequestPolicy: OriginRequestPolicy.USER_AGENT_REFERER_HEADERS, - responseHeadersPolicy: ResponseHeadersPolicy.CORS_ALLOW_ALL_ORIGINS_WITH_PREFLIGHT_AND_SECURITY_HEADERS, + responseHeadersPolicy: + ResponseHeadersPolicy.CORS_ALLOW_ALL_ORIGINS_WITH_PREFLIGHT_AND_SECURITY_HEADERS, viewerProtocolPolicy: ViewerProtocolPolicy.REDIRECT_TO_HTTPS, ...this.props.cdk?.cloudfrontDistribution?.defaultBehavior, edgeLambdas, @@ -121,13 +137,14 @@ export class AstroAWSCloudfrontDistribution extends AstroAWSBaseConstruct< responsePagePath: "/404", }, ], - }); + }) } public get cdk() { return { cloudfrontDistribution: this.#cloudfrontDistribution, - redirectToIndexCloudfrontFunction: this.#redirectToIndexCloudfrontFunction, - }; + redirectToIndexCloudfrontFunction: + this.#redirectToIndexCloudfrontFunction, + } } } diff --git a/packages/constructs/src/constructs/astro-aws-origin.ts b/packages/constructs/src/constructs/astro-aws-origin.ts index ca0bbb8..c2e80d4 100644 --- a/packages/constructs/src/constructs/astro-aws-origin.ts +++ b/packages/constructs/src/constructs/astro-aws-origin.ts @@ -1,7 +1,12 @@ -import { type Construct } from "constructs"; -import { type FunctionUrl, FunctionUrlAuthType, type FunctionUrlOptions, type Function } from "aws-cdk-lib/aws-lambda"; -import { type IOrigin } from "aws-cdk-lib/aws-cloudfront"; -import { type Bucket } from "aws-cdk-lib/aws-s3"; +import { type Construct } from "constructs" +import { + type FunctionUrl, + FunctionUrlAuthType, + type FunctionUrlOptions, + type Function, +} from "aws-cdk-lib/aws-lambda" +import { type IOrigin } from "aws-cdk-lib/aws-cloudfront" +import { type Bucket } from "aws-cdk-lib/aws-s3" import { HttpOrigin, OriginGroup, @@ -9,71 +14,77 @@ import { type HttpOriginProps, type OriginGroupProps, type S3OriginProps, -} from "aws-cdk-lib/aws-cloudfront-origins"; -import { Fn } from "aws-cdk-lib"; +} from "aws-cdk-lib/aws-cloudfront-origins" +import { Fn } from "aws-cdk-lib/core" -import { AstroAWSBaseConstruct } from "../types/astro-aws-construct.js"; -import { type Output } from "../types/output.js"; +import { AstroAWSBaseConstruct } from "../types/astro-aws-construct.js" +import { type Output } from "../types/output.js" export type AstroAWSOriginCdkProps = { - lambdaFunctionOrigin?: HttpOriginProps; - lambdaFunctionUrl?: FunctionUrlOptions; - originGroup?: OriginGroupProps; - s3Origin?: S3OriginProps; -}; + lambdaFunctionOrigin?: HttpOriginProps + lambdaFunctionUrl?: FunctionUrlOptions + originGroup?: OriginGroupProps + s3Origin?: S3OriginProps +} export type AstroAWSOriginProps = { - output: Output; - lambdaFunction?: Function; - s3Bucket: Bucket; - cdk?: AstroAWSOriginCdkProps; -}; + output: Output + lambdaFunction?: Function + s3Bucket: Bucket + cdk?: AstroAWSOriginCdkProps +} export type AstroAWSOriginCdk = { - lambdaFunctionOrigin?: HttpOrigin; - lambdaFunctionUrl?: FunctionUrl; - origin: IOrigin; - originGroup?: OriginGroup; - s3Origin: S3Origin; -}; + lambdaFunctionOrigin?: HttpOrigin + lambdaFunctionUrl?: FunctionUrl + origin: IOrigin + originGroup?: OriginGroup + s3Origin: S3Origin +} -export class AstroAWSOrigin extends AstroAWSBaseConstruct { - #origin: IOrigin; - #lambdaFunctionUrl?: FunctionUrl; - #s3Origin: S3Origin; - #lambdaFunctionOrigin?: HttpOrigin; - #originGroup?: OriginGroup; +export class AstroAWSOrigin extends AstroAWSBaseConstruct< + AstroAWSOriginProps, + AstroAWSOriginCdk +> { + #origin: IOrigin + #lambdaFunctionUrl?: FunctionUrl + #s3Origin: S3Origin + #lambdaFunctionOrigin?: HttpOrigin + #originGroup?: OriginGroup public constructor(scope: Construct, id: string, props: AstroAWSOriginProps) { - super(scope, id, props); + super(scope, id, props) - this.#s3Origin = new S3Origin(this.props.s3Bucket, this.props.cdk?.s3Origin); + this.#s3Origin = new S3Origin(this.props.s3Bucket, this.props.cdk?.s3Origin) if (this.props.lambdaFunction && this.props.output !== "static") { this.#lambdaFunctionUrl = this.props.lambdaFunction.addFunctionUrl({ authType: FunctionUrlAuthType.NONE, ...this.props.cdk?.lambdaFunctionUrl, - }); + }) this.#lambdaFunctionOrigin = new HttpOrigin( Fn.parseDomainName(this.#lambdaFunctionUrl.url), this.props.cdk?.lambdaFunctionOrigin, - ); + ) if (this.props.output === "server") { this.#originGroup = new OriginGroup({ ...this.props.cdk?.originGroup, fallbackOrigin: this.#s3Origin, - fallbackStatusCodes: [404, ...(this.props.cdk?.originGroup?.fallbackStatusCodes ?? [])], + fallbackStatusCodes: [ + 404, + ...(this.props.cdk?.originGroup?.fallbackStatusCodes ?? []), + ], primaryOrigin: this.#lambdaFunctionOrigin, - }); + }) - this.#origin = this.#originGroup; + this.#origin = this.#originGroup } else { - this.#origin = this.#s3Origin; + this.#origin = this.#s3Origin } } else { - this.#origin = this.#s3Origin; + this.#origin = this.#s3Origin } } @@ -84,6 +95,6 @@ export class AstroAWSOrigin extends AstroAWSBaseConstruct>; -}; + s3BucketDeployment?: Partial< + Omit + > +} export type AstroAWSS3BucketDeploymentProps = { - distDir: string; - output: Output; - bucket: BucketDeploymentProps["destinationBucket"]; - distribution: Distribution; - cdk?: AstroAWSS3BucketDeploymentCdkProps; -}; + distDir: string + output: Output + bucket: BucketDeploymentProps["destinationBucket"] + distribution: Distribution + cdk?: AstroAWSS3BucketDeploymentCdkProps +} export type AstroAWSS3BucketDeploymentCdk = { - s3BucketDeployment: BucketDeployment; -}; + s3BucketDeployment: BucketDeployment +} export class AstroAWSS3BucketDeployment extends AstroAWSBaseConstruct< AstroAWSS3BucketDeploymentProps, AstroAWSS3BucketDeploymentCdk > { - #s3BucketDeployment: BucketDeployment; + #s3BucketDeployment: BucketDeployment - public constructor(scope: Construct, id: string, props: AstroAWSS3BucketDeploymentProps) { - super(scope, id, props); + public constructor( + scope: Construct, + id: string, + props: AstroAWSS3BucketDeploymentProps, + ) { + super(scope, id, props) - const { output, distDir, bucket, cdk = {}, distribution } = this.props; + const { output, distDir, bucket, cdk = {}, distribution } = this.props - const source = ["server", "edge"].includes(output) ? resolve(distDir, "client") : resolve(distDir); + const source = ["server", "edge"].includes(output) + ? resolve(distDir, "client") + : resolve(distDir) this.#s3BucketDeployment = new BucketDeployment(this, "BucketDeployment", { ...cdk.s3BucketDeployment, destinationBucket: bucket, distribution, - sources: [Source.asset(source), ...(cdk.s3BucketDeployment?.sources ?? [])], - }); + sources: [ + Source.asset(source), + ...(cdk.s3BucketDeployment?.sources ?? []), + ], + }) } public get cdk() { return { s3BucketDeployment: this.#s3BucketDeployment, - }; + } } } diff --git a/packages/constructs/src/constructs/astro-aws-s3-bucket.ts b/packages/constructs/src/constructs/astro-aws-s3-bucket.ts index a502f4a..f06e468 100644 --- a/packages/constructs/src/constructs/astro-aws-s3-bucket.ts +++ b/packages/constructs/src/constructs/astro-aws-s3-bucket.ts @@ -1,57 +1,70 @@ -import { BlockPublicAccess, Bucket, BucketEncryption, type BucketProps } from "aws-cdk-lib/aws-s3"; -import { type Construct } from "constructs"; -import { OriginAccessIdentity } from "aws-cdk-lib/aws-cloudfront"; -import { CanonicalUserPrincipal, PolicyStatement } from "aws-cdk-lib/aws-iam"; +import { + BlockPublicAccess, + Bucket, + BucketEncryption, + type BucketProps, +} from "aws-cdk-lib/aws-s3" +import { type Construct } from "constructs" +import { OriginAccessIdentity } from "aws-cdk-lib/aws-cloudfront" +import { CanonicalUserPrincipal, PolicyStatement } from "aws-cdk-lib/aws-iam" -import { AstroAWSBaseConstruct } from "../types/astro-aws-construct.js"; +import { AstroAWSBaseConstruct } from "../types/astro-aws-construct.js" export type AstroAWSS3BucketCdkProps = { - s3Bucket?: Partial; -}; + s3Bucket?: Partial +} export type AstroAWSS3BucketProps = { - cdk?: AstroAWSS3BucketCdkProps; -}; + cdk?: AstroAWSS3BucketCdkProps +} export type AstroAWSS3BucketCdk = { - originAccessIdentity: OriginAccessIdentity; - s3Bucket: Bucket; -}; + originAccessIdentity: OriginAccessIdentity + s3Bucket: Bucket +} -export class AstroAWSS3Bucket extends AstroAWSBaseConstruct { - #s3Bucket: Bucket; - #originAccessIdentity: OriginAccessIdentity; +export class AstroAWSS3Bucket extends AstroAWSBaseConstruct< + AstroAWSS3BucketProps, + AstroAWSS3BucketCdk +> { + #s3Bucket: Bucket + #originAccessIdentity: OriginAccessIdentity - public constructor(scope: Construct, id: string, props: AstroAWSS3BucketProps) { - super(scope, id, props); + public constructor( + scope: Construct, + id: string, + props: AstroAWSS3BucketProps, + ) { + super(scope, id, props) this.#s3Bucket = new Bucket(this, "S3Bucket", { blockPublicAccess: BlockPublicAccess.BLOCK_ALL, encryption: BucketEncryption.S3_MANAGED, enforceSSL: true, ...this.cdk.s3Bucket, - }); + }) this.#originAccessIdentity = new OriginAccessIdentity(this, "S3BucketOAI", { comment: `OAI for ${id}`, - }); + }) this.#s3Bucket.addToResourcePolicy( new PolicyStatement({ actions: ["s3:GetObject"], principals: [ - new CanonicalUserPrincipal(this.#originAccessIdentity.cloudFrontOriginAccessIdentityS3CanonicalUserId) - .grantPrincipal, + new CanonicalUserPrincipal( + this.#originAccessIdentity.cloudFrontOriginAccessIdentityS3CanonicalUserId, + ).grantPrincipal, ], resources: [this.#s3Bucket.arnForObjects("*")], }), - ); + ) } public get cdk() { return { originAccessIdentity: this.#originAccessIdentity, s3Bucket: this.#s3Bucket, - }; + } } } diff --git a/packages/constructs/src/constructs/astro-aws.ts b/packages/constructs/src/constructs/astro-aws.ts index 5817941..7a3c9bc 100644 --- a/packages/constructs/src/constructs/astro-aws.ts +++ b/packages/constructs/src/constructs/astro-aws.ts @@ -1,50 +1,63 @@ -import { fileURLToPath } from "node:url"; -import { resolve } from "node:path"; +import { fileURLToPath } from "node:url" +import { resolve } from "node:path" -import { type FunctionProps, Code, Function, Runtime } from "aws-cdk-lib/aws-lambda"; -import { type Construct } from "constructs"; +import { + type FunctionProps, + Code, + Function, + Runtime, +} from "aws-cdk-lib/aws-lambda" +import { type Construct } from "constructs" -import { type Output } from "../types/output.js"; -import { AstroAWSBaseConstruct } from "../types/astro-aws-construct.js"; +import { type Output } from "../types/output.js" +import { AstroAWSBaseConstruct } from "../types/astro-aws-construct.js" import { AstroAWSS3BucketDeployment, type AstroAWSS3BucketDeploymentCdk, type AstroAWSS3BucketDeploymentCdkProps, -} from "./astro-aws-s3-bucket-deployment.js"; -import { AstroAWSS3Bucket, type AstroAWSS3BucketCdk, type AstroAWSS3BucketCdkProps } from "./astro-aws-s3-bucket.js"; -import { type AstroAWSOriginCdkProps, AstroAWSOrigin, type AstroAWSOriginCdk } from "./astro-aws-origin.js"; +} from "./astro-aws-s3-bucket-deployment.js" +import { + AstroAWSS3Bucket, + type AstroAWSS3BucketCdk, + type AstroAWSS3BucketCdkProps, +} from "./astro-aws-s3-bucket.js" +import { + type AstroAWSOriginCdkProps, + AstroAWSOrigin, + type AstroAWSOriginCdk, +} from "./astro-aws-origin.js" import type { AstroAWSCloudfrontDistributionCdk, AstroAWSCloudfrontDistributionCdkProps, -} from "./astro-aws-cloudfront-distribution.js"; -import { AstroAWSCloudfrontDistribution } from "./astro-aws-cloudfront-distribution.js"; +} from "./astro-aws-cloudfront-distribution.js" +import { AstroAWSCloudfrontDistribution } from "./astro-aws-cloudfront-distribution.js" -const __dirname = fileURLToPath(new URL(".", import.meta.url)); +const __dirname = fileURLToPath(new URL(".", import.meta.url)) export type AstroAWSCdkProps = { - lambdaFunction?: Omit; -}; + lambdaFunction?: Omit +} export type AstroAWSProps = { /** Passed through to the Bucket Origin. */ - websiteDir?: string; - outDir?: string; - output: Output; - node16?: boolean; + websiteDir?: string + outDir?: string + output: Output + node16?: boolean cdk?: AstroAWSCdkProps & AstroAWSCloudfrontDistributionCdkProps & AstroAWSOriginCdkProps & AstroAWSS3BucketCdkProps & - AstroAWSS3BucketDeploymentCdkProps; -}; + AstroAWSS3BucketDeploymentCdkProps +} export type AstroAWSCdk = AstroAWSCloudfrontDistributionCdk & AstroAWSOriginCdk & AstroAWSS3BucketCdk & AstroAWSS3BucketDeploymentCdk & { - lambdaFunction?: Function; - }; + lambdaFunction?: Function + } /** * Constructs the required AWS resources to deploy an Astro website. The resources are: @@ -57,28 +70,31 @@ export type AstroAWSCdk = AstroAWSCloudfrontDistributionCdk & * If "server" output is selected, this works by routing requests to the Lambda function. If the Lambda function returns * a 404 response, the Cloudfront distribution falls back to the S3 bucket. */ -export class AstroAWS extends AstroAWSBaseConstruct { - public readonly distDir: string; - - #lambdaFunction?: Function; - #astroAWSS3BucketDeployment: AstroAWSS3BucketDeployment; - #astroAWSS3Bucket: AstroAWSS3Bucket; - #astroAWSOrigin: AstroAWSOrigin; - #astroAWSCloudfrontDistribution: AstroAWSCloudfrontDistribution; +export class AstroAWS extends AstroAWSBaseConstruct< + AstroAWSProps, + AstroAWSCdk +> { + public readonly distDir: string + + #lambdaFunction?: Function + #astroAWSS3BucketDeployment: AstroAWSS3BucketDeployment + #astroAWSS3Bucket: AstroAWSS3Bucket + #astroAWSOrigin: AstroAWSOrigin + #astroAWSCloudfrontDistribution: AstroAWSCloudfrontDistribution public constructor(scope: Construct, id: string, props: AstroAWSProps) { - super(scope, id, props); + super(scope, id, props) - const { outDir, websiteDir = __dirname, output } = props; + const { outDir, websiteDir = __dirname, output } = props this.#astroAWSS3Bucket = new AstroAWSS3Bucket(this, "AstroAWSS3Bucket", { cdk: this.props.cdk, - }); + }) - this.distDir = outDir ? resolve(outDir) : resolve(websiteDir, "dist"); + this.distDir = outDir ? resolve(outDir) : resolve(websiteDir, "dist") if (["server", "edge"].includes(output)) { - this.createSSROnlyResources(); + this.createSSROnlyResources() } this.#astroAWSOrigin = new AstroAWSOrigin(this, "AstroAWSOrigin", { @@ -86,23 +102,32 @@ export class AstroAWS extends AstroAWSBaseConstruct lambdaFunction: this.#lambdaFunction, output, s3Bucket: this.#astroAWSS3Bucket.cdk.s3Bucket, - }); - - this.#astroAWSCloudfrontDistribution = new AstroAWSCloudfrontDistribution(this, "AstroAWSCloudfrontDistribution", { - cdk: this.props.cdk, - lambdaFunction: this.#lambdaFunction, - lambdaFunctionOrigin: this.#astroAWSOrigin.cdk.lambdaFunctionOrigin, - origin: this.#astroAWSOrigin.cdk.origin, - output, - }); - - this.#astroAWSS3BucketDeployment = new AstroAWSS3BucketDeployment(this, "AstroAWSS3BucketDeployment", { - bucket: this.#astroAWSS3Bucket.cdk.s3Bucket, - cdk: this.props.cdk, - distDir: this.distDir, - distribution: this.#astroAWSCloudfrontDistribution.cdk.cloudfrontDistribution, - output: this.props.output, - }); + }) + + this.#astroAWSCloudfrontDistribution = new AstroAWSCloudfrontDistribution( + this, + "AstroAWSCloudfrontDistribution", + { + cdk: this.props.cdk, + lambdaFunction: this.#lambdaFunction, + lambdaFunctionOrigin: this.#astroAWSOrigin.cdk.lambdaFunctionOrigin, + origin: this.#astroAWSOrigin.cdk.origin, + output, + }, + ) + + this.#astroAWSS3BucketDeployment = new AstroAWSS3BucketDeployment( + this, + "AstroAWSS3BucketDeployment", + { + bucket: this.#astroAWSS3Bucket.cdk.s3Bucket, + cdk: this.props.cdk, + distDir: this.distDir, + distribution: + this.#astroAWSCloudfrontDistribution.cdk.cloudfrontDistribution, + output: this.props.output, + }, + ) } private createSSROnlyResources() { @@ -113,7 +138,7 @@ export class AstroAWS extends AstroAWSBaseConstruct ...this.props.cdk?.lambdaFunction, code: Code.fromAsset(resolve(this.distDir, "lambda")), handler: "entry.handler", - }); + }) } public get cdk(): AstroAWSCdk { @@ -123,6 +148,6 @@ export class AstroAWS extends AstroAWSBaseConstruct ...this.#astroAWSOrigin.cdk, ...this.#astroAWSCloudfrontDistribution.cdk, lambdaFunction: this.#lambdaFunction, - }; + } } } diff --git a/packages/constructs/src/index.ts b/packages/constructs/src/index.ts index 4b573cf..80f1f10 100644 --- a/packages/constructs/src/index.ts +++ b/packages/constructs/src/index.ts @@ -1 +1 @@ -export * from "./constructs/astro-aws.js"; +export * from "./constructs/astro-aws.js" diff --git a/packages/constructs/src/types/astro-aws-construct.ts b/packages/constructs/src/types/astro-aws-construct.ts index a291e63..758af3a 100644 --- a/packages/constructs/src/types/astro-aws-construct.ts +++ b/packages/constructs/src/types/astro-aws-construct.ts @@ -1,17 +1,17 @@ -import { Construct } from "constructs"; +import { Construct } from "constructs" export abstract class AstroAWSBaseConstruct extends Construct { - #props: Props; + #props: Props public constructor(scope: Construct, id: string, props: Props) { - super(scope, id); + super(scope, id) - this.#props = props; + this.#props = props } public get props(): Props { - return this.#props; + return this.#props } - public abstract get cdk(): Cdk; + public abstract get cdk(): Cdk } diff --git a/packages/constructs/src/types/output.ts b/packages/constructs/src/types/output.ts index 9e2309d..dd9b54f 100644 --- a/packages/constructs/src/types/output.ts +++ b/packages/constructs/src/types/output.ts @@ -1 +1 @@ -export type Output = "edge" | "server" | "static"; +export type Output = "edge" | "server" | "static" diff --git a/packages/constructs/src/types/partial-by.ts b/packages/constructs/src/types/partial-by.ts index ce7e0b4..a82120a 100644 --- a/packages/constructs/src/types/partial-by.ts +++ b/packages/constructs/src/types/partial-by.ts @@ -1 +1 @@ -export type PartialBy = Omit & Partial>; +export type PartialBy = Omit & Partial> diff --git a/scripts/bin.js b/scripts/bin.js index e073a6b..36f87f7 100755 --- a/scripts/bin.js +++ b/scripts/bin.js @@ -1,3 +1,3 @@ #!/usr/bin/env node -import "./dist/index.js"; +import "./dist/index.js" diff --git a/scripts/package.json b/scripts/package.json index 47084df..011d34d 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -43,6 +43,6 @@ "typescript": "^4.9.5" }, "engines": { - "node": "16.x || 18.x" + "node": "18.x" } } diff --git a/scripts/src/cmds/build.ts b/scripts/src/cmds/build.ts index 26e1dfc..26df3d0 100644 --- a/scripts/src/cmds/build.ts +++ b/scripts/src/cmds/build.ts @@ -1,32 +1,34 @@ -import { rm } from "node:fs/promises"; +import { rm } from "node:fs/promises" -import { Command } from "commander"; +import { Command } from "commander" -import { runTsc } from "../utils/ts-util.js"; -import { runEsBuild } from "../utils/esbuild-util.js"; -import { readPackageJson } from "../utils/pkg-util.js"; -import { readConfig } from "../utils/config-util.js"; -import { none } from "../utils/arg-util.js"; +import { runTsc } from "../utils/ts-util.js" +import { runEsBuild } from "../utils/esbuild-util.js" +import { readPackageJson } from "../utils/pkg-util.js" +import { readConfig } from "../utils/config-util.js" +import { none } from "../utils/arg-util.js" type Options = { - bundle: boolean; - skipClean: boolean; - skipTsc: boolean; -}; + bundle: boolean + skipClean: boolean + skipTsc: boolean +} const buildCommand = new Command("build") - .description("Builds the TypeScript files in the src directory and outputs them to the dist directory.") + .description( + "Builds the TypeScript files in the src directory and outputs them to the dist directory.", + ) .argument("[fileGlob]", "Glob pattern for files to build.", "src/**/*.ts") .option("-b, --bundle", "Bundles the entrypoint.", false) .option("--skip-clean", "Does not delete dist folder.", false) .option("--skip-tsc", "Skips building typedefs.", false) .action(async (fileGlob: string) => { - const { bundle, skipClean, skipTsc } = buildCommand.opts(); - const pkgJson = await readPackageJson(); - const config = await readConfig(); + const { bundle, skipClean, skipTsc } = buildCommand.opts() + const pkgJson = await readPackageJson() + const config = await readConfig() if (none(skipClean, config.build?.skipClean)) { - const cleanGlobs = [...(config.clean ?? []), "dist"]; + const cleanGlobs = [...(config.clean ?? []), "dist"] await Promise.all( cleanGlobs.map(async (glob) => @@ -35,17 +37,17 @@ const buildCommand = new Command("build") recursive: true, }), ), - ); + ) } await runEsBuild(pkgJson, { bundle, fileGlob, - }); + }) if (none(skipTsc, config.build?.skipTsc)) { - runTsc(); + runTsc() } - }); + }) -export { buildCommand }; +export { buildCommand } diff --git a/scripts/src/index.ts b/scripts/src/index.ts index cf3c28e..93b96ca 100755 --- a/scripts/src/index.ts +++ b/scripts/src/index.ts @@ -1,6 +1,6 @@ -import { program } from "commander"; +import { program } from "commander" -import { buildCommand } from "./cmds/build.js"; +import { buildCommand } from "./cmds/build.js" -program.addCommand(buildCommand); -program.parse(); +program.addCommand(buildCommand) +program.parse() diff --git a/scripts/src/utils/arg-util.ts b/scripts/src/utils/arg-util.ts index b5b6a18..a7d1732 100644 --- a/scripts/src/utils/arg-util.ts +++ b/scripts/src/utils/arg-util.ts @@ -1,2 +1,2 @@ -export const some = (...args: unknown[]) => args.some(Boolean); -export const none = (...args: unknown[]) => !some(...args); +export const some = (...args: unknown[]) => args.some(Boolean) +export const none = (...args: unknown[]) => !some(...args) diff --git a/scripts/src/utils/config-util.ts b/scripts/src/utils/config-util.ts index 67fd908..d9f3b44 100644 --- a/scripts/src/utils/config-util.ts +++ b/scripts/src/utils/config-util.ts @@ -1,18 +1,18 @@ -import { cwd } from "node:process"; +import { cwd } from "node:process" -import { cosmiconfig } from "cosmiconfig"; +import { cosmiconfig } from "cosmiconfig" export type Config = { - clean?: string[]; + clean?: string[] build?: { - skipTsc?: boolean; - skipClean?: boolean; - bundle?: boolean; - }; -}; + skipTsc?: boolean + skipClean?: boolean + bundle?: boolean + } +} export const readConfig = async (): Promise => { - const result = await cosmiconfig("cli").search(cwd()); + const result = await cosmiconfig("cli").search(cwd()) - return (result?.config as Config | undefined) ?? {}; -}; + return (result?.config as Config | undefined) ?? {} +} diff --git a/scripts/src/utils/esbuild-util.ts b/scripts/src/utils/esbuild-util.ts index deef23a..febd96a 100644 --- a/scripts/src/utils/esbuild-util.ts +++ b/scripts/src/utils/esbuild-util.ts @@ -1,9 +1,9 @@ -import type { BuildOptions } from "esbuild"; -import { build } from "esbuild"; -import { globby } from "globby"; +import type { BuildOptions } from "esbuild" +import { build } from "esbuild" +import { globby } from "globby" -import type { PackageJson } from "./pkg-util.js"; -import { findTsConfig } from "./ts-util.js"; +import type { PackageJson } from "./pkg-util.js" +import { findTsConfig } from "./ts-util.js" const DEFAULT_CONFIG: BuildOptions = { minify: false, @@ -12,26 +12,29 @@ const DEFAULT_CONFIG: BuildOptions = { sourcemap: false, sourcesContent: false, target: "node14", -}; +} export type CreateConfigOptions = { - bundle: boolean; - fileGlob: string; -}; + bundle: boolean + fileGlob: string +} export const createEsBuildConfig = async ( pkgJson: PackageJson, options: CreateConfigOptions, ): Promise => { - const { type = "module", version } = pkgJson; - const { bundle, fileGlob } = options; - const format = type === "module" ? "esm" : "cjs"; - const entryPoints = await globby([fileGlob, "!**/__tests__/**/*", "!**/*.spec.*", "!**/*.test.*"], { - absolute: true, - expandDirectories: true, - onlyFiles: true, - unique: true, - }); + const { type = "module", version } = pkgJson + const { bundle, fileGlob } = options + const format = type === "module" ? "esm" : "cjs" + const entryPoints = await globby( + [fileGlob, "!**/__tests__/**/*", "!**/*.spec.*", "!**/*.test.*"], + { + absolute: true, + expandDirectories: true, + onlyFiles: true, + unique: true, + }, + ) return { ...DEFAULT_CONFIG, @@ -42,8 +45,10 @@ export const createEsBuildConfig = async ( entryPoints, format, tsconfig: findTsConfig(), - }; -}; + } +} -export const runEsBuild = async (pkgJson: PackageJson, options: CreateConfigOptions) => - build(await createEsBuildConfig(pkgJson, options)); +export const runEsBuild = async ( + pkgJson: PackageJson, + options: CreateConfigOptions, +) => build(await createEsBuildConfig(pkgJson, options)) diff --git a/scripts/src/utils/pkg-util.ts b/scripts/src/utils/pkg-util.ts index ad01b8e..acaaa0b 100644 --- a/scripts/src/utils/pkg-util.ts +++ b/scripts/src/utils/pkg-util.ts @@ -1,11 +1,12 @@ -import { readFile } from "node:fs/promises"; +import { readFile } from "node:fs/promises" export type PackageJson = { - dependencies?: Record; - devDependencies?: Record; - name: string; - type?: "commonjs" | "module"; - version?: string; -}; + dependencies?: Record + devDependencies?: Record + name: string + type?: "commonjs" | "module" + version?: string +} -export const readPackageJson = async () => JSON.parse(await readFile("./package.json", "utf-8")) as PackageJson; +export const readPackageJson = async () => + JSON.parse(await readFile("./package.json", "utf-8")) as PackageJson diff --git a/scripts/src/utils/shell-util.ts b/scripts/src/utils/shell-util.ts index d79ea66..1d6e4cc 100644 --- a/scripts/src/utils/shell-util.ts +++ b/scripts/src/utils/shell-util.ts @@ -1,3 +1,4 @@ -import { execSync } from "node:child_process"; +import { execSync } from "node:child_process" -export const runCommand = (...command: string[]) => execSync(command.join(" "), { stdio: "inherit" }); +export const runCommand = (...command: string[]) => + execSync(command.join(" "), { stdio: "inherit" }) diff --git a/scripts/src/utils/ts-util.ts b/scripts/src/utils/ts-util.ts index d080ed5..4fe5e25 100644 --- a/scripts/src/utils/ts-util.ts +++ b/scripts/src/utils/ts-util.ts @@ -1,7 +1,7 @@ -import { resolve } from "node:path"; -import { existsSync } from "node:fs"; +import { resolve } from "node:path" +import { existsSync } from "node:fs" -import { runCommand } from "./shell-util.js"; +import { runCommand } from "./shell-util.js" const findTsConfigPath = () => existsSync("./tsconfig.build.json") @@ -10,10 +10,18 @@ const findTsConfigPath = () => ? "./tsconfig.json" : existsSync("../tsconfig.base.json") ? "../tsconfig.base.json" - : "../../tsconfig.base.json"; + : "../../tsconfig.base.json" -export const findTsConfig = () => resolve(findTsConfigPath()); +export const findTsConfig = () => resolve(findTsConfigPath()) export const runTsc = () => { - runCommand("tsc", "--project", findTsConfigPath(), "--declaration", "--emitDeclarationOnly", "--outDir", "dist"); -}; + runCommand( + "tsc", + "--project", + findTsConfigPath(), + "--declaration", + "--emitDeclarationOnly", + "--outDir", + "dist", + ) +} diff --git a/yarn.lock b/yarn.lock index 587297e..bb4c61e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,13 @@ __metadata: version: 6 cacheKey: 8 +"@aashutoshrathi/word-wrap@npm:^1.2.3": + version: 1.2.6 + resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" + checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd + languageName: node + linkType: hard + "@ampproject/remapping@npm:^2.0.0, @ampproject/remapping@npm:^2.1.0": version: 2.2.0 resolution: "@ampproject/remapping@npm:2.2.0" @@ -43,13 +50,13 @@ __metadata: dependencies: "@astro-aws/scripts": "workspace:^" "@types/node": ^18.14.0 - aws-cdk-lib: ^2.65.0 + aws-cdk-lib: ^2.0.0 constructs: ^10.1.253 eslint: ^8.34.0 prettier: ^2.8.4 typescript: ^4.9.5 peerDependencies: - aws-cdk-lib: ^2.40.0 + aws-cdk-lib: ^2.0.0 constructs: ^10.1.0 languageName: unknown linkType: soft @@ -62,8 +69,8 @@ __metadata: "@astro-aws/scripts": "workspace:^" "@astro-aws/www": "workspace:^" "@types/node": ^18.14.0 - aws-cdk: ^2.65.0 - aws-cdk-lib: ^2.65.0 + aws-cdk: ^2.94.0 + aws-cdk-lib: ^2.94.0 constructs: ^10.1.253 eslint: ^8.34.0 eslint-config-get-off-my-lawn: ^7.2.0 @@ -134,6 +141,13 @@ __metadata: languageName: node linkType: hard +"@astrojs/compiler@npm:^1.5.5": + version: 1.8.2 + resolution: "@astrojs/compiler@npm:1.8.2" + checksum: 1d55879f8f7aadcad02f19353c085d4e74d5f9cd0d873c600e31ad58928e80d6ab7d6e80b997e2fecabd697f69b0ae166acac58178b833d2d8051a2e35800dc2 + languageName: node + linkType: hard + "@astrojs/language-server@npm:^0.28.3": version: 0.28.3 resolution: "@astrojs/language-server@npm:0.28.3" @@ -248,24 +262,24 @@ __metadata: languageName: node linkType: hard -"@aws-cdk/asset-awscli-v1@npm:^2.2.65": - version: 2.2.70 - resolution: "@aws-cdk/asset-awscli-v1@npm:2.2.70" - checksum: 1d4ec566cb435459522ae03eddf9e21aa1c13ac0dc73f97c1937fe40563ce1a4636d4734ab67405be4a3b5a17567254c71a3156a5e7443cf0fd2e4f719240867 +"@aws-cdk/asset-awscli-v1@npm:^2.2.200": + version: 2.2.200 + resolution: "@aws-cdk/asset-awscli-v1@npm:2.2.200" + checksum: 0de92336887957e188092dc62a9b8fa87b8e602b8678faa361cc12680cedde46a2592dc1c73b33a0d2067e1a000d2afa762b2a14c07fb47b3fcad288a24ce7ed languageName: node linkType: hard -"@aws-cdk/asset-kubectl-v20@npm:^2.1.1": - version: 2.1.1 - resolution: "@aws-cdk/asset-kubectl-v20@npm:2.1.1" - checksum: f5883fae7b6d3d17e5125560a6efa5065d8b319c11ea6639caa68e315427c4fa266433db04b1a776cf12ccc8c8f8e9a3dfc0ac8cc3c0e73545f80b07808281e2 +"@aws-cdk/asset-kubectl-v20@npm:^2.1.2": + version: 2.1.2 + resolution: "@aws-cdk/asset-kubectl-v20@npm:2.1.2" + checksum: 987bce26f54ba64596b7d15adf0c09603814ed56f06b498d17dc4b8859f4708662c9c48f88bba2810d8fac04cf84b8f3e51806c93cf65aeb6148ad76bc250f84 languageName: node linkType: hard -"@aws-cdk/asset-node-proxy-agent-v5@npm:^2.0.54": - version: 2.0.59 - resolution: "@aws-cdk/asset-node-proxy-agent-v5@npm:2.0.59" - checksum: 4629c09cf9f46854f2a3f28a0b1b4d83bff6d80f22cc16217d5e1c5f1c33e08caa175178e2c93532b947ff615c48c90b0be9c91bdedf77a0eedd668fe2c35da5 +"@aws-cdk/asset-node-proxy-agent-v6@npm:^2.0.1": + version: 2.0.1 + resolution: "@aws-cdk/asset-node-proxy-agent-v6@npm:2.0.1" + checksum: 5d011a554e71212662e32ff5d9187a1733a07d5424bdedfef2f43e7a6075d4b5f316d696867cc5dcd9ed1a11731b0d6b3ae41872c454796c326983ab382e05d0 languageName: node linkType: hard @@ -470,6 +484,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.22.5": + version: 7.22.15 + resolution: "@babel/helper-validator-identifier@npm:7.22.15" + checksum: eb0bee4bda664c0959924bc1ad5611eacfce806f46612202dd164fef1df8fef1a11682a1e7615288987100e9fb304982b6e2a4ff07ffe842ab8765b95ed1118c + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.16.7, @babel/helper-validator-option@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-validator-option@npm:7.18.6" @@ -603,6 +624,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.20.7": + version: 7.22.15 + resolution: "@babel/runtime@npm:7.22.15" + dependencies: + regenerator-runtime: ^0.14.0 + checksum: 793296df1e41599a935a3d77ec01eb6088410d3fd4dbe4e92f06c6b7bb2f8355024e6d78621a3a35f44e0e23b0b59107f23d585384df4f3123256a1e1492040e + languageName: node + linkType: hard + "@babel/template@npm:^7.16.7, @babel/template@npm:^7.18.10, @babel/template@npm:^7.20.7": version: 7.20.7 resolution: "@babel/template@npm:7.20.7" @@ -650,12 +680,12 @@ __metadata: languageName: node linkType: hard -"@changesets/apply-release-plan@npm:^6.1.3": - version: 6.1.3 - resolution: "@changesets/apply-release-plan@npm:6.1.3" +"@changesets/apply-release-plan@npm:^6.1.4": + version: 6.1.4 + resolution: "@changesets/apply-release-plan@npm:6.1.4" dependencies: "@babel/runtime": ^7.20.1 - "@changesets/config": ^2.3.0 + "@changesets/config": ^2.3.1 "@changesets/get-version-range-type": ^0.3.2 "@changesets/git": ^2.0.0 "@changesets/types": ^5.2.1 @@ -666,22 +696,22 @@ __metadata: outdent: ^0.5.0 prettier: ^2.7.1 resolve-from: ^5.0.0 - semver: ^5.4.1 - checksum: 3772a6e0ede33abdac6fcc52359307f770d5fafa53295c83e0a11b81e5802b2fe5e74e4d672c0a082f5d73dc1a9ef56509870b81824111396f74de99ada9526b + semver: ^7.5.3 + checksum: d386aee70c5483c97d964c6fa1191878005b7050d34b2e1e4a1ad66d9ad44f8f20d1c884e01e770b954bd2d4364f935510e53ae896212669f67e5c37b2a610c7 languageName: node linkType: hard -"@changesets/assemble-release-plan@npm:^5.2.3": - version: 5.2.3 - resolution: "@changesets/assemble-release-plan@npm:5.2.3" +"@changesets/assemble-release-plan@npm:^5.2.4": + version: 5.2.4 + resolution: "@changesets/assemble-release-plan@npm:5.2.4" dependencies: "@babel/runtime": ^7.20.1 "@changesets/errors": ^0.1.4 - "@changesets/get-dependents-graph": ^1.3.5 + "@changesets/get-dependents-graph": ^1.3.6 "@changesets/types": ^5.2.1 "@manypkg/get-packages": ^1.1.3 - semver: ^5.4.1 - checksum: 2c61894414736b12e9a26903d73c387b65f4caba398e280488b885f4d0f4bb307aaa6bae140dfd754c85de6557bd07645accda2af6b8794837ab43823ba6215c + semver: ^7.5.3 + checksum: 32f443a0afec3d5a4afc68c8de32e8ff88531ea24976b50583b1d6870d71cec2729f27952af82854eb54e2ad0a619872d211d654c596ee0eb42c83ab54ad15ae languageName: node linkType: hard @@ -705,18 +735,18 @@ __metadata: languageName: node linkType: hard -"@changesets/cli@npm:^2.26.0": - version: 2.26.0 - resolution: "@changesets/cli@npm:2.26.0" +"@changesets/cli@npm:^2.26.2": + version: 2.26.2 + resolution: "@changesets/cli@npm:2.26.2" dependencies: "@babel/runtime": ^7.20.1 - "@changesets/apply-release-plan": ^6.1.3 - "@changesets/assemble-release-plan": ^5.2.3 + "@changesets/apply-release-plan": ^6.1.4 + "@changesets/assemble-release-plan": ^5.2.4 "@changesets/changelog-git": ^0.1.14 - "@changesets/config": ^2.3.0 + "@changesets/config": ^2.3.1 "@changesets/errors": ^0.1.4 - "@changesets/get-dependents-graph": ^1.3.5 - "@changesets/get-release-plan": ^3.0.16 + "@changesets/get-dependents-graph": ^1.3.6 + "@changesets/get-release-plan": ^3.0.17 "@changesets/git": ^2.0.0 "@changesets/logger": ^0.0.5 "@changesets/pre": ^1.0.14 @@ -725,7 +755,7 @@ __metadata: "@changesets/write": ^0.2.3 "@manypkg/get-packages": ^1.1.3 "@types/is-ci": ^3.0.0 - "@types/semver": ^6.0.0 + "@types/semver": ^7.5.0 ansi-colors: ^4.1.3 chalk: ^2.1.0 enquirer: ^2.3.0 @@ -738,28 +768,28 @@ __metadata: p-limit: ^2.2.0 preferred-pm: ^3.0.0 resolve-from: ^5.0.0 - semver: ^5.4.1 + semver: ^7.5.3 spawndamnit: ^2.0.0 term-size: ^2.1.0 tty-table: ^4.1.5 bin: changeset: bin.js - checksum: 12a911b4196ff390ce114e27b475e59f5f5e1fdc7049d1ab04effe73d4811d99db47a030de6abe332300b4b2c43cffc537cec4883476b59b69bc23aee07cd5c5 + checksum: fc7b5bf319b19abed7a8d33a9fbd9ce49108af61c9c51920f609a49cb0c557f0b998711250d0cac149d0bed8a522f3109c4d8b0dda65b96ff2f823d16ca2f972 languageName: node linkType: hard -"@changesets/config@npm:^2.3.0": - version: 2.3.0 - resolution: "@changesets/config@npm:2.3.0" +"@changesets/config@npm:^2.3.1": + version: 2.3.1 + resolution: "@changesets/config@npm:2.3.1" dependencies: "@changesets/errors": ^0.1.4 - "@changesets/get-dependents-graph": ^1.3.5 + "@changesets/get-dependents-graph": ^1.3.6 "@changesets/logger": ^0.0.5 "@changesets/types": ^5.2.1 "@manypkg/get-packages": ^1.1.3 fs-extra: ^7.0.1 micromatch: ^4.0.2 - checksum: 68a61437ffeda219f22f6d4d32bf8d428e6f284d7e0e191c0629f64f035a051b4068222b1ea3ff1866e5944a153004735dab82205404919f6806c97c546700b1 + checksum: 8af58e3add4751ac8ce2c01f026ac8843b8d1c07c9a3df6518496eaef67f56458a84cad310763c588f7eccbf6831afbf280df7e05e78b294027b6b847be3d0cc languageName: node linkType: hard @@ -772,16 +802,16 @@ __metadata: languageName: node linkType: hard -"@changesets/get-dependents-graph@npm:^1.3.5": - version: 1.3.5 - resolution: "@changesets/get-dependents-graph@npm:1.3.5" +"@changesets/get-dependents-graph@npm:^1.3.6": + version: 1.3.6 + resolution: "@changesets/get-dependents-graph@npm:1.3.6" dependencies: "@changesets/types": ^5.2.1 "@manypkg/get-packages": ^1.1.3 chalk: ^2.1.0 fs-extra: ^7.0.1 - semver: ^5.4.1 - checksum: d7abb1da21804fd66b1458e46be2f2aec741145a43500b0463a5acfbb420ac5ce776a7328fa660ad4e6e811f933bd6f36e7bbaf00fb3f591d46f0b8e7108fdcd + semver: ^7.5.3 + checksum: d2cbbc5041063b939899502d1b264a0d9edb655acefd7f6197883229156bb7cfd1ace642ae4a1f7f7b432f2c51429f5dc9851ff5a9ed47f1c0159916e66627a9 languageName: node linkType: hard @@ -795,18 +825,18 @@ __metadata: languageName: node linkType: hard -"@changesets/get-release-plan@npm:^3.0.16": - version: 3.0.16 - resolution: "@changesets/get-release-plan@npm:3.0.16" +"@changesets/get-release-plan@npm:^3.0.17": + version: 3.0.17 + resolution: "@changesets/get-release-plan@npm:3.0.17" dependencies: "@babel/runtime": ^7.20.1 - "@changesets/assemble-release-plan": ^5.2.3 - "@changesets/config": ^2.3.0 + "@changesets/assemble-release-plan": ^5.2.4 + "@changesets/config": ^2.3.1 "@changesets/pre": ^1.0.14 "@changesets/read": ^0.5.9 "@changesets/types": ^5.2.1 "@manypkg/get-packages": ^1.1.3 - checksum: ab8360c17f69437ad51edfd8910a2609ab8dc1e8cf006994b3938b2551b1eb08b7ab8043b8bf1e94916cbadd89e357a0c1148e20eab8bb5e3ae284384d239942 + checksum: 8a0e3794d0f1e6220d173dbec96352ad69b585d013c3183888ca598dfdfcaa8a5ac3f7f36d5c511575cdc3559c2ad6f8cecfaa16ba9c24380899a81daa7af924 languageName: node linkType: hard @@ -941,6 +971,17 @@ __metadata: languageName: node linkType: hard +"@es-joy/jsdoccomment@npm:~0.40.1": + version: 0.40.1 + resolution: "@es-joy/jsdoccomment@npm:0.40.1" + dependencies: + comment-parser: 1.4.0 + esquery: ^1.5.0 + jsdoc-type-pratt-parser: ~4.0.0 + checksum: 6098394cd97ad0532dde4f3171980e700e4199c231969311efd2362c2b5a4eefa9d59a0bc1fe513afbb5cc456ef7633491a2984d64252e7bd8ebe22489120610 + languageName: node + linkType: hard + "@esbuild/android-arm64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/android-arm64@npm:0.16.17" @@ -1249,6 +1290,24 @@ __metadata: languageName: node linkType: hard +"@eslint-community/eslint-utils@npm:^4.1.2, @eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": + version: 4.4.0 + resolution: "@eslint-community/eslint-utils@npm:4.4.0" + dependencies: + eslint-visitor-keys: ^3.3.0 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.4.0, @eslint-community/regexpp@npm:^4.5.0, @eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.0, @eslint-community/regexpp@npm:^4.6.1": + version: 4.8.0 + resolution: "@eslint-community/regexpp@npm:4.8.0" + checksum: 601e6d033d556e98e8c929905bef335f20d7389762812df4d0f709d9b4d2631610dda975fb272e23b5b68e24a163b3851b114c8080a0a19fb4c141a1eff6305b + languageName: node + linkType: hard + "@eslint/eslintrc@npm:^1.4.1": version: 1.4.1 resolution: "@eslint/eslintrc@npm:1.4.1" @@ -1266,6 +1325,30 @@ __metadata: languageName: node linkType: hard +"@eslint/eslintrc@npm:^2.1.2": + version: 2.1.2 + resolution: "@eslint/eslintrc@npm:2.1.2" + dependencies: + ajv: ^6.12.4 + debug: ^4.3.2 + espree: ^9.6.0 + globals: ^13.19.0 + ignore: ^5.2.0 + import-fresh: ^3.2.1 + js-yaml: ^4.1.0 + minimatch: ^3.1.2 + strip-json-comments: ^3.1.1 + checksum: bc742a1e3b361f06fedb4afb6bf32cbd27171292ef7924f61c62f2aed73048367bcc7ac68f98c06d4245cd3fabc43270f844e3c1699936d4734b3ac5398814a7 + languageName: node + linkType: hard + +"@eslint/js@npm:8.48.0": + version: 8.48.0 + resolution: "@eslint/js@npm:8.48.0" + checksum: b2755f9c0ee810c886eba3c50dcacb184ba5a5cd1cbc01988ee506ad7340653cae0bd55f1d95c64b56dfc6d25c2caa7825335ffd2c50165bae9996fe0f396851 + languageName: node + linkType: hard + "@faker-js/faker@npm:^7.6.0": version: 7.6.0 resolution: "@faker-js/faker@npm:7.6.0" @@ -1280,6 +1363,33 @@ __metadata: languageName: node linkType: hard +"@html-eslint/eslint-plugin@npm:^0.19.1": + version: 0.19.1 + resolution: "@html-eslint/eslint-plugin@npm:0.19.1" + checksum: d1663897575895b01630236a97e08acfa93febd1847832714f3271a89f7d44dd79956ecfb5bfb5e402dc67b529c64b2d618c98377fc313da8203a9343b317f02 + languageName: node + linkType: hard + +"@html-eslint/parser@npm:^0.19.1": + version: 0.19.1 + resolution: "@html-eslint/parser@npm:0.19.1" + dependencies: + es-html-parser: ^0.0.9 + checksum: 6acd026bbddc4b6b7ebd092daa76ce2752e1667d4a3f0ba64c4e9b9ffa457ad1d3b1b300743c6896dedd6d832883a25a63850f29c1e58ea8585cdd7951b1d846 + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.11.10": + version: 0.11.11 + resolution: "@humanwhocodes/config-array@npm:0.11.11" + dependencies: + "@humanwhocodes/object-schema": ^1.2.1 + debug: ^4.1.1 + minimatch: ^3.0.5 + checksum: db84507375ab77b8ffdd24f498a5b49ad6b64391d30dd2ac56885501d03964d29637e05b1ed5aefa09d57ac667e28028bc22d2da872bfcd619652fbdb5f4ca19 + languageName: node + linkType: hard + "@humanwhocodes/config-array@npm:^0.11.8": version: 0.11.8 resolution: "@humanwhocodes/config-array@npm:0.11.8" @@ -1374,31 +1484,64 @@ __metadata: languageName: node linkType: hard -"@lshay/eslint-config@npm:^0.2.2": - version: 0.2.2 - resolution: "@lshay/eslint-config@npm:0.2.2" +"@lshay/eslint-config@npm:^0.3.5": + version: 0.3.5 + resolution: "@lshay/eslint-config@npm:0.3.5" dependencies: - eslint-config-get-off-my-lawn: ^7.2.0 + "@html-eslint/eslint-plugin": ^0.19.1 + "@html-eslint/parser": ^0.19.1 + "@react-native-community/eslint-plugin": ^1.3.0 + "@regru/eslint-plugin-prefer-early-return": ^1.0.0 + "@rushstack/eslint-patch": ^1.3.2 + "@typescript-eslint/eslint-plugin": ^6.2.0 + "@typescript-eslint/parser": ^6.2.0 + eslint-import-resolver-typescript: ^3.5.5 + eslint-plugin-compat: ^4.1.4 + eslint-plugin-deprecation: ^1.5.0 + eslint-plugin-etc: ^2.0.3 + eslint-plugin-fp: ^2.3.0 + eslint-plugin-import: ^2.27.5 + eslint-plugin-jsdoc: ^46.4.5 + eslint-plugin-jsx-a11y: ^6.7.1 + eslint-plugin-n: ^16.0.1 + eslint-plugin-perfectionist: ^1.5.1 + eslint-plugin-promise: ^6.1.1 + eslint-plugin-react: ^7.33.0 + eslint-plugin-react-hooks: ^4.6.0 + eslint-plugin-react-native: ^4.0.0 + eslint-plugin-react-perf: ^3.3.1 + eslint-plugin-react-refresh: ^0.4.3 + eslint-plugin-regexp: ^1.15.0 + eslint-plugin-security: ^1.7.1 + eslint-plugin-sonarjs: ^0.19.0 + eslint-plugin-ssr-friendly: ^1.2.0 + eslint-plugin-total-functions: ^7.0.7 + eslint-plugin-tsdoc: ^0.2.17 + eslint-plugin-unicorn: ^48.0.1 + eslint-plugin-validate-jsx-nesting: ^0.1.1 + eslint-plugin-vitest: ^0.2.8 + merge-anything: ^5.1.7 + semver: ^7.5.4 peerDependencies: eslint: 8.x - checksum: f224a2699391b5f2780f9938ea490e9c3d05d09f9c4b95cf7f600eb49f57309f7241b6677fe039a835eeda174530e8b024c599994d40644ee93a770bdaa0149e + checksum: b0bde736f7c0e26611529c692ab1a56ba1a0a78f4d3396932454e1ac0bbd0d1fa62cad36c098cbf705598d23ff78774a9e159db9d17ac39b2dd9fcdb5f57a005 languageName: node linkType: hard -"@lshay/prettier-config@npm:^0.5.3": - version: 0.5.3 - resolution: "@lshay/prettier-config@npm:0.5.3" +"@lshay/prettier-config@npm:^0.6.0": + version: 0.6.0 + resolution: "@lshay/prettier-config@npm:0.6.0" dependencies: - merge-anything: ^5.1.4 - prettier-plugin-astro: ^0.7.2 + merge-anything: ^5.1.7 + prettier-plugin-astro: ^0.11.0 prettier-plugin-jsdoc: ^0.4.2 - prettier-plugin-packagejson: ^2.3.0 - prettier-plugin-sh: ^0.12.8 + prettier-plugin-packagejson: ^2.4.5 + prettier-plugin-sh: ^0.13.1 prettier-plugin-sort-json: ^1.0.0 - prettier-plugin-tailwindcss: ^0.2.1 + prettier-plugin-tailwindcss: ^0.4.1 peerDependencies: - prettier: 2.x - checksum: 2c32cb83eef045d291d3976cbe950c0da3ac81588dd420254d49430978219867bc231fe719a8451e83e80164fc76587b6db25662cd70657df44ffea88da70581 + prettier: 2.x || 3.x + checksum: 54f191e8c05a015b4b75e3caf56986d5ae72ad68bec26fc7e0d41ee7004b19b3acaff5391511b35074fbb55d1f9f8b48951e907bfccc46b677439873ecff251f languageName: node linkType: hard @@ -1428,6 +1571,13 @@ __metadata: languageName: node linkType: hard +"@mdn/browser-compat-data@npm:^5.2.34, @mdn/browser-compat-data@npm:^5.3.13": + version: 5.3.14 + resolution: "@mdn/browser-compat-data@npm:5.3.14" + checksum: 78643c1940a4ca8fe57b9303fb403823eae77ae0ae2fc09208ac9e630b8fffaab0c0dd2736a82974220c46f4d9d89f1e06b0331320e7c5d977f3760698e9da87 + languageName: node + linkType: hard + "@mdx-js/mdx@npm:^2.0.0": version: 2.2.1 resolution: "@mdx-js/mdx@npm:2.2.1" @@ -1492,6 +1642,25 @@ __metadata: languageName: node linkType: hard +"@microsoft/tsdoc-config@npm:0.16.2": + version: 0.16.2 + resolution: "@microsoft/tsdoc-config@npm:0.16.2" + dependencies: + "@microsoft/tsdoc": 0.14.2 + ajv: ~6.12.6 + jju: ~1.4.0 + resolve: ~1.19.0 + checksum: 12b0d703154076bcaac75ca42e804e4fc292672396441e54346d7eadd0d6b57f90980eda2b1bab89b224af86da34a2389f9054002e282011e795ca5919a4386f + languageName: node + linkType: hard + +"@microsoft/tsdoc@npm:0.14.2": + version: 0.14.2 + resolution: "@microsoft/tsdoc@npm:0.14.2" + checksum: b167c89e916ba73ee20b9c9d5dba6aa3a0de25ed3d50050e8a344dca7cd43cb2e1059bd515c820369b6e708901dd3fda476a42bc643ca74a35671ce77f724a3a + languageName: node + linkType: hard + "@next/eslint-plugin-next@npm:12.0.10": version: 12.0.10 resolution: "@next/eslint-plugin-next@npm:12.0.10" @@ -1548,6 +1717,17 @@ __metadata: languageName: node linkType: hard +"@phenomnomnominal/tsquery@npm:^5.0.0": + version: 5.0.1 + resolution: "@phenomnomnominal/tsquery@npm:5.0.1" + dependencies: + esquery: ^1.4.0 + peerDependencies: + typescript: ^3 || ^4 || ^5 + checksum: d8636ece9edb1212394427411870285c67709f0a047c61453ab602e9277cb49c85069d00d4734e4934a5857ab159f24baecac84fae2530ea88bd6aff570eee03 + languageName: node + linkType: hard + "@pkgr/utils@npm:^2.3.1": version: 2.3.1 resolution: "@pkgr/utils@npm:2.3.1" @@ -1562,6 +1742,20 @@ __metadata: languageName: node linkType: hard +"@react-native-community/eslint-plugin@npm:^1.3.0": + version: 1.3.0 + resolution: "@react-native-community/eslint-plugin@npm:1.3.0" + checksum: 5e04fa161fca6453299aed691695ea071fed8166c5da36935047eb6c169bc38c9d599e1ce20402b63cbcaf086a9bb63d2e88836be142cecabf61ba36954ccaae + languageName: node + linkType: hard + +"@regru/eslint-plugin-prefer-early-return@npm:^1.0.0": + version: 1.0.0 + resolution: "@regru/eslint-plugin-prefer-early-return@npm:1.0.0" + checksum: c5866e1e8934537d649736a1e55fdeb1f92bf22dd4d78519628a3d4f5bcabcc6e521e7b2b07b80d8ae30bfa8d5d6c26fad2519fc96291e4ba9d0a9d4ff81d61f + languageName: node + linkType: hard + "@rollup/pluginutils@npm:^5.0.0": version: 5.0.2 resolution: "@rollup/pluginutils@npm:5.0.2" @@ -1585,10 +1779,10 @@ __metadata: languageName: node linkType: hard -"@rushstack/eslint-patch@npm:^1.2.0": - version: 1.2.0 - resolution: "@rushstack/eslint-patch@npm:1.2.0" - checksum: faa749faae0e83c26ae9eb00ad36a897ac78f3cf27da8e8ff21c00bcf7973b598d823d8f2b3957ef66079288bcf577f94df831eae2d65f3f68d8ca32f18b6aff +"@rushstack/eslint-patch@npm:^1.3.2, @rushstack/eslint-patch@npm:^1.3.3": + version: 1.3.3 + resolution: "@rushstack/eslint-patch@npm:1.3.3" + checksum: fd8a19ec5842634da8e4c2c479a4d13ecbefa4f212e42c7f9c39e8706f9eeef7a50db8d6ea939884ac0ff36bb21930c9642068cf68e8309ad491c54f2fc30c01 languageName: node linkType: hard @@ -1757,6 +1951,13 @@ __metadata: languageName: node linkType: hard +"@types/json-schema@npm:^7.0.12": + version: 7.0.12 + resolution: "@types/json-schema@npm:7.0.12" + checksum: 00239e97234eeb5ceefb0c1875d98ade6e922bfec39dd365ec6bd360b5c2f825e612ac4f6e5f1d13601b8b30f378f15e6faa805a3a732f4a1bbe61915163d293 + languageName: node + linkType: hard + "@types/json-schema@npm:^7.0.9": version: 7.0.11 resolution: "@types/json-schema@npm:7.0.11" @@ -1882,13 +2083,6 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^6.0.0": - version: 6.2.3 - resolution: "@types/semver@npm:6.2.3" - checksum: 83c86d7005b229df9c4c0d6d13825b839a01932895504596140aea19e2b88f63ac27ab1575347451b50eedb63f72309e845ce1a0ca78360c4f719bbb38371594 - languageName: node - linkType: hard - "@types/semver@npm:^7.3.12": version: 7.3.13 resolution: "@types/semver@npm:7.3.13" @@ -1896,6 +2090,13 @@ __metadata: languageName: node linkType: hard +"@types/semver@npm:^7.5.0": + version: 7.5.1 + resolution: "@types/semver@npm:7.5.1" + checksum: 2fffe938c7ac168711f245a16e1856a3578d77161ca17e29a05c3e02c7be3e9c5beefa29a3350f6c1bd982fb70aa28cc52e4845eb7d36246bcdc0377170d584d + languageName: node + linkType: hard + "@types/unist@npm:*, @types/unist@npm:^2.0.0": version: 2.0.6 resolution: "@types/unist@npm:2.0.6" @@ -1903,13 +2104,22 @@ __metadata: languageName: node linkType: hard -"@types/yargs-parser@npm:^21.0.0": +"@types/yargs-parser@npm:*, @types/yargs-parser@npm:^21.0.0": version: 21.0.0 resolution: "@types/yargs-parser@npm:21.0.0" checksum: b2f4c8d12ac18a567440379909127cf2cec393daffb73f246d0a25df36ea983b93b7e9e824251f959e9f928cbc7c1aab6728d0a0ff15d6145f66cec2be67d9a2 languageName: node linkType: hard +"@types/yargs@npm:^17.0.0": + version: 17.0.24 + resolution: "@types/yargs@npm:17.0.24" + dependencies: + "@types/yargs-parser": "*" + checksum: 5f3ac4dc4f6e211c1627340160fbe2fd247ceba002190da6cf9155af1798450501d628c9165a183f30a224fc68fa5e700490d740ff4c73e2cdef95bc4e8ba7bf + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:5.10.2": version: 5.10.2 resolution: "@typescript-eslint/eslint-plugin@npm:5.10.2" @@ -1933,6 +2143,66 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/eslint-plugin@npm:^5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/eslint-plugin@npm:5.62.0" + dependencies: + "@eslint-community/regexpp": ^4.4.0 + "@typescript-eslint/scope-manager": 5.62.0 + "@typescript-eslint/type-utils": 5.62.0 + "@typescript-eslint/utils": 5.62.0 + debug: ^4.3.4 + graphemer: ^1.4.0 + ignore: ^5.2.0 + natural-compare-lite: ^1.4.0 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependencies: + "@typescript-eslint/parser": ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: fc104b389c768f9fa7d45a48c86d5c1ad522c1d0512943e782a56b1e3096b2cbcc1eea3fcc590647bf0658eef61aac35120a9c6daf979bf629ad2956deb516a1 + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^6.2.0": + version: 6.6.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.6.0" + dependencies: + "@eslint-community/regexpp": ^4.5.1 + "@typescript-eslint/scope-manager": 6.6.0 + "@typescript-eslint/type-utils": 6.6.0 + "@typescript-eslint/utils": 6.6.0 + "@typescript-eslint/visitor-keys": 6.6.0 + debug: ^4.3.4 + graphemer: ^1.4.0 + ignore: ^5.2.4 + natural-compare: ^1.4.0 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: ed41c6df87096706777e9c1f53adabd998fd840691b57f5b68b18903e567f16c0a8354ff0ad29229c249f29440ba4a017c9fe966da182a455dde9769232a4344 + languageName: node + linkType: hard + +"@typescript-eslint/experimental-utils@npm:^5.0.0": + version: 5.62.0 + resolution: "@typescript-eslint/experimental-utils@npm:5.62.0" + dependencies: + "@typescript-eslint/utils": 5.62.0 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: ce55d9f74eac5cb94d66d5db9ead9a5d734f4301519fb5956a57f4b405a5318a115b0316195a3c039e0111489138680411709cb769085d71e1e1db1376ea0949 + languageName: node + linkType: hard + "@typescript-eslint/parser@npm:5.10.2": version: 5.10.2 resolution: "@typescript-eslint/parser@npm:5.10.2" @@ -1950,6 +2220,41 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/parser@npm:^5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/parser@npm:5.62.0" + dependencies: + "@typescript-eslint/scope-manager": 5.62.0 + "@typescript-eslint/types": 5.62.0 + "@typescript-eslint/typescript-estree": 5.62.0 + debug: ^4.3.4 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: d168f4c7f21a7a63f47002e2d319bcbb6173597af5c60c1cf2de046b46c76b4930a093619e69faf2d30214c29ab27b54dcf1efc7046a6a6bd6f37f59a990e752 + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^6.2.0": + version: 6.6.0 + resolution: "@typescript-eslint/parser@npm:6.6.0" + dependencies: + "@typescript-eslint/scope-manager": 6.6.0 + "@typescript-eslint/types": 6.6.0 + "@typescript-eslint/typescript-estree": 6.6.0 + "@typescript-eslint/visitor-keys": 6.6.0 + debug: ^4.3.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: b2d0082b6acc1a85997ebbb60fc73a43f3fe5e5028cb4130938a2cffddc94872c8e0d00a1742be8f8b755bc1994d43b55b7e4660dc88946744094ff2aca4ffd3 + languageName: node + linkType: hard + "@typescript-eslint/scope-manager@npm:5.10.2": version: 5.10.2 resolution: "@typescript-eslint/scope-manager@npm:5.10.2" @@ -1970,6 +2275,26 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/scope-manager@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/scope-manager@npm:5.62.0" + dependencies: + "@typescript-eslint/types": 5.62.0 + "@typescript-eslint/visitor-keys": 5.62.0 + checksum: 6062d6b797fe1ce4d275bb0d17204c827494af59b5eaf09d8a78cdd39dadddb31074dded4297aaf5d0f839016d601032857698b0e4516c86a41207de606e9573 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:6.6.0": + version: 6.6.0 + resolution: "@typescript-eslint/scope-manager@npm:6.6.0" + dependencies: + "@typescript-eslint/types": 6.6.0 + "@typescript-eslint/visitor-keys": 6.6.0 + checksum: 18b552fee98894c4f35e9f3d71a276f266ad4e2d7c6b9bb32a9b25caa36cc3768928676972b4e78308098ad53fa8dc6626a82810f17d51c667ce959da3ac11bc + languageName: node + linkType: hard + "@typescript-eslint/type-utils@npm:5.10.2": version: 5.10.2 resolution: "@typescript-eslint/type-utils@npm:5.10.2" @@ -1986,6 +2311,40 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/type-utils@npm:5.62.0, @typescript-eslint/type-utils@npm:^5.55.0, @typescript-eslint/type-utils@npm:^5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/type-utils@npm:5.62.0" + dependencies: + "@typescript-eslint/typescript-estree": 5.62.0 + "@typescript-eslint/utils": 5.62.0 + debug: ^4.3.4 + tsutils: ^3.21.0 + peerDependencies: + eslint: "*" + peerDependenciesMeta: + typescript: + optional: true + checksum: fc41eece5f315dfda14320be0da78d3a971d650ea41300be7196934b9715f3fe1120a80207551eb71d39568275dbbcf359bde540d1ca1439d8be15e9885d2739 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:6.6.0": + version: 6.6.0 + resolution: "@typescript-eslint/type-utils@npm:6.6.0" + dependencies: + "@typescript-eslint/typescript-estree": 6.6.0 + "@typescript-eslint/utils": 6.6.0 + debug: ^4.3.4 + ts-api-utils: ^1.0.1 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: be68ebc1d8da9d4db48933cfd5c8f22382fdf1faf4116b0eb929c65eaeaf00ef224f38b03e7f6ea2de4496d046380876dd5db514c65d078ebc7a25e771a61265 + languageName: node + linkType: hard + "@typescript-eslint/types@npm:5.10.2": version: 5.10.2 resolution: "@typescript-eslint/types@npm:5.10.2" @@ -2000,6 +2359,20 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:5.62.0, @typescript-eslint/types@npm:^5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/types@npm:5.62.0" + checksum: 48c87117383d1864766486f24de34086155532b070f6264e09d0e6139449270f8a9559cfef3c56d16e3bcfb52d83d42105d61b36743626399c7c2b5e0ac3b670 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:6.6.0": + version: 6.6.0 + resolution: "@typescript-eslint/types@npm:6.6.0" + checksum: d0642ad52e904062a4ac75ac4e6cc51d81ec6030f8830e230df476e69786d3232d45ca0c9ce011add9ede13f0eba4ab7f1eaf679954c6602cf4f43e1ba002be9 + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:5.10.2": version: 5.10.2 resolution: "@typescript-eslint/typescript-estree@npm:5.10.2" @@ -2036,6 +2409,42 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/typescript-estree@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" + dependencies: + "@typescript-eslint/types": 5.62.0 + "@typescript-eslint/visitor-keys": 5.62.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 3624520abb5807ed8f57b1197e61c7b1ed770c56dfcaca66372d584ff50175225798bccb701f7ef129d62c5989070e1ee3a0aa2d84e56d9524dcf011a2bb1a52 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:6.6.0": + version: 6.6.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.6.0" + dependencies: + "@typescript-eslint/types": 6.6.0 + "@typescript-eslint/visitor-keys": 6.6.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependenciesMeta: + typescript: + optional: true + checksum: 100620bc5865dc9d2551c6be520a34b931bc70eca144c5ab0e275b81e57aa92f24a9d3a57f332d98b96e4581cf7e87211c3196d964f4951c7a2508105e3bd3f5 + languageName: node + linkType: hard + "@typescript-eslint/utils@npm:5.10.2": version: 5.10.2 resolution: "@typescript-eslint/utils@npm:5.10.2" @@ -2052,6 +2461,41 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/utils@npm:5.62.0, @typescript-eslint/utils@npm:^5.57.0, @typescript-eslint/utils@npm:^5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/utils@npm:5.62.0" + dependencies: + "@eslint-community/eslint-utils": ^4.2.0 + "@types/json-schema": ^7.0.9 + "@types/semver": ^7.3.12 + "@typescript-eslint/scope-manager": 5.62.0 + "@typescript-eslint/types": 5.62.0 + "@typescript-eslint/typescript-estree": 5.62.0 + eslint-scope: ^5.1.1 + semver: ^7.3.7 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: ee9398c8c5db6d1da09463ca7bf36ed134361e20131ea354b2da16a5fdb6df9ba70c62a388d19f6eebb421af1786dbbd79ba95ddd6ab287324fc171c3e28d931 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:6.6.0, @typescript-eslint/utils@npm:^6.2.0": + version: 6.6.0 + resolution: "@typescript-eslint/utils@npm:6.6.0" + dependencies: + "@eslint-community/eslint-utils": ^4.4.0 + "@types/json-schema": ^7.0.12 + "@types/semver": ^7.5.0 + "@typescript-eslint/scope-manager": 6.6.0 + "@typescript-eslint/types": 6.6.0 + "@typescript-eslint/typescript-estree": 6.6.0 + semver: ^7.5.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: da02305703569549eb7deebb7512940cd40426eccec684680087a5b8c8e08052e2ff0ff6951a2ca64740e86e4b5b390903d0b13ad51efc374d9ae54f70c6a046 + languageName: node + linkType: hard + "@typescript-eslint/utils@npm:^5.10.0": version: 5.51.0 resolution: "@typescript-eslint/utils@npm:5.51.0" @@ -2090,6 +2534,26 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" + dependencies: + "@typescript-eslint/types": 5.62.0 + eslint-visitor-keys: ^3.3.0 + checksum: 976b05d103fe8335bef5c93ad3f76d781e3ce50329c0243ee0f00c0fcfb186c81df50e64bfdd34970148113f8ade90887f53e3c4938183afba830b4ba8e30a35 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:6.6.0": + version: 6.6.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.6.0" + dependencies: + "@typescript-eslint/types": 6.6.0 + eslint-visitor-keys: ^3.4.1 + checksum: 28171124c5c7d5d10c04c204530508f1488214f2af5eb7e64a5f1cc410c64f02676c04be087adcfd0deb5566f5bb7337b208afcb249719614634c38bcc3da897 + languageName: node + linkType: hard + "@vitest/expect@npm:0.28.5": version: 0.28.5 resolution: "@vitest/expect@npm:0.28.5" @@ -2213,6 +2677,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.9.0": + version: 8.10.0 + resolution: "acorn@npm:8.10.0" + bin: + acorn: bin/acorn + checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d + languageName: node + linkType: hard + "agent-base@npm:6, agent-base@npm:^6.0.2": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -2243,7 +2716,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.10.0, ajv@npm:^6.12.4": +"ajv@npm:^6.10.0, ajv@npm:^6.12.4, ajv@npm:~6.12.6": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -2255,6 +2728,18 @@ __metadata: languageName: node linkType: hard +"ajv@npm:^8.0.1": + version: 8.12.0 + resolution: "ajv@npm:8.12.0" + dependencies: + fast-deep-equal: ^3.1.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + uri-js: ^4.2.2 + checksum: 4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 + languageName: node + linkType: hard + "ansi-align@npm:^3.0.1": version: 3.0.1 resolution: "ansi-align@npm:3.0.1" @@ -2334,6 +2819,13 @@ __metadata: languageName: node linkType: hard +"are-docs-informative@npm:^0.0.2": + version: 0.0.2 + resolution: "are-docs-informative@npm:0.0.2" + checksum: 7a48ca90d66e29afebc4387d7029d86cfe97bad7e796c8e7de01309e02dcfc027250231c02d4ca208d2984170d09026390b946df5d3d02ac638ab35f74501c74 + languageName: node + linkType: hard + "are-we-there-yet@npm:^3.0.0": version: 3.0.1 resolution: "are-we-there-yet@npm:3.0.1" @@ -2384,6 +2876,25 @@ __metadata: languageName: node linkType: hard +"aria-query@npm:^5.1.3": + version: 5.3.0 + resolution: "aria-query@npm:5.3.0" + dependencies: + dequal: ^2.0.3 + checksum: 305bd73c76756117b59aba121d08f413c7ff5e80fa1b98e217a3443fcddb9a232ee790e24e432b59ae7625aebcf4c47cb01c2cac872994f0b426f5bdfcd96ba9 + languageName: node + linkType: hard + +"array-buffer-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "array-buffer-byte-length@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + is-array-buffer: ^3.0.1 + checksum: 044e101ce150f4804ad19c51d6c4d4cfa505c5b2577bd179256e4aa3f3f6a0a5e9874c78cd428ee566ac574c8a04d7ce21af9fe52e844abfdccb82b33035a7c3 + languageName: node + linkType: hard + "array-includes@npm:^3.1.4, array-includes@npm:^3.1.5, array-includes@npm:^3.1.6": version: 3.1.6 resolution: "array-includes@npm:3.1.6" @@ -2411,6 +2922,19 @@ __metadata: languageName: node linkType: hard +"array.prototype.findlastindex@npm:^1.2.2": + version: 1.2.3 + resolution: "array.prototype.findlastindex@npm:1.2.3" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + es-shim-unscopables: ^1.0.0 + get-intrinsic: ^1.2.1 + checksum: 31f35d7b370c84db56484618132041a9af401b338f51899c2e78ef7690fbba5909ee7ca3c59a7192085b328cc0c68c6fd1f6d1553db01a689a589ae510f3966e + languageName: node + linkType: hard + "array.prototype.flat@npm:^1.2.3, array.prototype.flat@npm:^1.2.5, array.prototype.flat@npm:^1.3.1": version: 1.3.1 resolution: "array.prototype.flat@npm:1.3.1" @@ -2435,6 +2959,33 @@ __metadata: languageName: node linkType: hard +"array.prototype.tosorted@npm:^1.1.1": + version: 1.1.1 + resolution: "array.prototype.tosorted@npm:1.1.1" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + es-shim-unscopables: ^1.0.0 + get-intrinsic: ^1.1.3 + checksum: 7923324a67e70a2fc0a6e40237405d92395e45ebd76f5cb89c2a5cf1e66b47aca6baacd0cd628ffd88830b90d47fff268071493d09c9ae123645613dac2c2ca3 + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.1": + version: 1.0.1 + resolution: "arraybuffer.prototype.slice@npm:1.0.1" + dependencies: + array-buffer-byte-length: ^1.0.0 + call-bind: ^1.0.2 + define-properties: ^1.2.0 + get-intrinsic: ^1.2.1 + is-array-buffer: ^3.0.2 + is-shared-array-buffer: ^1.0.2 + checksum: e3e9b2a3e988ebfeddce4c7e8f69df730c9e48cb04b0d40ff0874ce3d86b3d1339dd520ffde5e39c02610bc172ecfbd4bc93324b1cabd9554c44a56b131ce0ce + languageName: node + linkType: hard + "arrify@npm:^1.0.1": version: 1.0.1 resolution: "arrify@npm:1.0.1" @@ -2449,6 +3000,15 @@ __metadata: languageName: node linkType: hard +"ast-metadata-inferer@npm:^0.8.0": + version: 0.8.0 + resolution: "ast-metadata-inferer@npm:0.8.0" + dependencies: + "@mdn/browser-compat-data": ^5.2.34 + checksum: 8b9f38b5c7d33e2fad80174bb2613fad962c6ef728175281dd7957548608c95d958190b5269b74f6e24d037f6e650b45eb39440c1e206e3f9799aedde27fa54a + languageName: node + linkType: hard + "ast-types-flow@npm:^0.0.7": version: 0.0.7 resolution: "ast-types-flow@npm:0.0.7" @@ -2456,6 +3016,13 @@ __metadata: languageName: node linkType: hard +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 + languageName: node + linkType: hard + "astring@npm:^1.8.0": version: 1.8.4 resolution: "astring@npm:1.8.4" @@ -2552,10 +3119,12 @@ __metadata: languageName: node linkType: hard -"at-least-node@npm:^1.0.0": +"asynciterator.prototype@npm:^1.0.0": version: 1.0.0 - resolution: "at-least-node@npm:1.0.0" - checksum: 463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e + resolution: "asynciterator.prototype@npm:1.0.0" + dependencies: + has-symbols: ^1.0.3 + checksum: e8ebfd9493ac651cf9b4165e9d64030b3da1d17181bb1963627b59e240cdaf021d9b59d44b827dc1dde4e22387ec04c2d0f8720cf58a1c282e34e40cc12721b3 languageName: node linkType: hard @@ -2584,31 +3153,32 @@ __metadata: languageName: node linkType: hard -"aws-cdk-lib@npm:^2.65.0": - version: 2.65.0 - resolution: "aws-cdk-lib@npm:2.65.0" +"aws-cdk-lib@npm:^2.0.0, aws-cdk-lib@npm:^2.94.0": + version: 2.94.0 + resolution: "aws-cdk-lib@npm:2.94.0" dependencies: - "@aws-cdk/asset-awscli-v1": ^2.2.65 - "@aws-cdk/asset-kubectl-v20": ^2.1.1 - "@aws-cdk/asset-node-proxy-agent-v5": ^2.0.54 + "@aws-cdk/asset-awscli-v1": ^2.2.200 + "@aws-cdk/asset-kubectl-v20": ^2.1.2 + "@aws-cdk/asset-node-proxy-agent-v6": ^2.0.1 "@balena/dockerignore": ^1.0.2 case: 1.6.3 - fs-extra: ^9.1.0 + fs-extra: ^11.1.1 ignore: ^5.2.4 jsonschema: ^1.4.1 minimatch: ^3.1.2 punycode: ^2.3.0 - semver: ^7.3.8 + semver: ^7.5.4 + table: ^6.8.1 yaml: 1.10.2 peerDependencies: constructs: ^10.0.0 - checksum: 2a9b760e82e1c43875948d99620b8ed8d6cac9f9e6ba56c991aa6eff8acf2ad635207c1508b352273b0bee2633f51434e00719133c944caffae197690730ec17 + checksum: 5bd7e53de3416de1e02ad8896ca081f95ca481d18dfee0656f8e04fc0aa074415076337591fd783c16433eae950a079918774efbdb87142d80f29902eb25cf78 languageName: node linkType: hard -"aws-cdk@npm:^2.65.0": - version: 2.65.0 - resolution: "aws-cdk@npm:2.65.0" +"aws-cdk@npm:^2.94.0": + version: 2.94.0 + resolution: "aws-cdk@npm:2.94.0" dependencies: fsevents: 2.3.2 dependenciesMeta: @@ -2616,7 +3186,7 @@ __metadata: optional: true bin: cdk: bin/cdk - checksum: e17cb953fa68f9725c95b2c7e0d325c9187848c72d8508f9772cfc725ab44aa324bc448c1d6a1ed145459a7403c54093704963fc27b1f9ef66ea2ea4ca82dc06 + checksum: 978f7ab409f55ecd549baecb3d7f6b193a82319f8cc35d36a22935fc6a783b844d69585817429a2b21cf730f5cfabf1c31a0a6c5c62cec70c8f0d61a6a7c1f7a languageName: node linkType: hard @@ -2659,6 +3229,13 @@ __metadata: languageName: node linkType: hard +"axe-core@npm:^4.6.2": + version: 4.7.2 + resolution: "axe-core@npm:4.7.2" + checksum: 5d86fa0f45213b0e54cbb5d713ce885c4a8fe3a72b92dd915a47aa396d6fd149c4a87fec53aa978511f6d941402256cfeb26f2db35129e370f25a453c688655a + languageName: node + linkType: hard + "axobject-query@npm:^2.2.0": version: 2.2.0 resolution: "axobject-query@npm:2.2.0" @@ -2666,6 +3243,15 @@ __metadata: languageName: node linkType: hard +"axobject-query@npm:^3.1.1": + version: 3.2.1 + resolution: "axobject-query@npm:3.2.1" + dependencies: + dequal: ^2.0.3 + checksum: a94047e702b57c91680e6a952ec4a1aaa2cfd0d80ead76bc8c954202980d8c51968a6ea18b4d8010e8e2cf95676533d8022a8ebba9abc1dfe25686721df26fd2 + languageName: node + linkType: hard + "bail@npm:^2.0.0": version: 2.0.2 resolution: "bail@npm:2.0.2" @@ -2781,6 +3367,20 @@ __metadata: languageName: node linkType: hard +"browserslist@npm:^4.21.10": + version: 4.21.10 + resolution: "browserslist@npm:4.21.10" + dependencies: + caniuse-lite: ^1.0.30001517 + electron-to-chromium: ^1.4.477 + node-releases: ^2.0.13 + update-browserslist-db: ^1.0.11 + bin: + browserslist: cli.js + checksum: 1e27c0f111a35d1dd0e8fc2c61781b0daefabc2c9471b0b10537ce54843014bceb2a1ce4571af1a82b2bf1e6e6e05d38865916689a158f03bc2c7a4ec2577db8 + languageName: node + linkType: hard + "browserslist@npm:^4.21.3, browserslist@npm:^4.21.4": version: 4.21.5 resolution: "browserslist@npm:4.21.5" @@ -2830,6 +3430,15 @@ __metadata: languageName: node linkType: hard +"builtins@npm:^5.0.1": + version: 5.0.1 + resolution: "builtins@npm:5.0.1" + dependencies: + semver: ^7.0.0 + checksum: 66d204657fe36522822a95b288943ad11b58f5eaede235b11d8c4edaa28ce4800087d44a2681524c340494aadb120a0068011acabe99d30e8f11a7d826d83515 + languageName: node + linkType: hard + "busboy@npm:^1.6.0": version: 1.6.0 resolution: "busboy@npm:1.6.0" @@ -2928,6 +3537,13 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001517, caniuse-lite@npm:^1.0.30001524": + version: 1.0.30001527 + resolution: "caniuse-lite@npm:1.0.30001527" + checksum: 7ad99d78d1a30d494471c8a9ead3fc40a816ee61b16fef330bba5bdae5d7ebaa965becc8cd09c7aa6240125ce790a5213a40cd240ceaa211508744ed86b79783 + languageName: node + linkType: hard + "case@npm:1.6.3": version: 1.6.3 resolution: "case@npm:1.6.3" @@ -3060,6 +3676,13 @@ __metadata: languageName: node linkType: hard +"ci-info@npm:^3.8.0": + version: 3.8.0 + resolution: "ci-info@npm:3.8.0" + checksum: d0a4d3160497cae54294974a7246202244fff031b0a6ea20dd57b10ec510aa17399c41a1b0982142c105f3255aff2173e5c0dd7302ee1b2f28ba3debda375098 + languageName: node + linkType: hard + "classnames@npm:^2.3.2": version: 2.3.2 resolution: "classnames@npm:2.3.2" @@ -3234,6 +3857,13 @@ __metadata: languageName: node linkType: hard +"comment-parser@npm:1.4.0, comment-parser@npm:^1.1.2": + version: 1.4.0 + resolution: "comment-parser@npm:1.4.0" + checksum: e086da3b14af9455177f1ab801bc54de9139a77fcef55dbfb751ae68d687ac83b0effb83d113ccf8cd217d9d93ce2b472002953cac342092a3fadfb9f5cd8e38 + languageName: node + linkType: hard + "comment-parser@npm:^1.3.1": version: 1.3.1 resolution: "comment-parser@npm:1.3.1" @@ -3309,6 +3939,15 @@ __metadata: languageName: node linkType: hard +"create-eslint-index@npm:^1.0.0": + version: 1.0.0 + resolution: "create-eslint-index@npm:1.0.0" + dependencies: + lodash.get: ^4.3.0 + checksum: 34c859910c6873381e795f22352522c23755856ce444e95eec5bf09b640cab50ff8bbc241c61fc0362f42bb713a85ef7aeaa49d0d73d0560bf43f0a0c20b54d6 + languageName: node + linkType: hard + "create-require@npm:^1.1.0": version: 1.1.1 resolution: "create-require@npm:1.1.1" @@ -3444,7 +4083,7 @@ __metadata: languageName: node linkType: hard -"damerau-levenshtein@npm:^1.0.7": +"damerau-levenshtein@npm:^1.0.7, damerau-levenshtein@npm:^1.0.8": version: 1.0.8 resolution: "damerau-levenshtein@npm:1.0.8" checksum: d240b7757544460ae0586a341a53110ab0a61126570ef2d8c731e3eab3f0cb6e488e2609e6a69b46727635de49be20b071688698744417ff1b6c1d7ccd03e0de @@ -3570,6 +4209,16 @@ __metadata: languageName: node linkType: hard +"define-properties@npm:^1.2.0": + version: 1.2.0 + resolution: "define-properties@npm:1.2.0" + dependencies: + has-property-descriptors: ^1.0.0 + object-keys: ^1.1.1 + checksum: e60aee6a19b102df4e2b1f301816804e81ab48bb91f00d0d935f269bf4b3f79c88b39e4f89eaa132890d23267335fd1140dfcd8d5ccd61031a0a2c41a54e33a6 + languageName: node + linkType: hard + "defined@npm:^1.0.0": version: 1.0.1 resolution: "defined@npm:1.0.1" @@ -3591,7 +4240,7 @@ __metadata: languageName: node linkType: hard -"dequal@npm:^2.0.0": +"dequal@npm:^2.0.0, dequal@npm:^2.0.3": version: 2.0.3 resolution: "dequal@npm:2.0.3" checksum: 8679b850e1a3d0ebbc46ee780d5df7b478c23f335887464023a631d1b9af051ad4a6595a44220f9ff8ff95a8ddccf019b5ad778a976fd7bbf77383d36f412f90 @@ -3769,6 +4418,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.4.477": + version: 1.4.508 + resolution: "electron-to-chromium@npm:1.4.508" + checksum: 4475eb18f5805d43f84d9542364045a39b183a14cd9f4626e0951ea61d0fa4f84a5ed579c2c32189f9af4a27a31041d09fed78f60930ac36b3baa08547dd3aa6 + languageName: node + linkType: hard + "emmet@npm:^2.3.0": version: 2.3.6 resolution: "emmet@npm:2.3.6" @@ -3802,13 +4458,13 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.10.0": - version: 5.12.0 - resolution: "enhanced-resolve@npm:5.12.0" +"enhanced-resolve@npm:^5.12.0": + version: 5.15.0 + resolution: "enhanced-resolve@npm:5.15.0" dependencies: graceful-fs: ^4.2.4 tapable: ^2.2.0 - checksum: bf3f787facaf4ce3439bef59d148646344e372bef5557f0d37ea8aa02c51f50a925cd1f07b8d338f18992c29f544ec235a8c64bcdb56030196c48832a5494174 + checksum: fbd8cdc9263be71cc737aa8a7d6c57b43d6aa38f6cc75dde6fcd3598a130cc465f979d2f4d01bb3bf475acb43817749c79f8eef9be048683602ca91ab52e4f11 languageName: node linkType: hard @@ -3892,6 +4548,82 @@ __metadata: languageName: node linkType: hard +"es-abstract@npm:^1.22.1": + version: 1.22.1 + resolution: "es-abstract@npm:1.22.1" + dependencies: + array-buffer-byte-length: ^1.0.0 + arraybuffer.prototype.slice: ^1.0.1 + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.2 + es-set-tostringtag: ^2.0.1 + es-to-primitive: ^1.2.1 + function.prototype.name: ^1.1.5 + get-intrinsic: ^1.2.1 + get-symbol-description: ^1.0.0 + globalthis: ^1.0.3 + gopd: ^1.0.1 + has: ^1.0.3 + has-property-descriptors: ^1.0.0 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + internal-slot: ^1.0.5 + is-array-buffer: ^3.0.2 + is-callable: ^1.2.7 + is-negative-zero: ^2.0.2 + is-regex: ^1.1.4 + is-shared-array-buffer: ^1.0.2 + is-string: ^1.0.7 + is-typed-array: ^1.1.10 + is-weakref: ^1.0.2 + object-inspect: ^1.12.3 + object-keys: ^1.1.1 + object.assign: ^4.1.4 + regexp.prototype.flags: ^1.5.0 + safe-array-concat: ^1.0.0 + safe-regex-test: ^1.0.0 + string.prototype.trim: ^1.2.7 + string.prototype.trimend: ^1.0.6 + string.prototype.trimstart: ^1.0.6 + typed-array-buffer: ^1.0.0 + typed-array-byte-length: ^1.0.0 + typed-array-byte-offset: ^1.0.0 + typed-array-length: ^1.0.4 + unbox-primitive: ^1.0.2 + which-typed-array: ^1.1.10 + checksum: 614e2c1c3717cb8d30b6128ef12ea110e06fd7d75ad77091ca1c5dbfb00da130e62e4bbbbbdda190eada098a22b27fe0f99ae5a1171dac2c8663b1e8be8a3a9b + languageName: node + linkType: hard + +"es-html-parser@npm:^0.0.9": + version: 0.0.9 + resolution: "es-html-parser@npm:0.0.9" + checksum: deff13a3712a4f02cbf5a3acf597797606d29025fad070758b3575514c5e58ad0588aa1befbef9c6202967e6c0f10f366cccdcc17b66f6044afb87d9f87ed7d7 + languageName: node + linkType: hard + +"es-iterator-helpers@npm:^1.0.12": + version: 1.0.14 + resolution: "es-iterator-helpers@npm:1.0.14" + dependencies: + asynciterator.prototype: ^1.0.0 + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + es-set-tostringtag: ^2.0.1 + function-bind: ^1.1.1 + get-intrinsic: ^1.2.1 + globalthis: ^1.0.3 + has-property-descriptors: ^1.0.0 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + internal-slot: ^1.0.5 + iterator.prototype: ^1.1.0 + safe-array-concat: ^1.0.0 + checksum: 484ca398389d5e259855e2d848573233985a7e7a4126c5de62c8a554174495aea47320ae1d2b55b757ece62ac1cb8455532aa61fd123fe4e01d0567eb2d7adfa + languageName: node + linkType: hard + "es-module-lexer@npm:^0.10.5": version: 0.10.5 resolution: "es-module-lexer@npm:0.10.5" @@ -4119,6 +4851,16 @@ __metadata: languageName: node linkType: hard +"eslint-ast-utils@npm:^1.0.0": + version: 1.1.0 + resolution: "eslint-ast-utils@npm:1.1.0" + dependencies: + lodash.get: ^4.4.2 + lodash.zip: ^4.2.0 + checksum: f72d6875595e665e0707980f3ce36a2e812bf65989dc192c19adfce9d4ca3455c78fcb77f8ffa17a119f24916b2f0a7bf19e02dd2ff0747b9cb83dbcbecf164d + languageName: node + linkType: hard + "eslint-config-get-off-my-lawn@npm:^7.2.0": version: 7.2.0 resolution: "eslint-config-get-off-my-lawn@npm:7.2.0" @@ -4168,6 +4910,20 @@ __metadata: languageName: node linkType: hard +"eslint-etc@npm:^5.1.0": + version: 5.2.1 + resolution: "eslint-etc@npm:5.2.1" + dependencies: + "@typescript-eslint/experimental-utils": ^5.0.0 + tsutils: ^3.17.1 + tsutils-etc: ^1.4.1 + peerDependencies: + eslint: ^8.0.0 + typescript: ">=4.0.0" + checksum: 7b2ecef7f99b3a6bcbb8ed875061ca2876496e73fe7e51757b601631ab8cd958be91ba2dca7242f4659647b952429ce52c65ba0e708eb976f8b387cb7523dc77 + languageName: node + linkType: hard + "eslint-import-resolver-node@npm:^0.3.6, eslint-import-resolver-node@npm:^0.3.7": version: 0.3.7 resolution: "eslint-import-resolver-node@npm:0.3.7" @@ -4195,21 +4951,21 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-typescript@npm:^3.5.3": - version: 3.5.3 - resolution: "eslint-import-resolver-typescript@npm:3.5.3" +"eslint-import-resolver-typescript@npm:^3.5.5, eslint-import-resolver-typescript@npm:^3.6.0": + version: 3.6.0 + resolution: "eslint-import-resolver-typescript@npm:3.6.0" dependencies: debug: ^4.3.4 - enhanced-resolve: ^5.10.0 - get-tsconfig: ^4.2.0 - globby: ^13.1.2 - is-core-module: ^2.10.0 + enhanced-resolve: ^5.12.0 + eslint-module-utils: ^2.7.4 + fast-glob: ^3.3.1 + get-tsconfig: ^4.5.0 + is-core-module: ^2.11.0 is-glob: ^4.0.3 - synckit: ^0.8.4 peerDependencies: eslint: "*" eslint-plugin-import: "*" - checksum: 63b5f28bec5a29b1d3be33b79795441f7b0da54479e5c99a115877d9b70b2b7464c19a928b4ae7674a937b9ee8e7d4b1d30b7f5e6325c4c3aaa8c607bb175258 + checksum: 57b1b3859149f847e0d4174ff979cf35362d60c951df047f01b96f4c3794a7ea0d4e1ec85be25e610d3706902c3acfb964a66b825c1a55e3ce3a124b9a7a13bd languageName: node linkType: hard @@ -4225,6 +4981,61 @@ __metadata: languageName: node linkType: hard +"eslint-module-utils@npm:^2.8.0": + version: 2.8.0 + resolution: "eslint-module-utils@npm:2.8.0" + dependencies: + debug: ^3.2.7 + peerDependenciesMeta: + eslint: + optional: true + checksum: 74c6dfea7641ebcfe174be61168541a11a14aa8d72e515f5f09af55cd0d0862686104b0524aa4b8e0ce66418a44aa38a94d2588743db5fd07a6b49ffd16921d2 + languageName: node + linkType: hard + +"eslint-plugin-compat@npm:^4.1.4": + version: 4.2.0 + resolution: "eslint-plugin-compat@npm:4.2.0" + dependencies: + "@mdn/browser-compat-data": ^5.3.13 + ast-metadata-inferer: ^0.8.0 + browserslist: ^4.21.10 + caniuse-lite: ^1.0.30001524 + find-up: ^5.0.0 + lodash.memoize: ^4.1.2 + semver: ^7.5.4 + peerDependencies: + eslint: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 68c1f7f6cd1e6fa663568ba1d5c0cef9e42b1e3ec4e9b63a98a2bce18f39711a2313c47ba576a6583e7d92edc7beddc83a583dac8c12ac80c642741fee37e67d + languageName: node + linkType: hard + +"eslint-plugin-deprecation@npm:^1.5.0": + version: 1.5.0 + resolution: "eslint-plugin-deprecation@npm:1.5.0" + dependencies: + "@typescript-eslint/utils": ^5.57.0 + tslib: ^2.3.1 + tsutils: ^3.21.0 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: ^3.7.5 || ^4.0.0 || ^5.0.0 + checksum: ec0ff3df1dbbbb85d14c8f6656bb126377280db58789c2ba3c4500250b291559c651a0fb2ac29aa977408fef3a919ad41e706100b55672ceb6c1ad09550e7396 + languageName: node + linkType: hard + +"eslint-plugin-es-x@npm:^7.1.0": + version: 7.2.0 + resolution: "eslint-plugin-es-x@npm:7.2.0" + dependencies: + "@eslint-community/eslint-utils": ^4.1.2 + "@eslint-community/regexpp": ^4.6.0 + peerDependencies: + eslint: ">=8" + checksum: eece76ef6bcfce463659338b487e516e962ddf3ae34a8a65240ebd318fc991cabfe3573b1c3af5226474193b9c83f030c7900a8e5ffdbe731a3928ca8f2799c9 + languageName: node + linkType: hard + "eslint-plugin-es@npm:^3.0.0": version: 3.0.1 resolution: "eslint-plugin-es@npm:3.0.1" @@ -4249,6 +5060,37 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-etc@npm:^2.0.3": + version: 2.0.3 + resolution: "eslint-plugin-etc@npm:2.0.3" + dependencies: + "@phenomnomnominal/tsquery": ^5.0.0 + "@typescript-eslint/experimental-utils": ^5.0.0 + eslint-etc: ^5.1.0 + requireindex: ~1.2.0 + tslib: ^2.0.0 + tsutils: ^3.0.0 + peerDependencies: + eslint: ^8.0.0 + typescript: ">=4.0.0" + checksum: f6655d3d8f8f90646ce6a134888525bed14ccb69a7b734933ed882ea868189c0405dac70740c0f28cf72a37decfe41aa1d09c0898e68c90fbaa49279b8ea1bed + languageName: node + linkType: hard + +"eslint-plugin-fp@npm:^2.3.0": + version: 2.3.0 + resolution: "eslint-plugin-fp@npm:2.3.0" + dependencies: + create-eslint-index: ^1.0.0 + eslint-ast-utils: ^1.0.0 + lodash: ^4.13.1 + req-all: ^0.1.0 + peerDependencies: + eslint: ">=3" + checksum: 694a4c423bddee08d4c7ae131d5bd2cdded4771b34d3d467c8f8b1daf4644662913190c1d8798923e260a2ed203e070ef884383749c8cc6043bafacfce9e15b1 + languageName: node + linkType: hard + "eslint-plugin-get-off-my-lawn@npm:3.0.0": version: 3.0.0 resolution: "eslint-plugin-get-off-my-lawn@npm:3.0.0" @@ -4309,6 +5151,33 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-import@npm:^2.28.1": + version: 2.28.1 + resolution: "eslint-plugin-import@npm:2.28.1" + dependencies: + array-includes: ^3.1.6 + array.prototype.findlastindex: ^1.2.2 + array.prototype.flat: ^1.3.1 + array.prototype.flatmap: ^1.3.1 + debug: ^3.2.7 + doctrine: ^2.1.0 + eslint-import-resolver-node: ^0.3.7 + eslint-module-utils: ^2.8.0 + has: ^1.0.3 + is-core-module: ^2.13.0 + is-glob: ^4.0.3 + minimatch: ^3.1.2 + object.fromentries: ^2.0.6 + object.groupby: ^1.0.0 + object.values: ^1.1.6 + semver: ^6.3.1 + tsconfig-paths: ^3.14.2 + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + checksum: e8ae6dd8f06d8adf685f9c1cfd46ac9e053e344a05c4090767e83b63a85c8421ada389807a39e73c643b9bff156715c122e89778169110ed68d6428e12607edf + languageName: node + linkType: hard + "eslint-plugin-jest-formatting@npm:3.1.0": version: 3.1.0 resolution: "eslint-plugin-jest-formatting@npm:3.1.0" @@ -4335,6 +5204,25 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-jsdoc@npm:^46.4.5": + version: 46.5.1 + resolution: "eslint-plugin-jsdoc@npm:46.5.1" + dependencies: + "@es-joy/jsdoccomment": ~0.40.1 + are-docs-informative: ^0.0.2 + comment-parser: 1.4.0 + debug: ^4.3.4 + escape-string-regexp: ^4.0.0 + esquery: ^1.5.0 + is-builtin-module: ^3.2.1 + semver: ^7.5.4 + spdx-expression-parse: ^3.0.1 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: 8f6b1e60ded7bc27da4ae9ef541315a14d1f69476b5c03b53ebe323a4d2c4b61fdaf0a0ffcba2e4964247ee5371768fc612d83f2c9456c404b31e8cad44123cd + languageName: node + linkType: hard + "eslint-plugin-jsonc@npm:2.1.0": version: 2.1.0 resolution: "eslint-plugin-jsonc@npm:2.1.0" @@ -4370,6 +5258,50 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-jsx-a11y@npm:^6.7.1": + version: 6.7.1 + resolution: "eslint-plugin-jsx-a11y@npm:6.7.1" + dependencies: + "@babel/runtime": ^7.20.7 + aria-query: ^5.1.3 + array-includes: ^3.1.6 + array.prototype.flatmap: ^1.3.1 + ast-types-flow: ^0.0.7 + axe-core: ^4.6.2 + axobject-query: ^3.1.1 + damerau-levenshtein: ^1.0.8 + emoji-regex: ^9.2.2 + has: ^1.0.3 + jsx-ast-utils: ^3.3.3 + language-tags: =1.0.5 + minimatch: ^3.1.2 + object.entries: ^1.1.6 + object.fromentries: ^2.0.6 + semver: ^6.3.0 + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + checksum: f166dd5fe7257c7b891c6692e6a3ede6f237a14043ae3d97581daf318fc5833ddc6b4871aa34ab7656187430170500f6d806895747ea17ecdf8231a666c3c2fd + languageName: node + linkType: hard + +"eslint-plugin-n@npm:^16.0.1": + version: 16.0.2 + resolution: "eslint-plugin-n@npm:16.0.2" + dependencies: + "@eslint-community/eslint-utils": ^4.4.0 + builtins: ^5.0.1 + eslint-plugin-es-x: ^7.1.0 + ignore: ^5.2.4 + is-core-module: ^2.12.1 + minimatch: ^3.1.2 + resolve: ^1.22.2 + semver: ^7.5.3 + peerDependencies: + eslint: ">=7.0.0" + checksum: 44cffe32a3a3cd2a706e82f45fedf79e0af7cae20e7c5f3185707233d941de1058373a27b90e86a8f0e5f9830b02c90116deaa05f139a67556954de72bc4935d + languageName: node + linkType: hard + "eslint-plugin-node@npm:11.1.0": version: 11.1.0 resolution: "eslint-plugin-node@npm:11.1.0" @@ -4395,6 +5327,31 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-perfectionist@npm:^1.5.1": + version: 1.5.1 + resolution: "eslint-plugin-perfectionist@npm:1.5.1" + dependencies: + "@typescript-eslint/types": ^5.62.0 + "@typescript-eslint/utils": ^5.62.0 + is-core-module: ^2.12.1 + json5: ^2.2.3 + minimatch: ^9.0.3 + natural-compare-lite: ^1.4.0 + peerDependencies: + eslint: ">=8.0.0" + checksum: 4b2785af9009c1e900d8680c44e155c37036d8abb4e76a5482ac4039390b02293139c4653f0551c006f74d7de39ee4d76f19ccb48488caffa812ce0c5a2e979a + languageName: node + linkType: hard + +"eslint-plugin-promise@npm:^6.1.1": + version: 6.1.1 + resolution: "eslint-plugin-promise@npm:6.1.1" + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: 46b9a4f79dae5539987922afc27cc17cbccdecf4f0ba19c0ccbf911b0e31853e9f39d9959eefb9637461b52772afa1a482f1f87ff16c1ba38bdb6fcf21897e9a + languageName: node + linkType: hard + "eslint-plugin-react-hooks@npm:4.3.0": version: 4.3.0 resolution: "eslint-plugin-react-hooks@npm:4.3.0" @@ -4404,6 +5361,15 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-react-hooks@npm:^4.6.0": + version: 4.6.0 + resolution: "eslint-plugin-react-hooks@npm:4.6.0" + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + checksum: 23001801f14c1d16bf0a837ca7970d9dd94e7b560384b41db378b49b6e32dc43d6e2790de1bd737a652a86f81a08d6a91f402525061b47719328f586a57e86c3 + languageName: node + linkType: hard + "eslint-plugin-react-native-globals@npm:^0.1.1": version: 0.1.2 resolution: "eslint-plugin-react-native-globals@npm:0.1.2" @@ -4411,7 +5377,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react-native@npm:4.0.0": +"eslint-plugin-react-native@npm:4.0.0, eslint-plugin-react-native@npm:^4.0.0": version: 4.0.0 resolution: "eslint-plugin-react-native@npm:4.0.0" dependencies: @@ -4423,6 +5389,24 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-react-perf@npm:^3.3.1": + version: 3.3.1 + resolution: "eslint-plugin-react-perf@npm:3.3.1" + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 2609624b84312fda7adcdce0a93be02815bbcbb0c591f21914e081da7118654d735bd6b8d88f33b9fd3dab97e141e947860e441a95746bb267cb32417a5907f8 + languageName: node + linkType: hard + +"eslint-plugin-react-refresh@npm:^0.4.3": + version: 0.4.3 + resolution: "eslint-plugin-react-refresh@npm:0.4.3" + peerDependencies: + eslint: ">=7" + checksum: 0332c950bb46c3058fd06acb1dbdc3ea0af05238645f4c0f575e0e367440dc56afb928f855833d321b9e8109e08c63d5f476cc55d507f883a80c289bfcd509cb + languageName: node + linkType: hard + "eslint-plugin-react@npm:7.28.0": version: 7.28.0 resolution: "eslint-plugin-react@npm:7.28.0" @@ -4447,6 +5431,50 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-react@npm:^7.33.0": + version: 7.33.2 + resolution: "eslint-plugin-react@npm:7.33.2" + dependencies: + array-includes: ^3.1.6 + array.prototype.flatmap: ^1.3.1 + array.prototype.tosorted: ^1.1.1 + doctrine: ^2.1.0 + es-iterator-helpers: ^1.0.12 + estraverse: ^5.3.0 + jsx-ast-utils: ^2.4.1 || ^3.0.0 + minimatch: ^3.1.2 + object.entries: ^1.1.6 + object.fromentries: ^2.0.6 + object.hasown: ^1.1.2 + object.values: ^1.1.6 + prop-types: ^15.8.1 + resolve: ^2.0.0-next.4 + semver: ^6.3.1 + string.prototype.matchall: ^4.0.8 + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + checksum: b4c3d76390b0ae6b6f9fed78170604cc2c04b48e6778a637db339e8e3911ec9ef22510b0ae77c429698151d0f1b245f282177f384105b6830e7b29b9c9b26610 + languageName: node + linkType: hard + +"eslint-plugin-regexp@npm:^1.15.0": + version: 1.15.0 + resolution: "eslint-plugin-regexp@npm:1.15.0" + dependencies: + "@eslint-community/eslint-utils": ^4.2.0 + "@eslint-community/regexpp": ^4.4.0 + comment-parser: ^1.1.2 + grapheme-splitter: ^1.0.4 + jsdoctypeparser: ^9.0.0 + refa: ^0.11.0 + regexp-ast-analysis: ^0.6.0 + scslre: ^0.2.0 + peerDependencies: + eslint: ">=6.0.0" + checksum: 6f5c6588b4463e11999d2fc70c9348e7cf250867a4889bdfcdef10d867cc317ba159b2053f833d43cf1141bc9b4956504647a8e251a84e4d010ad72cecf4d68e + languageName: node + linkType: hard + "eslint-plugin-security@npm:1.4.0": version: 1.4.0 resolution: "eslint-plugin-security@npm:1.4.0" @@ -4456,6 +5484,62 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-security@npm:^1.7.1": + version: 1.7.1 + resolution: "eslint-plugin-security@npm:1.7.1" + dependencies: + safe-regex: ^2.1.1 + checksum: 3a650e2482e108bb4b9c3b9ac64adefcf1dfda069cd43f89a7d3b84822da2417c9d1b764ec5e1acf4c193b48edc630c7ef2d0a5279a478a8672f9030bc78a8c0 + languageName: node + linkType: hard + +"eslint-plugin-sonarjs@npm:^0.19.0": + version: 0.19.0 + resolution: "eslint-plugin-sonarjs@npm:0.19.0" + peerDependencies: + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 893640583f62ce55584c6ddd481aa0fd6fa15fe0fffc32ac92b17f3fadde8eaf32414183bb80b612455212e9bb14400236398af6279ca04e8992f008e011926c + languageName: node + linkType: hard + +"eslint-plugin-ssr-friendly@npm:^1.2.0": + version: 1.2.0 + resolution: "eslint-plugin-ssr-friendly@npm:1.2.0" + dependencies: + globals: ^13.8.0 + peerDependencies: + eslint: ">=0.8.0" + checksum: eba150efc2648c5b35e9a86761b381479ec960331287c8a8e85f37bf7e8bf93546bddccefffbb9aa0cc4f6d8b6877d6819b924e2d56538e72af9f3a266cc45ae + languageName: node + linkType: hard + +"eslint-plugin-total-functions@npm:^7.0.7": + version: 7.1.0 + resolution: "eslint-plugin-total-functions@npm:7.1.0" + dependencies: + "@typescript-eslint/eslint-plugin": ^5.62.0 + "@typescript-eslint/parser": ^5.62.0 + "@typescript-eslint/type-utils": ^5.62.0 + "@typescript-eslint/utils": ^5.62.0 + is-immutable-type: ^1.2.9 + tsutils: ^3.21.0 + peerDependencies: + eslint: ^8.48.0 + typescript: ^5.2.2 + checksum: 4c37e9284f07ae4bfa295bb83ce09c87f2bcfc0c79e45752b646a6b331d548fa4f0173dd2cb8bf2047c20195abfd447b4e472164d95e36fdcab5e30b30dd4f67 + languageName: node + linkType: hard + +"eslint-plugin-tsdoc@npm:^0.2.17": + version: 0.2.17 + resolution: "eslint-plugin-tsdoc@npm:0.2.17" + dependencies: + "@microsoft/tsdoc": 0.14.2 + "@microsoft/tsdoc-config": 0.16.2 + checksum: d143a5f1c5967812d75f246ae2776cb030f6e7966b981406c9df9352a9ab02b035f294cedb30054eac2c4a217ee4ab2ed9fb76292bdccda9438e54d2d7b0146e + languageName: node + linkType: hard + "eslint-plugin-unicorn@npm:40.1.0": version: 40.1.0 resolution: "eslint-plugin-unicorn@npm:40.1.0" @@ -4480,6 +5564,57 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-unicorn@npm:^48.0.1": + version: 48.0.1 + resolution: "eslint-plugin-unicorn@npm:48.0.1" + dependencies: + "@babel/helper-validator-identifier": ^7.22.5 + "@eslint-community/eslint-utils": ^4.4.0 + ci-info: ^3.8.0 + clean-regexp: ^1.0.0 + esquery: ^1.5.0 + indent-string: ^4.0.0 + is-builtin-module: ^3.2.1 + jsesc: ^3.0.2 + lodash: ^4.17.21 + pluralize: ^8.0.0 + read-pkg-up: ^7.0.1 + regexp-tree: ^0.1.27 + regjsparser: ^0.10.0 + semver: ^7.5.4 + strip-indent: ^3.0.0 + peerDependencies: + eslint: ">=8.44.0" + checksum: e63112cbaa3a1347cbb427160d7b3c6a1f8cc8ef512075a0ab285c64761772356f4eb5f82c9fb1a8cde63d8794f8aa819eda02fa0a7c44bc9955c5113f87be78 + languageName: node + linkType: hard + +"eslint-plugin-validate-jsx-nesting@npm:^0.1.1": + version: 0.1.1 + resolution: "eslint-plugin-validate-jsx-nesting@npm:0.1.1" + dependencies: + validate-html-nesting: ^1.2.2 + peerDependencies: + eslint: ">=4.0.0" + checksum: 6468236401cb57db5cb04b1b79b6da865f68a3f7cef2d2f2143b17f7869c682fbd1d93efdb0ab56aa826765399bb9dee25aee8c8b3be3d52dee6c3d965eadade + languageName: node + linkType: hard + +"eslint-plugin-vitest@npm:^0.2.8": + version: 0.2.8 + resolution: "eslint-plugin-vitest@npm:0.2.8" + dependencies: + "@typescript-eslint/utils": ^6.2.0 + peerDependencies: + eslint: ">=8.0.0" + vitest: "*" + peerDependenciesMeta: + vite: + optional: true + checksum: bf09a8da8b564277b7bfcac37d24b3db16b35c61293bccfeb45651a3810c919da74e29e5a264eaf611af35c91b971dbbf28f6fba34166cf6a263d40ad91a48a6 + languageName: node + linkType: hard + "eslint-scope@npm:^5.1.1": version: 5.1.1 resolution: "eslint-scope@npm:5.1.1" @@ -4500,6 +5635,16 @@ __metadata: languageName: node linkType: hard +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^5.2.0 + checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e + languageName: node + linkType: hard + "eslint-utils@npm:^2.0.0": version: 2.1.0 resolution: "eslint-utils@npm:2.1.0" @@ -4541,52 +5686,106 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8.34.0": - version: 8.34.0 - resolution: "eslint@npm:8.34.0" +"eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 + languageName: node + linkType: hard + +"eslint@npm:^8.34.0": + version: 8.34.0 + resolution: "eslint@npm:8.34.0" + dependencies: + "@eslint/eslintrc": ^1.4.1 + "@humanwhocodes/config-array": ^0.11.8 + "@humanwhocodes/module-importer": ^1.0.1 + "@nodelib/fs.walk": ^1.2.8 + ajv: ^6.10.0 + chalk: ^4.0.0 + cross-spawn: ^7.0.2 + debug: ^4.3.2 + doctrine: ^3.0.0 + escape-string-regexp: ^4.0.0 + eslint-scope: ^7.1.1 + eslint-utils: ^3.0.0 + eslint-visitor-keys: ^3.3.0 + espree: ^9.4.0 + esquery: ^1.4.0 + esutils: ^2.0.2 + fast-deep-equal: ^3.1.3 + file-entry-cache: ^6.0.1 + find-up: ^5.0.0 + glob-parent: ^6.0.2 + globals: ^13.19.0 + grapheme-splitter: ^1.0.4 + ignore: ^5.2.0 + import-fresh: ^3.0.0 + imurmurhash: ^0.1.4 + is-glob: ^4.0.0 + is-path-inside: ^3.0.3 + js-sdsl: ^4.1.4 + js-yaml: ^4.1.0 + json-stable-stringify-without-jsonify: ^1.0.1 + levn: ^0.4.1 + lodash.merge: ^4.6.2 + minimatch: ^3.1.2 + natural-compare: ^1.4.0 + optionator: ^0.9.1 + regexpp: ^3.2.0 + strip-ansi: ^6.0.1 + strip-json-comments: ^3.1.0 + text-table: ^0.2.0 + bin: + eslint: bin/eslint.js + checksum: 4e13e9eb05ac2248efbb6acae0b2325091235d5c47ba91a4775c7d6760778cbcd358a773ebd42f4629d2ad89e27c02f5d66eb1f737d75d9f5fc411454f83b2e5 + languageName: node + linkType: hard + +"eslint@npm:^8.48.0": + version: 8.48.0 + resolution: "eslint@npm:8.48.0" dependencies: - "@eslint/eslintrc": ^1.4.1 - "@humanwhocodes/config-array": ^0.11.8 + "@eslint-community/eslint-utils": ^4.2.0 + "@eslint-community/regexpp": ^4.6.1 + "@eslint/eslintrc": ^2.1.2 + "@eslint/js": 8.48.0 + "@humanwhocodes/config-array": ^0.11.10 "@humanwhocodes/module-importer": ^1.0.1 "@nodelib/fs.walk": ^1.2.8 - ajv: ^6.10.0 + ajv: ^6.12.4 chalk: ^4.0.0 cross-spawn: ^7.0.2 debug: ^4.3.2 doctrine: ^3.0.0 escape-string-regexp: ^4.0.0 - eslint-scope: ^7.1.1 - eslint-utils: ^3.0.0 - eslint-visitor-keys: ^3.3.0 - espree: ^9.4.0 - esquery: ^1.4.0 + eslint-scope: ^7.2.2 + eslint-visitor-keys: ^3.4.3 + espree: ^9.6.1 + esquery: ^1.4.2 esutils: ^2.0.2 fast-deep-equal: ^3.1.3 file-entry-cache: ^6.0.1 find-up: ^5.0.0 glob-parent: ^6.0.2 globals: ^13.19.0 - grapheme-splitter: ^1.0.4 + graphemer: ^1.4.0 ignore: ^5.2.0 - import-fresh: ^3.0.0 imurmurhash: ^0.1.4 is-glob: ^4.0.0 is-path-inside: ^3.0.3 - js-sdsl: ^4.1.4 js-yaml: ^4.1.0 json-stable-stringify-without-jsonify: ^1.0.1 levn: ^0.4.1 lodash.merge: ^4.6.2 minimatch: ^3.1.2 natural-compare: ^1.4.0 - optionator: ^0.9.1 - regexpp: ^3.2.0 + optionator: ^0.9.3 strip-ansi: ^6.0.1 - strip-json-comments: ^3.1.0 text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: 4e13e9eb05ac2248efbb6acae0b2325091235d5c47ba91a4775c7d6760778cbcd358a773ebd42f4629d2ad89e27c02f5d66eb1f737d75d9f5fc411454f83b2e5 + checksum: f20b359a4f8123fec5c033577368cc020d42978b1b45303974acd8da7a27063168ee3fe297ab5b35327162f6a93154063e3ce6577102f70f9809aff793db9bd0 languageName: node linkType: hard @@ -4601,6 +5800,17 @@ __metadata: languageName: node linkType: hard +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: ^8.9.0 + acorn-jsx: ^5.3.2 + eslint-visitor-keys: ^3.4.1 + checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 + languageName: node + linkType: hard + "esprima@npm:^4.0.0": version: 4.0.1 resolution: "esprima@npm:4.0.1" @@ -4620,6 +5830,15 @@ __metadata: languageName: node linkType: hard +"esquery@npm:^1.4.2, esquery@npm:^1.5.0": + version: 1.5.0 + resolution: "esquery@npm:1.5.0" + dependencies: + estraverse: ^5.1.0 + checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 + languageName: node + linkType: hard + "esrecurse@npm:^4.3.0": version: 4.3.0 resolution: "esrecurse@npm:4.3.0" @@ -4799,6 +6018,19 @@ __metadata: languageName: node linkType: hard +"fast-glob@npm:^3.3.1": + version: 3.3.1 + resolution: "fast-glob@npm:3.3.1" + dependencies: + "@nodelib/fs.stat": ^2.0.2 + "@nodelib/fs.walk": ^1.2.3 + glob-parent: ^5.1.2 + merge2: ^1.3.0 + micromatch: ^4.0.4 + checksum: b6f3add6403e02cf3a798bfbb1183d0f6da2afd368f27456010c0bc1f9640aea308243d4cb2c0ab142f618276e65ecb8be1661d7c62a7b4e5ba774b9ce5432e5 + languageName: node + linkType: hard + "fast-json-stable-stringify@npm:^2.0.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" @@ -4956,6 +6188,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^11.1.1": + version: 11.1.1 + resolution: "fs-extra@npm:11.1.1" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: fb883c68245b2d777fbc1f2082c9efb084eaa2bbf9fddaa366130d196c03608eebef7fb490541276429ee1ca99f317e2d73e96f5ca0999eefedf5a624ae1edfd + languageName: node + linkType: hard + "fs-extra@npm:^7.0.1": version: 7.0.1 resolution: "fs-extra@npm:7.0.1" @@ -4978,18 +6221,6 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^9.1.0": - version: 9.1.0 - resolution: "fs-extra@npm:9.1.0" - dependencies: - at-least-node: ^1.0.0 - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: ba71ba32e0faa74ab931b7a0031d1523c66a73e225de7426e275e238e312d07313d2da2d33e34a52aa406c8763ade5712eb3ec9ba4d9edce652bcacdc29e6b20 - languageName: node - linkType: hard - "fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -5051,7 +6282,7 @@ __metadata: languageName: node linkType: hard -"functions-have-names@npm:^1.2.2": +"functions-have-names@npm:^1.2.2, functions-have-names@npm:^1.2.3": version: 1.2.3 resolution: "functions-have-names@npm:1.2.3" checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 @@ -5106,6 +6337,25 @@ __metadata: languageName: node linkType: hard +"get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1": + version: 1.2.1 + resolution: "get-intrinsic@npm:1.2.1" + dependencies: + function-bind: ^1.1.1 + has: ^1.0.3 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + checksum: 5b61d88552c24b0cf6fa2d1b3bc5459d7306f699de060d76442cce49a4721f52b8c560a33ab392cf5575b7810277d54ded9d4d39a1ea61855619ebc005aa7e5f + languageName: node + linkType: hard + +"get-stdin@npm:^9.0.0": + version: 9.0.0 + resolution: "get-stdin@npm:9.0.0" + checksum: 5972bc34d05932b45512c8e2d67b040f1c1ca8afb95c56cbc480985f2d761b7e37fe90dc8abd22527f062cc5639a6930ff346e9952ae4c11a2d4275869459594 + languageName: node + linkType: hard + "get-stream@npm:^6.0.1": version: 6.0.1 resolution: "get-stream@npm:6.0.1" @@ -5123,10 +6373,12 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.2.0": - version: 4.4.0 - resolution: "get-tsconfig@npm:4.4.0" - checksum: e193558b4f0c84c81ae9688cf5b9950dc0b341e44f91b002713fd0c37cfb73108e1cd9998ed540bcc423f193fde32cc58a15e99dd469f5158a2eb4a148611176 +"get-tsconfig@npm:^4.5.0": + version: 4.7.0 + resolution: "get-tsconfig@npm:4.7.0" + dependencies: + resolve-pkg-maps: ^1.0.0 + checksum: 44536925720acc2f133d26301d5626405d8fe33066625484ff309bb6fb7f3310dc0bb202f862805f21a791e38a9870c6dddb013d1443dd5d745d91ad1946254a languageName: node linkType: hard @@ -5233,6 +6485,15 @@ __metadata: languageName: node linkType: hard +"globals@npm:^13.8.0": + version: 13.21.0 + resolution: "globals@npm:13.21.0" + dependencies: + type-fest: ^0.20.2 + checksum: 86c92ca8a04efd864c10852cd9abb1ebe6d447dcc72936783e66eaba1087d7dba5c9c3421a48d6ca722c319378754dbcc3f3f732dbe47592d7de908edf58a773 + languageName: node + linkType: hard + "globalthis@npm:^1.0.3": version: 1.0.3 resolution: "globalthis@npm:1.0.3" @@ -5306,6 +6567,13 @@ __metadata: languageName: node linkType: hard +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673 + languageName: node + linkType: hard + "gray-matter@npm:^4.0.3": version: 4.0.3 resolution: "gray-matter@npm:4.0.3" @@ -5720,6 +6988,17 @@ __metadata: languageName: node linkType: hard +"internal-slot@npm:^1.0.5": + version: 1.0.5 + resolution: "internal-slot@npm:1.0.5" + dependencies: + get-intrinsic: ^1.2.0 + has: ^1.0.3 + side-channel: ^1.0.4 + checksum: 97e84046bf9e7574d0956bd98d7162313ce7057883b6db6c5c7b5e5f05688864b0978ba07610c726d15d66544ffe4b1050107d93f8a39ebc59b15d8b429b497a + languageName: node + linkType: hard + "ip@npm:^2.0.0": version: 2.0.0 resolution: "ip@npm:2.0.0" @@ -5765,6 +7044,17 @@ __metadata: languageName: node linkType: hard +"is-array-buffer@npm:^3.0.2": + version: 3.0.2 + resolution: "is-array-buffer@npm:3.0.2" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.0 + is-typed-array: ^1.1.10 + checksum: dcac9dda66ff17df9cabdc58214172bf41082f956eab30bb0d86bc0fab1e44b690fc8e1f855cf2481245caf4e8a5a006a982a71ddccec84032ed41f9d8da8c14 + languageName: node + linkType: hard + "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" @@ -5779,6 +7069,15 @@ __metadata: languageName: node linkType: hard +"is-async-function@npm:^2.0.0": + version: 2.0.0 + resolution: "is-async-function@npm:2.0.0" + dependencies: + has-tostringtag: ^1.0.0 + checksum: e3471d95e6c014bf37cad8a93f2f4b6aac962178e0a5041e8903147166964fdc1c5c1d2ef87e86d77322c370ca18f2ea004fa7420581fa747bcaf7c223069dbd + languageName: node + linkType: hard + "is-bigint@npm:^1.0.1": version: 1.0.4 resolution: "is-bigint@npm:1.0.4" @@ -5814,7 +7113,7 @@ __metadata: languageName: node linkType: hard -"is-builtin-module@npm:^3.1.0": +"is-builtin-module@npm:^3.1.0, is-builtin-module@npm:^3.2.1": version: 3.2.1 resolution: "is-builtin-module@npm:3.2.1" dependencies: @@ -5841,7 +7140,16 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.10.0, is-core-module@npm:^2.11.0, is-core-module@npm:^2.8.0, is-core-module@npm:^2.9.0": +"is-core-module@npm:^2.1.0, is-core-module@npm:^2.12.1, is-core-module@npm:^2.13.0": + version: 2.13.0 + resolution: "is-core-module@npm:2.13.0" + dependencies: + has: ^1.0.3 + checksum: 053ab101fb390bfeb2333360fd131387bed54e476b26860dc7f5a700bbf34a0ec4454f7c8c4d43e8a0030957e4b3db6e16d35e1890ea6fb654c833095e040355 + languageName: node + linkType: hard + +"is-core-module@npm:^2.11.0, is-core-module@npm:^2.8.0, is-core-module@npm:^2.9.0": version: 2.11.0 resolution: "is-core-module@npm:2.11.0" dependencies: @@ -5850,7 +7158,7 @@ __metadata: languageName: node linkType: hard -"is-date-object@npm:^1.0.1": +"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": version: 1.0.5 resolution: "is-date-object@npm:1.0.5" dependencies: @@ -5898,6 +7206,15 @@ __metadata: languageName: node linkType: hard +"is-finalizationregistry@npm:^1.0.2": + version: 1.0.2 + resolution: "is-finalizationregistry@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + checksum: 4f243a8e06228cd45bdab8608d2cb7abfc20f6f0189c8ac21ea8d603f1f196eabd531ce0bb8e08cbab047e9845ef2c191a3761c9a17ad5cabf8b35499c4ad35d + languageName: node + linkType: hard + "is-fullwidth-code-point@npm:^3.0.0": version: 3.0.0 resolution: "is-fullwidth-code-point@npm:3.0.0" @@ -5912,7 +7229,7 @@ __metadata: languageName: node linkType: hard -"is-generator-function@npm:^1.0.7": +"is-generator-function@npm:^1.0.10, is-generator-function@npm:^1.0.7": version: 1.0.10 resolution: "is-generator-function@npm:1.0.10" dependencies: @@ -5937,6 +7254,18 @@ __metadata: languageName: node linkType: hard +"is-immutable-type@npm:^1.2.9": + version: 1.2.9 + resolution: "is-immutable-type@npm:1.2.9" + dependencies: + "@typescript-eslint/type-utils": ^5.55.0 + peerDependencies: + eslint: "*" + typescript: ">=4.7.4" + checksum: 8403d766d8141f4b3c0e678363b5333581a7aa12e7be092842f70999cc33b48e4b4a1e022a40af5b03d7442e2498bf92ad26db5bc7a257a94bba094f0d74fe81 + languageName: node + linkType: hard + "is-interactive@npm:^2.0.0": version: 2.0.0 resolution: "is-interactive@npm:2.0.0" @@ -5951,6 +7280,13 @@ __metadata: languageName: node linkType: hard +"is-map@npm:^2.0.1": + version: 2.0.2 + resolution: "is-map@npm:2.0.2" + checksum: ace3d0ecd667bbdefdb1852de601268f67f2db725624b1958f279316e13fecb8fa7df91fd60f690d7417b4ec180712f5a7ee967008e27c65cfd475cc84337728 + languageName: node + linkType: hard + "is-negative-zero@npm:^2.0.2": version: 2.0.2 resolution: "is-negative-zero@npm:2.0.2" @@ -6021,6 +7357,13 @@ __metadata: languageName: node linkType: hard +"is-set@npm:^2.0.1": + version: 2.0.2 + resolution: "is-set@npm:2.0.2" + checksum: b64343faf45e9387b97a6fd32be632ee7b269bd8183701f3b3f5b71a7cf00d04450ed8669d0bd08753e08b968beda96fca73a10fd0ff56a32603f64deba55a57 + languageName: node + linkType: hard + "is-shared-array-buffer@npm:^1.0.2": version: 1.0.2 resolution: "is-shared-array-buffer@npm:1.0.2" @@ -6084,6 +7427,13 @@ __metadata: languageName: node linkType: hard +"is-weakmap@npm:^2.0.1": + version: 2.0.1 + resolution: "is-weakmap@npm:2.0.1" + checksum: 1222bb7e90c32bdb949226e66d26cb7bce12e1e28e3e1b40bfa6b390ba3e08192a8664a703dff2a00a84825f4e022f9cd58c4599ff9981ab72b1d69479f4f7f6 + languageName: node + linkType: hard + "is-weakref@npm:^1.0.2": version: 1.0.2 resolution: "is-weakref@npm:1.0.2" @@ -6093,6 +7443,16 @@ __metadata: languageName: node linkType: hard +"is-weakset@npm:^2.0.1": + version: 2.0.2 + resolution: "is-weakset@npm:2.0.2" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.1 + checksum: 5d8698d1fa599a0635d7ca85be9c26d547b317ed8fd83fc75f03efbe75d50001b5eececb1e9971de85fcde84f69ae6f8346bc92d20d55d46201d328e4c74a367 + languageName: node + linkType: hard + "is-what@npm:^3.14.1": version: 3.14.1 resolution: "is-what@npm:3.14.1" @@ -6130,6 +7490,13 @@ __metadata: languageName: node linkType: hard +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: bd5bbe4104438c4196ba58a54650116007fa0262eccef13a4c55b2e09a5b36b59f1e75b9fcc49883dd9d4953892e6fc007eef9e9155648ceea036e184b0f930a + languageName: node + linkType: hard + "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -6137,6 +7504,25 @@ __metadata: languageName: node linkType: hard +"iterator.prototype@npm:^1.1.0": + version: 1.1.1 + resolution: "iterator.prototype@npm:1.1.1" + dependencies: + define-properties: ^1.2.0 + get-intrinsic: ^1.2.1 + has-symbols: ^1.0.3 + reflect.getprototypeof: ^1.0.3 + checksum: 2807469a39e280ff25ed95f8f84197b870a12fae2b15cb8779bbb0d12bc0e648be4d6277bedb6f4ae05d3fc94f05a29f90c018335003f27045582cf5455248df + languageName: node + linkType: hard + +"jju@npm:~1.4.0": + version: 1.4.0 + resolution: "jju@npm:1.4.0" + checksum: 3790481bd2b7827dd6336e6e3dc2dcc6d425679ba7ebde7b679f61dceb4457ea0cda330972494de608571f4973c6dfb5f70fab6f3c5037dbab19ac449a60424f + languageName: node + linkType: hard + "jmespath@npm:0.16.0": version: 0.16.0 resolution: "jmespath@npm:0.16.0" @@ -6181,6 +7567,22 @@ __metadata: languageName: node linkType: hard +"jsdoc-type-pratt-parser@npm:~4.0.0": + version: 4.0.0 + resolution: "jsdoc-type-pratt-parser@npm:4.0.0" + checksum: af0629c9517e484be778d8564440fec8de5b7610e0c9c88a3ba4554321364faf72b46689c8d8845faa12c0718437a9ed97e231977efc0f2d50e8a2dbad807eb3 + languageName: node + linkType: hard + +"jsdoctypeparser@npm:^9.0.0": + version: 9.0.0 + resolution: "jsdoctypeparser@npm:9.0.0" + bin: + jsdoctypeparser: bin/jsdoctypeparser + checksum: d9fd932fc657ee8df93b112ceb23f0c27862da7302c27325101d3700110d78d264f9ef08837ed84e7dd47b83657ffb323b47b1942b237111055cefb647b4a8ba + languageName: node + linkType: hard + "jsesc@npm:^2.5.1": version: 2.5.2 resolution: "jsesc@npm:2.5.2" @@ -6190,6 +7592,24 @@ __metadata: languageName: node linkType: hard +"jsesc@npm:^3.0.2": + version: 3.0.2 + resolution: "jsesc@npm:3.0.2" + bin: + jsesc: bin/jsesc + checksum: a36d3ca40574a974d9c2063bf68c2b6141c20da8f2a36bd3279fc802563f35f0527a6c828801295bdfb2803952cf2cf387786c2c90ed564f88d5782475abfe3c + languageName: node + linkType: hard + +"jsesc@npm:~0.5.0": + version: 0.5.0 + resolution: "jsesc@npm:0.5.0" + bin: + jsesc: bin/jsesc + checksum: b8b44cbfc92f198ad972fba706ee6a1dfa7485321ee8c0b25f5cedd538dcb20cde3197de16a7265430fce8277a12db066219369e3d51055038946039f6e20e17 + languageName: node + linkType: hard + "json-parse-even-better-errors@npm:^2.3.0": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" @@ -6204,6 +7624,13 @@ __metadata: languageName: node linkType: hard +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad + languageName: node + linkType: hard + "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" @@ -6211,7 +7638,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^1.0.1": +"json5@npm:^1.0.1, json5@npm:^1.0.2": version: 1.0.2 resolution: "json5@npm:1.0.2" dependencies: @@ -6222,7 +7649,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.1.2, json5@npm:^2.1.3, json5@npm:^2.2.2": +"json5@npm:^2.1.2, json5@npm:^2.1.3, json5@npm:^2.2.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -6299,6 +7726,18 @@ __metadata: languageName: node linkType: hard +"jsx-ast-utils@npm:^3.3.3": + version: 3.3.5 + resolution: "jsx-ast-utils@npm:3.3.5" + dependencies: + array-includes: ^3.1.6 + array.prototype.flat: ^1.3.1 + object.assign: ^4.1.4 + object.values: ^1.1.6 + checksum: f4b05fa4d7b5234230c905cfa88d36dc8a58a6666975a3891429b1a8cdc8a140bca76c297225cb7a499fad25a2c052ac93934449a2c31a44fc9edd06c773780a + languageName: node + linkType: hard + "kind-of@npm:^6.0.0, kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": version: 6.0.3 resolution: "kind-of@npm:6.0.3" @@ -6320,13 +7759,22 @@ __metadata: languageName: node linkType: hard -"language-subtag-registry@npm:^0.3.20": +"language-subtag-registry@npm:^0.3.20, language-subtag-registry@npm:~0.3.2": version: 0.3.22 resolution: "language-subtag-registry@npm:0.3.22" checksum: 8ab70a7e0e055fe977ac16ea4c261faec7205ac43db5e806f72e5b59606939a3b972c4bd1e10e323b35d6ffa97c3e1c4c99f6553069dad2dfdd22020fa3eb56a languageName: node linkType: hard +"language-tags@npm:=1.0.5": + version: 1.0.5 + resolution: "language-tags@npm:1.0.5" + dependencies: + language-subtag-registry: ~0.3.2 + checksum: c81b5d8b9f5f9cfd06ee71ada6ddfe1cf83044dd5eeefcd1e420ad491944da8957688db4a0a9bc562df4afdc2783425cbbdfd152c01d93179cf86888903123cf + languageName: node + linkType: hard + "language-tags@npm:^1.0.5": version: 1.0.7 resolution: "language-tags@npm:1.0.7" @@ -6397,6 +7845,20 @@ __metadata: languageName: node linkType: hard +"lodash.get@npm:^4.3.0, lodash.get@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.get@npm:4.4.2" + checksum: e403047ddb03181c9d0e92df9556570e2b67e0f0a930fcbbbd779370972368f5568e914f913e93f3b08f6d492abc71e14d4e9b7a18916c31fa04bd2306efe545 + languageName: node + linkType: hard + +"lodash.memoize@npm:^4.1.2": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 9ff3942feeccffa4f1fafa88d32f0d24fdc62fd15ded5a74a5f950ff5f0c6f61916157246744c620173dddf38d37095a92327d5fd3861e2063e736a5c207d089 + languageName: node + linkType: hard + "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" @@ -6411,7 +7873,21 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.21": +"lodash.truncate@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.truncate@npm:4.4.2" + checksum: b463d8a382cfb5f0e71c504dcb6f807a7bd379ff1ea216669aa42c52fc28c54e404bfbd96791aa09e6df0de2c1d7b8f1b7f4b1a61f324d38fe98bc535aeee4f5 + languageName: node + linkType: hard + +"lodash.zip@npm:^4.2.0": + version: 4.2.0 + resolution: "lodash.zip@npm:4.2.0" + checksum: 41fd8dc1af8b38086369d4fdc81dd725715dcda36ec463d907b9c58f25e5ebb518376b0acec39ded96a6b1790a89c387b9a6b1627306f33fabaf987c8d5eac9e + languageName: node + linkType: hard + +"lodash@npm:^4.13.1, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -6851,6 +8327,15 @@ __metadata: languageName: node linkType: hard +"merge-anything@npm:^5.1.7": + version: 5.1.7 + resolution: "merge-anything@npm:5.1.7" + dependencies: + is-what: ^4.1.8 + checksum: 5b9d2bcec2dd7c0a748a84b2aabc5baeee535a8ea86af9a0154c2446298c1bf7c1746dd67757df5d4138553b8f24d46730263464fbc115fe6ef9056be9f51b04 + languageName: node + linkType: hard + "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -7369,6 +8854,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^9.0.3": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: ^2.0.1 + checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 + languageName: node + linkType: hard + "minimist-options@npm:^4.0.2": version: 4.1.0 resolution: "minimist-options@npm:4.1.0" @@ -7536,6 +9030,13 @@ __metadata: languageName: node linkType: hard +"natural-compare-lite@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare-lite@npm:1.4.0" + checksum: 5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -7611,6 +9112,13 @@ __metadata: languageName: node linkType: hard +"node-releases@npm:^2.0.13": + version: 2.0.13 + resolution: "node-releases@npm:2.0.13" + checksum: 17ec8f315dba62710cae71a8dad3cd0288ba943d2ece43504b3b1aa8625bf138637798ab470b1d9035b0545996f63000a8a926e0f6d35d0996424f8b6d36dda3 + languageName: node + linkType: hard + "node-releases@npm:^2.0.8": version: 2.0.10 resolution: "node-releases@npm:2.0.10" @@ -7699,7 +9207,7 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0": +"object-inspect@npm:^1.12.2, object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0": version: 1.12.3 resolution: "object-inspect@npm:1.12.3" checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db @@ -7736,6 +9244,17 @@ __metadata: languageName: node linkType: hard +"object.entries@npm:^1.1.6": + version: 1.1.7 + resolution: "object.entries@npm:1.1.7" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: da287d434e7e32989586cd734382364ba826a2527f2bc82e6acbf9f9bfafa35d51018b66ec02543ffdfa2a5ba4af2b6f1ca6e588c65030cb4fd9c67d6ced594c + languageName: node + linkType: hard + "object.fromentries@npm:^2.0.5": version: 2.0.6 resolution: "object.fromentries@npm:2.0.6" @@ -7747,6 +9266,29 @@ __metadata: languageName: node linkType: hard +"object.fromentries@npm:^2.0.6": + version: 2.0.7 + resolution: "object.fromentries@npm:2.0.7" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: 7341ce246e248b39a431b87a9ddd331ff52a454deb79afebc95609f94b1f8238966cf21f52188f2a353f0fdf83294f32f1ebf1f7826aae915ebad21fd0678065 + languageName: node + linkType: hard + +"object.groupby@npm:^1.0.0": + version: 1.0.1 + resolution: "object.groupby@npm:1.0.1" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + get-intrinsic: ^1.2.1 + checksum: d7959d6eaaba358b1608066fc67ac97f23ce6f573dc8fc661f68c52be165266fcb02937076aedb0e42722fdda0bdc0bbf74778196ac04868178888e9fd3b78b5 + languageName: node + linkType: hard + "object.hasown@npm:^1.1.0": version: 1.1.2 resolution: "object.hasown@npm:1.1.2" @@ -7757,6 +9299,16 @@ __metadata: languageName: node linkType: hard +"object.hasown@npm:^1.1.2": + version: 1.1.3 + resolution: "object.hasown@npm:1.1.3" + dependencies: + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: 76bc17356f6124542fb47e5d0e78d531eafa4bba3fc2d6fc4b1a8ce8b6878912366c0d99f37ce5c84ada8fd79df7aa6ea1214fddf721f43e093ad2df51f27da1 + languageName: node + linkType: hard + "object.values@npm:^1.1.5, object.values@npm:^1.1.6": version: 1.1.6 resolution: "object.values@npm:1.1.6" @@ -7820,6 +9372,20 @@ __metadata: languageName: node linkType: hard +"optionator@npm:^0.9.3": + version: 0.9.3 + resolution: "optionator@npm:0.9.3" + dependencies: + "@aashutoshrathi/word-wrap": ^1.2.3 + deep-is: ^0.1.3 + fast-levenshtein: ^2.0.6 + levn: ^0.4.1 + prelude-ls: ^1.2.1 + type-check: ^0.4.0 + checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a + languageName: node + linkType: hard + "ora@npm:^6.1.0": version: 6.1.2 resolution: "ora@npm:6.1.2" @@ -8011,7 +9577,7 @@ __metadata: languageName: node linkType: hard -"path-parse@npm:^1.0.7": +"path-parse@npm:^1.0.6, path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a @@ -8212,7 +9778,18 @@ __metadata: languageName: node linkType: hard -"prettier-plugin-astro@npm:^0.7.0, prettier-plugin-astro@npm:^0.7.2": +"prettier-plugin-astro@npm:^0.11.0": + version: 0.11.1 + resolution: "prettier-plugin-astro@npm:0.11.1" + dependencies: + "@astrojs/compiler": ^1.5.5 + prettier: ^3.0.0 + sass-formatter: ^0.7.6 + checksum: 387ab72accdbbaad0e0da37fab2f3de91a94ea512caff5a4b8c51aecd61a217ef655a648fd5e4f4f2d1b1bea8d8ed34e6e9d4654b14287cdd26946fb77c51aa2 + languageName: node + linkType: hard + +"prettier-plugin-astro@npm:^0.7.0": version: 0.7.2 resolution: "prettier-plugin-astro@npm:0.7.2" dependencies: @@ -8237,31 +9814,30 @@ __metadata: languageName: node linkType: hard -"prettier-plugin-packagejson@npm:^2.3.0": - version: 2.4.2 - resolution: "prettier-plugin-packagejson@npm:2.4.2" +"prettier-plugin-packagejson@npm:^2.4.5": + version: 2.4.5 + resolution: "prettier-plugin-packagejson@npm:2.4.5" dependencies: - sort-package-json: 2.2.0 + sort-package-json: 2.5.1 synckit: 0.8.5 peerDependencies: prettier: ">= 1.16.0" peerDependenciesMeta: prettier: optional: true - checksum: 8637e61831de0a8e28ac0872b59144cf7bdbb49c473d57b66c06dc8e7ee8e39cdb8b14a08ff75484633c19f69593f7024f7637d04c75e2b70681f1217619fb8a + checksum: 9d7529e42546c157194c5d490890852c7e97d2c3ae529f83e3caec61ec97b5bc63b28b25836d7de579accde09b6e161cc9145b2d4105822586b589eedb1f2d14 languageName: node linkType: hard -"prettier-plugin-sh@npm:^0.12.8": - version: 0.12.8 - resolution: "prettier-plugin-sh@npm:0.12.8" +"prettier-plugin-sh@npm:^0.13.1": + version: 0.13.1 + resolution: "prettier-plugin-sh@npm:0.13.1" dependencies: mvdan-sh: ^0.10.1 - sh-syntax: ^0.3.6 - synckit: ^0.8.1 + sh-syntax: ^0.4.1 peerDependencies: - prettier: ^2.0.0 - checksum: a610fa5fdbf4918d2d3e4a2be04665e1e89c5ae50e2f646f9167484666c6653adc73386955ceb42cc7d54d14145111438c43faf157498c4b4842dfd48cc4aabf + prettier: ^3.0.0 + checksum: c0e383ff2691b1440e0751222a4ab9ae82228fd7f4a368ec35e2d44e88dd5cdba1c0ce7bf541c1ea4538c6852ef8304793113c4e9e2425084b08fbef2b27532f languageName: node linkType: hard @@ -8276,27 +9852,28 @@ __metadata: languageName: node linkType: hard -"prettier-plugin-tailwindcss@npm:^0.2.1": - version: 0.2.2 - resolution: "prettier-plugin-tailwindcss@npm:0.2.2" +"prettier-plugin-tailwindcss@npm:^0.4.1": + version: 0.4.1 + resolution: "prettier-plugin-tailwindcss@npm:0.4.1" peerDependencies: - "@prettier/plugin-php": "*" + "@ianvs/prettier-plugin-sort-imports": "*" "@prettier/plugin-pug": "*" "@shopify/prettier-plugin-liquid": "*" "@shufo/prettier-plugin-blade": "*" "@trivago/prettier-plugin-sort-imports": "*" - prettier: ">=2.2.0" + prettier: ^2.2 || ^3.0 prettier-plugin-astro: "*" prettier-plugin-css-order: "*" prettier-plugin-import-sort: "*" prettier-plugin-jsdoc: "*" + prettier-plugin-marko: "*" prettier-plugin-organize-attributes: "*" prettier-plugin-organize-imports: "*" prettier-plugin-style-order: "*" prettier-plugin-svelte: "*" prettier-plugin-twig-melody: "*" peerDependenciesMeta: - "@prettier/plugin-php": + "@ianvs/prettier-plugin-sort-imports": optional: true "@prettier/plugin-pug": optional: true @@ -8314,6 +9891,8 @@ __metadata: optional: true prettier-plugin-jsdoc: optional: true + prettier-plugin-marko: + optional: true prettier-plugin-organize-attributes: optional: true prettier-plugin-organize-imports: @@ -8324,7 +9903,7 @@ __metadata: optional: true prettier-plugin-twig-melody: optional: true - checksum: dd4baa7b60d0cef36309a97bf884ec7beb61e29d7bf0c88036647985243535048968252f2f7159d88142695ae21fe305a6a1f96cceec36d41085cab63dbc4b25 + checksum: 9bdf3b7c270cc544f6bc38bbb869d3a97afc93de5005eee7272a36f374488731349c9362d2bbe4c83bd2a14b8a7c96cd25b9b682d1bea6dccc5bf08b2d02096c languageName: node linkType: hard @@ -8346,6 +9925,15 @@ __metadata: languageName: node linkType: hard +"prettier@npm:^3.0.0, prettier@npm:^3.0.3": + version: 3.0.3 + resolution: "prettier@npm:3.0.3" + bin: + prettier: bin/prettier.cjs + checksum: e10b9af02b281f6c617362ebd2571b1d7fc9fb8a3bd17e371754428cda992e5e8d8b7a046e8f7d3e2da1dcd21aa001e2e3c797402ebb6111b5cd19609dd228e0 + languageName: node + linkType: hard + "pretty-format@npm:^27.5.1": version: 27.5.1 resolution: "pretty-format@npm:27.5.1" @@ -8391,7 +9979,7 @@ __metadata: languageName: node linkType: hard -"prop-types@npm:^15.7.2": +"prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" dependencies: @@ -8546,6 +10134,29 @@ __metadata: languageName: node linkType: hard +"refa@npm:^0.11.0": + version: 0.11.0 + resolution: "refa@npm:0.11.0" + dependencies: + "@eslint-community/regexpp": ^4.5.0 + checksum: 2b86c348dca15dde99f906bd08d64d6f08a7587e57789ed0a634065b60d8800c65d73b19e0d97ff79306591b9db8f15f4ef726026522d08da27da4ce278872be + languageName: node + linkType: hard + +"reflect.getprototypeof@npm:^1.0.3": + version: 1.0.4 + resolution: "reflect.getprototypeof@npm:1.0.4" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + get-intrinsic: ^1.2.1 + globalthis: ^1.0.3 + which-builtin-type: ^1.1.3 + checksum: 16e2361988dbdd23274b53fb2b1b9cefeab876c3941a2543b4cadac6f989e3db3957b07a44aac46cfceb3e06e2871785ec2aac992d824f76292f3b5ee87f66f2 + languageName: node + linkType: hard + "regenerator-runtime@npm:^0.13.11": version: 0.13.11 resolution: "regenerator-runtime@npm:0.13.11" @@ -8553,6 +10164,23 @@ __metadata: languageName: node linkType: hard +"regenerator-runtime@npm:^0.14.0": + version: 0.14.0 + resolution: "regenerator-runtime@npm:0.14.0" + checksum: 1c977ad82a82a4412e4f639d65d22be376d3ebdd30da2c003eeafdaaacd03fc00c2320f18120007ee700900979284fc78a9f00da7fb593f6e6eeebc673fba9a3 + languageName: node + linkType: hard + +"regexp-ast-analysis@npm:^0.6.0": + version: 0.6.0 + resolution: "regexp-ast-analysis@npm:0.6.0" + dependencies: + "@eslint-community/regexpp": ^4.5.0 + refa: ^0.11.0 + checksum: 13db2add3a824d7795f1606b48131a048a5c26b47413078f232351bbcf8204ef09f4d717ec6c4c1524248ab7b37fd16bcbe9f3aa0c8bec5cb6c3a51416fc6274 + languageName: node + linkType: hard + "regexp-tree@npm:^0.1.24, regexp-tree@npm:~0.1.1": version: 0.1.24 resolution: "regexp-tree@npm:0.1.24" @@ -8562,6 +10190,15 @@ __metadata: languageName: node linkType: hard +"regexp-tree@npm:^0.1.27": + version: 0.1.27 + resolution: "regexp-tree@npm:0.1.27" + bin: + regexp-tree: bin/regexp-tree + checksum: 129aebb34dae22d6694ab2ac328be3f99105143737528ab072ef624d599afecbcfae1f5c96a166fa9e5f64fa1ecf30b411c4691e7924c3e11bbaf1712c260c54 + languageName: node + linkType: hard + "regexp.prototype.flags@npm:^1.4.3": version: 1.4.3 resolution: "regexp.prototype.flags@npm:1.4.3" @@ -8573,6 +10210,17 @@ __metadata: languageName: node linkType: hard +"regexp.prototype.flags@npm:^1.5.0": + version: 1.5.0 + resolution: "regexp.prototype.flags@npm:1.5.0" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + functions-have-names: ^1.2.3 + checksum: c541687cdbdfff1b9a07f6e44879f82c66bbf07665f9a7544c5fd16acdb3ec8d1436caab01662d2fbcad403f3499d49ab0b77fbc7ef29ef961d98cc4bc9755b4 + languageName: node + linkType: hard + "regexpp@npm:^3.0.0, regexpp@npm:^3.2.0": version: 3.2.0 resolution: "regexpp@npm:3.2.0" @@ -8580,6 +10228,17 @@ __metadata: languageName: node linkType: hard +"regjsparser@npm:^0.10.0": + version: 0.10.0 + resolution: "regjsparser@npm:0.10.0" + dependencies: + jsesc: ~0.5.0 + bin: + regjsparser: bin/parser + checksum: 17550661f43ba792f8365fb95b3dbdb64e25f14e31ef7c2c11876c240a60e87b7bfc28c98589f4e76b7cf49307e45fb24d030f57d68dd0cc41c56b4d378e9254 + languageName: node + linkType: hard + "rehype-parse@npm:^8.0.0": version: 8.0.4 resolution: "rehype-parse@npm:8.0.4" @@ -8705,6 +10364,13 @@ __metadata: languageName: node linkType: hard +"req-all@npm:^0.1.0": + version: 0.1.0 + resolution: "req-all@npm:0.1.0" + checksum: 16a6931b6a6024e4e33072ee3fdd87c9e84d75f228caadd21098e46f4825fddb934ce01d6a5af81daf95541bfd35be5b2fe82b78910fdf13a35297c042865984 + languageName: node + linkType: hard + "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -8712,6 +10378,13 @@ __metadata: languageName: node linkType: hard +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b + languageName: node + linkType: hard + "require-main-filename@npm:^2.0.0": version: 2.0.0 resolution: "require-main-filename@npm:2.0.0" @@ -8719,6 +10392,13 @@ __metadata: languageName: node linkType: hard +"requireindex@npm:~1.2.0": + version: 1.2.0 + resolution: "requireindex@npm:1.2.0" + checksum: 50d8b10a1ff1fdf6aea7a1870bc7bd238b0fb1917d8d7ca17fd03afc38a65dcd7a8a4eddd031f89128b5f0065833d5c92c4fef67f2c04e8624057fe626c9cf94 + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -8733,6 +10413,13 @@ __metadata: languageName: node linkType: hard +"resolve-pkg-maps@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-pkg-maps@npm:1.0.0" + checksum: 1012afc566b3fdb190a6309cc37ef3b2dcc35dff5fa6683a9d00cd25c3247edfbc4691b91078c97adc82a29b77a2660c30d791d65dab4fc78bfc473f60289977 + languageName: node + linkType: hard + "resolve-pkg@npm:^2.0.0": version: 2.0.0 resolution: "resolve-pkg@npm:2.0.0" @@ -8755,7 +10442,20 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^2.0.0-next.3": +"resolve@npm:^1.22.2": + version: 1.22.4 + resolution: "resolve@npm:1.22.4" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 23f25174c2736ce24c6d918910e0d1f89b6b38fefa07a995dff864acd7863d59a7f049e691f93b4b2ee29696303390d921552b6d1b841ed4a8101f517e1d0124 + languageName: node + linkType: hard + +"resolve@npm:^2.0.0-next.3, resolve@npm:^2.0.0-next.4": version: 2.0.0-next.4 resolution: "resolve@npm:2.0.0-next.4" dependencies: @@ -8768,6 +10468,16 @@ __metadata: languageName: node linkType: hard +"resolve@npm:~1.19.0": + version: 1.19.0 + resolution: "resolve@npm:1.19.0" + dependencies: + is-core-module: ^2.1.0 + path-parse: ^1.0.6 + checksum: a05b356e47b85ad3613d9e2a39a824f3c27f4fcad9c9ff6c7cc71a2e314c5904a90ab37481ad0069d03cab9eaaac6eb68aca1bc3355fdb05f1045cd50e2aacea + languageName: node + linkType: hard + "resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.10.1#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin": version: 1.22.1 resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=c3c19d" @@ -8781,7 +10491,20 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^2.0.0-next.3#~builtin": +"resolve@patch:resolve@^1.22.2#~builtin": + version: 1.22.4 + resolution: "resolve@patch:resolve@npm%3A1.22.4#~builtin::version=1.22.4&hash=c3c19d" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: c45f2545fdc4d21883861b032789e20aa67a2f2692f68da320cc84d5724cd02f2923766c5354b3210897e88f1a7b3d6d2c7c22faeead8eed7078e4c783a444bc + languageName: node + linkType: hard + +"resolve@patch:resolve@^2.0.0-next.3#~builtin, resolve@patch:resolve@^2.0.0-next.4#~builtin": version: 2.0.0-next.4 resolution: "resolve@patch:resolve@npm%3A2.0.0-next.4#~builtin::version=2.0.0-next.4&hash=c3c19d" dependencies: @@ -8794,6 +10517,16 @@ __metadata: languageName: node linkType: hard +"resolve@patch:resolve@~1.19.0#~builtin": + version: 1.19.0 + resolution: "resolve@patch:resolve@npm%3A1.19.0#~builtin::version=1.19.0&hash=c3c19d" + dependencies: + is-core-module: ^2.1.0 + path-parse: ^1.0.6 + checksum: 2443b94d347e6946c87c85faf13071f605e609e0b54784829b0ed2b917d050bfc1cbaf4ecc6453f224cfa7d0c5dcd97cbb273454cd210bee68e4af15c1a5abc9 + languageName: node + linkType: hard + "restore-cursor@npm:^4.0.0": version: 4.0.0 resolution: "restore-cursor@npm:4.0.0" @@ -8925,16 +10658,16 @@ __metadata: resolution: "root@workspace:." dependencies: "@changesets/changelog-github": ^0.4.8 - "@changesets/cli": ^2.26.0 - "@lshay/eslint-config": ^0.2.2 - "@lshay/prettier-config": ^0.5.3 - "@rushstack/eslint-patch": ^1.2.0 - eslint: ^8.34.0 - eslint-import-resolver-typescript: ^3.5.3 - eslint-plugin-import: ^2.27.5 - prettier: ^2.8.4 - turbo: ^1.8.0 - typescript: ^4.9.5 + "@changesets/cli": ^2.26.2 + "@lshay/eslint-config": ^0.3.5 + "@lshay/prettier-config": ^0.6.0 + "@rushstack/eslint-patch": ^1.3.3 + eslint: ^8.48.0 + eslint-import-resolver-typescript: ^3.6.0 + eslint-plugin-import: ^2.28.1 + prettier: ^3.0.3 + turbo: ^1.10.13 + typescript: ^5.2.2 languageName: unknown linkType: soft @@ -8963,6 +10696,18 @@ __metadata: languageName: node linkType: hard +"safe-array-concat@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-array-concat@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.0 + has-symbols: ^1.0.3 + isarray: ^2.0.5 + checksum: f43cb98fe3b566327d0c09284de2b15fb85ae964a89495c1b1a5d50c7c8ed484190f4e5e71aacc167e16231940079b326f2c0807aea633d47cc7322f40a6b57f + languageName: node + linkType: hard + "safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" @@ -9015,6 +10760,15 @@ __metadata: languageName: node linkType: hard +"sass-formatter@npm:^0.7.6": + version: 0.7.7 + resolution: "sass-formatter@npm:0.7.7" + dependencies: + suf-log: ^2.5.3 + checksum: 17bd227bb086cc6ddf5992e4dea556ed59d580e92f716e2f7f3d07754c418444a85f24c9bdf912ff324aabfc19847538e6d1b1ffe8460559fe87282f3d463b80 + languageName: node + linkType: hard + "sass@npm:^1.58.2": version: 1.58.2 resolution: "sass@npm:1.58.2" @@ -9042,6 +10796,17 @@ __metadata: languageName: node linkType: hard +"scslre@npm:^0.2.0": + version: 0.2.0 + resolution: "scslre@npm:0.2.0" + dependencies: + "@eslint-community/regexpp": ^4.5.0 + refa: ^0.11.0 + regexp-ast-analysis: ^0.6.0 + checksum: 6e1df2eddf33e4559a19614fb78401bc16efb56f3af65e4bb7c11b71581ab22962c5e66c6a622f53370cbd6967061c94fe34dad11c1a47dc60712332d7d12fa4 + languageName: node + linkType: hard + "section-matter@npm:^1.0.0": version: 1.0.0 resolution: "section-matter@npm:1.0.0" @@ -9052,7 +10817,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.4.1": +"semver@npm:2 || 3 || 4 || 5": version: 5.7.1 resolution: "semver@npm:5.7.1" bin: @@ -9081,6 +10846,26 @@ __metadata: languageName: node linkType: hard +"semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: ae47d06de28836adb9d3e25f22a92943477371292d9b665fb023fae278d345d508ca1958232af086d85e0155aee22e313e100971898bbb8d5d89b8b1d4054ca2 + languageName: node + linkType: hard + +"semver@npm:^7.0.0, semver@npm:^7.5.3, semver@npm:^7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 + languageName: node + linkType: hard + "semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8": version: 7.3.8 resolution: "semver@npm:7.3.8" @@ -9106,12 +10891,12 @@ __metadata: languageName: node linkType: hard -"sh-syntax@npm:^0.3.6": - version: 0.3.7 - resolution: "sh-syntax@npm:0.3.7" +"sh-syntax@npm:^0.4.1": + version: 0.4.1 + resolution: "sh-syntax@npm:0.4.1" dependencies: - tslib: ^2.4.0 - checksum: cc2e7733b4d62b82760e8a8948ab3fe4c1cb1725aa27e89d65d8fefce7548d3beaa88121cad129c853618d3b4edea07992204f0647e528cbd00a1998c03415ad + tslib: ^2.6.0 + checksum: 9bc0fc93163735d15d11d8f865e63382d66eea54b8483f82ac37698e3edd4ffb1b5efaf7de06cdbe9a202387d57a5437dc032e49cae32c3a30608d71a38a5258 languageName: node linkType: hard @@ -9227,6 +11012,17 @@ __metadata: languageName: node linkType: hard +"slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "slice-ansi@npm:4.0.0" + dependencies: + ansi-styles: ^4.0.0 + astral-regex: ^2.0.0 + is-fullwidth-code-point: ^3.0.0 + checksum: 4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756 + languageName: node + linkType: hard + "slice-ansi@npm:^5.0.0": version: 5.0.0 resolution: "slice-ansi@npm:5.0.0" @@ -9288,19 +11084,20 @@ __metadata: languageName: node linkType: hard -"sort-package-json@npm:2.2.0": - version: 2.2.0 - resolution: "sort-package-json@npm:2.2.0" +"sort-package-json@npm:2.5.1": + version: 2.5.1 + resolution: "sort-package-json@npm:2.5.1" dependencies: detect-indent: ^7.0.1 detect-newline: ^4.0.0 + get-stdin: ^9.0.0 git-hooks-list: ^3.0.0 globby: ^13.1.2 is-plain-obj: ^4.1.0 sort-object-keys: ^1.1.3 bin: sort-package-json: cli.js - checksum: 981a272e8561e811e94f79183351129e9c147e2039c58179a98cf745443afc2bbf9a66a44794948045d67d83467fa4ec00e2bf7a2f2a5b6270a29ec48ca2dfe9 + checksum: 69ec7a6275fa518e3fa883558b77d14cb19e57115b458581aba9ef38eb629ab5836c6a2158ad124a0c9419b819e132fbd2a2df5a4fb8448f91339c470dba5101 languageName: node linkType: hard @@ -9369,7 +11166,7 @@ __metadata: languageName: node linkType: hard -"spdx-expression-parse@npm:^3.0.0": +"spdx-expression-parse@npm:^3.0.0, spdx-expression-parse@npm:^3.0.1": version: 3.0.1 resolution: "spdx-expression-parse@npm:3.0.1" dependencies: @@ -9477,6 +11274,33 @@ __metadata: languageName: node linkType: hard +"string.prototype.matchall@npm:^4.0.8": + version: 4.0.9 + resolution: "string.prototype.matchall@npm:4.0.9" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + get-intrinsic: ^1.2.1 + has-symbols: ^1.0.3 + internal-slot: ^1.0.5 + regexp.prototype.flags: ^1.5.0 + side-channel: ^1.0.4 + checksum: a68a9914755ec8c9b9129d6fb70603d78b839a1ca4a907e601fcb860109cecfbd1884e8b38989885f9c825c1c2015ff5b1ed9ddac7c8d040e4e4b3c9bc4ed5ed + languageName: node + linkType: hard + +"string.prototype.trim@npm:^1.2.7": + version: 1.2.7 + resolution: "string.prototype.trim@npm:1.2.7" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 05b7b2d6af63648e70e44c4a8d10d8cc457536df78b55b9d6230918bde75c5987f6b8604438c4c8652eb55e4fc9725d2912789eb4ec457d6995f3495af190c09 + languageName: node + linkType: hard + "string.prototype.trimend@npm:^1.0.6": version: 1.0.6 resolution: "string.prototype.trimend@npm:1.0.6" @@ -9658,7 +11482,7 @@ __metadata: languageName: node linkType: hard -"synckit@npm:0.8.5, synckit@npm:^0.8.1, synckit@npm:^0.8.4": +"synckit@npm:0.8.5, synckit@npm:^0.8.4": version: 0.8.5 resolution: "synckit@npm:0.8.5" dependencies: @@ -9668,6 +11492,19 @@ __metadata: languageName: node linkType: hard +"table@npm:^6.8.1": + version: 6.8.1 + resolution: "table@npm:6.8.1" + dependencies: + ajv: ^8.0.1 + lodash.truncate: ^4.4.2 + slice-ansi: ^4.0.0 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + checksum: 08249c7046125d9d0a944a6e96cfe9ec66908d6b8a9db125531be6eb05fa0de047fd5542e9d43b4f987057f00a093b276b8d3e19af162a9c40db2681058fd306 + languageName: node + linkType: hard + "tailwindcss@npm:^3": version: 3.2.4 resolution: "tailwindcss@npm:3.2.4" @@ -9859,6 +11696,15 @@ __metadata: languageName: node linkType: hard +"ts-api-utils@npm:^1.0.1": + version: 1.0.2 + resolution: "ts-api-utils@npm:1.0.2" + peerDependencies: + typescript: ">=4.2.0" + checksum: 6375e12ba90b6cbe73f564405248da14c52aa44b62b386e1cbbb1da2640265dd33e99d3e019688dffa874e365cf596b161ccd49351e90638be825c2639697640 + languageName: node + linkType: hard + "ts-node@npm:^10.9.1": version: 10.9.1 resolution: "ts-node@npm:10.9.1" @@ -9916,6 +11762,18 @@ __metadata: languageName: node linkType: hard +"tsconfig-paths@npm:^3.14.2": + version: 3.14.2 + resolution: "tsconfig-paths@npm:3.14.2" + dependencies: + "@types/json5": ^0.0.29 + json5: ^1.0.2 + minimist: ^1.2.6 + strip-bom: ^3.0.0 + checksum: a6162eaa1aed680537f93621b82399c7856afd10ec299867b13a0675e981acac4e0ec00896860480efc59fc10fd0b16fdc928c0b885865b52be62cadac692447 + languageName: node + linkType: hard + "tsconfig-resolver@npm:^3.0.1": version: 3.0.1 resolution: "tsconfig-resolver@npm:3.0.1" @@ -9937,6 +11795,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^2.0.0, tslib@npm:^2.3.1, tslib@npm:^2.6.0": + version: 2.6.2 + resolution: "tslib@npm:2.6.2" + checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad + languageName: node + linkType: hard + "tslib@npm:^2.4.0, tslib@npm:^2.5.0": version: 2.5.0 resolution: "tslib@npm:2.5.0" @@ -9944,7 +11809,23 @@ __metadata: languageName: node linkType: hard -"tsutils@npm:^3.21.0": +"tsutils-etc@npm:^1.4.1": + version: 1.4.2 + resolution: "tsutils-etc@npm:1.4.2" + dependencies: + "@types/yargs": ^17.0.0 + yargs: ^17.0.0 + peerDependencies: + tsutils: ^3.0.0 + typescript: ">=4.0.0" + bin: + ts-flags: bin/ts-flags + ts-kind: bin/ts-kind + checksum: 3ced18d72701973e63b8c0c80ba184a95c335936da9ccc47706d435581d2726aba15eae975ea8335b083a9a02cd6c029f6c0ef9ad1d50395728148ef18f31bc9 + languageName: node + linkType: hard + +"tsutils@npm:^3.0.0, tsutils@npm:^3.17.1, tsutils@npm:^3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0" dependencies: @@ -9972,58 +11853,58 @@ __metadata: languageName: node linkType: hard -"turbo-darwin-64@npm:1.8.0": - version: 1.8.0 - resolution: "turbo-darwin-64@npm:1.8.0" +"turbo-darwin-64@npm:1.10.13": + version: 1.10.13 + resolution: "turbo-darwin-64@npm:1.10.13" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"turbo-darwin-arm64@npm:1.8.0": - version: 1.8.0 - resolution: "turbo-darwin-arm64@npm:1.8.0" +"turbo-darwin-arm64@npm:1.10.13": + version: 1.10.13 + resolution: "turbo-darwin-arm64@npm:1.10.13" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"turbo-linux-64@npm:1.8.0": - version: 1.8.0 - resolution: "turbo-linux-64@npm:1.8.0" +"turbo-linux-64@npm:1.10.13": + version: 1.10.13 + resolution: "turbo-linux-64@npm:1.10.13" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"turbo-linux-arm64@npm:1.8.0": - version: 1.8.0 - resolution: "turbo-linux-arm64@npm:1.8.0" +"turbo-linux-arm64@npm:1.10.13": + version: 1.10.13 + resolution: "turbo-linux-arm64@npm:1.10.13" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"turbo-windows-64@npm:1.8.0": - version: 1.8.0 - resolution: "turbo-windows-64@npm:1.8.0" +"turbo-windows-64@npm:1.10.13": + version: 1.10.13 + resolution: "turbo-windows-64@npm:1.10.13" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"turbo-windows-arm64@npm:1.8.0": - version: 1.8.0 - resolution: "turbo-windows-arm64@npm:1.8.0" +"turbo-windows-arm64@npm:1.10.13": + version: 1.10.13 + resolution: "turbo-windows-arm64@npm:1.10.13" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"turbo@npm:^1.8.0": - version: 1.8.0 - resolution: "turbo@npm:1.8.0" +"turbo@npm:^1.10.13": + version: 1.10.13 + resolution: "turbo@npm:1.10.13" dependencies: - turbo-darwin-64: 1.8.0 - turbo-darwin-arm64: 1.8.0 - turbo-linux-64: 1.8.0 - turbo-linux-arm64: 1.8.0 - turbo-windows-64: 1.8.0 - turbo-windows-arm64: 1.8.0 + turbo-darwin-64: 1.10.13 + turbo-darwin-arm64: 1.10.13 + turbo-linux-64: 1.10.13 + turbo-linux-arm64: 1.10.13 + turbo-windows-64: 1.10.13 + turbo-windows-arm64: 1.10.13 dependenciesMeta: turbo-darwin-64: optional: true @@ -10039,7 +11920,7 @@ __metadata: optional: true bin: turbo: bin/turbo - checksum: 7f97068d7f9a155e088d3575b1f9922e68fa3015aae0c92625238d44b4e6c275bec2a281907702dedb402fca29a6cd4690499e916cb334d7c24c98099bc3d8b0 + checksum: 0c000c671534c8c80270c6d1fc77646df0e44164c0db561a85b3fefadd4bda6d5920626d067abb09af38613024e3984fb8d8bc5be922dae6236eda6aab9447a2 languageName: node linkType: hard @@ -10094,6 +11975,42 @@ __metadata: languageName: node linkType: hard +"typed-array-buffer@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-buffer@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.1 + is-typed-array: ^1.1.10 + checksum: 3e0281c79b2a40cd97fe715db803884301993f4e8c18e8d79d75fd18f796e8cd203310fec8c7fdb5e6c09bedf0af4f6ab8b75eb3d3a85da69328f28a80456bd3 + languageName: node + linkType: hard + +"typed-array-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-byte-length@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + for-each: ^0.3.3 + has-proto: ^1.0.1 + is-typed-array: ^1.1.10 + checksum: b03db16458322b263d87a702ff25388293f1356326c8a678d7515767ef563ef80e1e67ce648b821ec13178dd628eb2afdc19f97001ceae7a31acf674c849af94 + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-byte-offset@npm:1.0.0" + dependencies: + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.2 + for-each: ^0.3.3 + has-proto: ^1.0.1 + is-typed-array: ^1.1.10 + checksum: 04f6f02d0e9a948a95fbfe0d5a70b002191fae0b8fe0fe3130a9b2336f043daf7a3dda56a31333c35a067a97e13f539949ab261ca0f3692c41603a46a94e960b + languageName: node + linkType: hard + "typed-array-length@npm:^1.0.4": version: 1.0.4 resolution: "typed-array-length@npm:1.0.4" @@ -10125,6 +12042,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:^5.2.2": + version: 5.2.2 + resolution: "typescript@npm:5.2.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 7912821dac4d962d315c36800fe387cdc0a6298dba7ec171b350b4a6e988b51d7b8f051317786db1094bd7431d526b648aba7da8236607febb26cf5b871d2d3c + languageName: node + linkType: hard + "typescript@patch:typescript@*#~builtin, typescript@patch:typescript@^4.9.5#~builtin": version: 4.9.5 resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=23ec76" @@ -10145,6 +12072,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@^5.2.2#~builtin": + version: 5.2.2 + resolution: "typescript@patch:typescript@npm%3A5.2.2#~builtin::version=5.2.2&hash=1f5320" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 07106822b4305de3f22835cbba949a2b35451cad50888759b6818421290ff95d522b38ef7919e70fb381c5fe9c1c643d7dea22c8b31652a717ddbd57b7f4d554 + languageName: node + linkType: hard + "ufo@npm:^1.0.1": version: 1.0.1 resolution: "ufo@npm:1.0.1" @@ -10332,6 +12269,20 @@ __metadata: languageName: node linkType: hard +"update-browserslist-db@npm:^1.0.11": + version: 1.0.11 + resolution: "update-browserslist-db@npm:1.0.11" + dependencies: + escalade: ^3.1.1 + picocolors: ^1.0.0 + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: b98327518f9a345c7cad5437afae4d2ae7d865f9779554baf2a200fdf4bac4969076b679b1115434bd6557376bdd37ca7583d0f9b8f8e302d7d4cc1e91b5f231 + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -10401,6 +12352,13 @@ __metadata: languageName: node linkType: hard +"validate-html-nesting@npm:^1.2.2": + version: 1.2.2 + resolution: "validate-html-nesting@npm:1.2.2" + checksum: df077b3dc3fbedb81e309a6fefe53485a9e0415c8fd6d545ca13e7512bc22d780b7ace91b4173066beef95b80e3b9e8d6a584b89a62e80a242c8f16983b37164 + languageName: node + linkType: hard + "validate-npm-package-license@npm:^3.0.1": version: 3.0.4 resolution: "validate-npm-package-license@npm:3.0.4" @@ -10757,6 +12715,38 @@ __metadata: languageName: node linkType: hard +"which-builtin-type@npm:^1.1.3": + version: 1.1.3 + resolution: "which-builtin-type@npm:1.1.3" + dependencies: + function.prototype.name: ^1.1.5 + has-tostringtag: ^1.0.0 + is-async-function: ^2.0.0 + is-date-object: ^1.0.5 + is-finalizationregistry: ^1.0.2 + is-generator-function: ^1.0.10 + is-regex: ^1.1.4 + is-weakref: ^1.0.2 + isarray: ^2.0.5 + which-boxed-primitive: ^1.0.2 + which-collection: ^1.0.1 + which-typed-array: ^1.1.9 + checksum: 43730f7d8660ff9e33d1d3f9f9451c4784265ee7bf222babc35e61674a11a08e1c2925019d6c03154fcaaca4541df43abe35d2720843b9b4cbcebdcc31408f36 + languageName: node + linkType: hard + +"which-collection@npm:^1.0.1": + version: 1.0.1 + resolution: "which-collection@npm:1.0.1" + dependencies: + is-map: ^2.0.1 + is-set: ^2.0.1 + is-weakmap: ^2.0.1 + is-weakset: ^2.0.1 + checksum: c815bbd163107ef9cb84f135e6f34453eaf4cca994e7ba85ddb0d27cea724c623fae2a473ceccfd5549c53cc65a5d82692de418166df3f858e1e5dc60818581c + languageName: node + linkType: hard + "which-module@npm:^2.0.0": version: 2.0.0 resolution: "which-module@npm:2.0.0" @@ -10781,6 +12771,19 @@ __metadata: languageName: node linkType: hard +"which-typed-array@npm:^1.1.10": + version: 1.1.11 + resolution: "which-typed-array@npm:1.1.11" + dependencies: + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.2 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-tostringtag: ^1.0.0 + checksum: 711ffc8ef891ca6597b19539075ec3e08bb9b4c2ca1f78887e3c07a977ab91ac1421940505a197758fb5939aa9524976d0a5bbcac34d07ed6faa75cedbb17206 + languageName: node + linkType: hard + "which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": version: 1.1.9 resolution: "which-typed-array@npm:1.1.9" @@ -10996,6 +12999,21 @@ __metadata: languageName: node linkType: hard +"yargs@npm:^17.0.0": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: ^8.0.1 + escalade: ^3.1.1 + get-caller-file: ^2.0.5 + require-directory: ^2.1.1 + string-width: ^4.2.3 + y18n: ^5.0.5 + yargs-parser: ^21.1.1 + checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a + languageName: node + linkType: hard + "yargs@npm:^17.1.1": version: 17.6.2 resolution: "yargs@npm:17.6.2" From b15ec9d949f70e7c80323e8bec0fd29c299f1099 Mon Sep 17 00:00:00 2001 From: Luke Shay Date: Sun, 10 Sep 2023 15:06:42 -0500 Subject: [PATCH 02/13] chore: fix merge --- apps/www/src/pages/docs/index.md | 6 +-- .../src/lambda/__tests__/helpers.test.ts | 47 +++++++++---------- packages/adapter/src/lambda/helpers.ts | 17 +++++-- 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/apps/www/src/pages/docs/index.md b/apps/www/src/pages/docs/index.md index aafb75e..f95cf86 100644 --- a/apps/www/src/pages/docs/index.md +++ b/apps/www/src/pages/docs/index.md @@ -87,11 +87,7 @@ import { AstroAWSConstruct } from "@astro-aws/constructs" export interface HelloCdkStackProps extends StackProps {} export class HelloCdkStack extends Stack { - public constructor( - scope: Construct, - id: string, - props: HelloCdkStackProps, - ) { + public constructor(scope: Construct, id: string, props: HelloCdkStackProps) { super(scope, id, props) new AstroAWSConstruct(this, "AstroAWSConstruct", { diff --git a/packages/adapter/src/lambda/__tests__/helpers.test.ts b/packages/adapter/src/lambda/__tests__/helpers.test.ts index c46855a..cc04deb 100644 --- a/packages/adapter/src/lambda/__tests__/helpers.test.ts +++ b/packages/adapter/src/lambda/__tests__/helpers.test.ts @@ -2,11 +2,10 @@ import type { App } from "astro/app" import { beforeEach, describe, expect, test, vi } from "vitest" import { faker } from "@faker-js/faker" -<<<<<<< HEAD -import { createLambdaFunctionResponse, createLambdaEdgeFunctionResponse } from "../helpers.js"; -======= -import { createLambdaFunctionResponse } from "../helpers.js" ->>>>>>> ddb6036 (chore: updated deps) +import { + createLambdaFunctionResponse, + createLambdaEdgeFunctionResponse, +} from "../helpers.js" const knownBinaryMediaTypes = new Set(["image/png", "image/jpeg"]) @@ -50,42 +49,45 @@ describe("helpers", () => { headers, isBase64Encoded: false, statusCode: 200, -<<<<<<< HEAD - }); - }); - }); + }) + }) + }) describe("createLambdaEdgeFunctionResponse", () => { let response: Response, app: App, fnResponse: Awaited>, body: string, - headers: Record; + headers: Record beforeEach(async () => { - body = faker.datatype.string(); + body = faker.datatype.string() headers = { "content-type": "text/plain", - }; + } response = new Response(body, { headers, status: 200, - }); + }) app = { setCookieHeaders: vi.fn(() => [ "newCookie=newValue", "deleteCookie=deleted; Expires=Thu, 01 Jan 1970 00:00:00 GMT", ]), - } as unknown as App; + } as unknown as App - fnResponse = await createLambdaEdgeFunctionResponse(app, response, knownBinaryMediaTypes); - }); + fnResponse = await createLambdaEdgeFunctionResponse( + app, + response, + knownBinaryMediaTypes, + ) + }) test("creates function response", () => { - expect(app.setCookieHeaders).toHaveBeenCalledTimes(1); - expect(app.setCookieHeaders).toHaveBeenCalledWith(response); + expect(app.setCookieHeaders).toHaveBeenCalledTimes(1) + expect(app.setCookieHeaders).toHaveBeenCalledWith(response) expect(fnResponse).toStrictEqual({ body, @@ -104,19 +106,14 @@ describe("helpers", () => { }, { key: "set-cookie", - value: "deleteCookie=deleted; Expires=Thu, 01 Jan 1970 00:00:00 GMT", + value: + "deleteCookie=deleted; Expires=Thu, 01 Jan 1970 00:00:00 GMT", }, ], }, status: "200", statusDescription: "", - }); - }); - }); -}); -======= }) }) }) }) ->>>>>>> ddb6036 (chore: updated deps) diff --git a/packages/adapter/src/lambda/helpers.ts b/packages/adapter/src/lambda/helpers.ts index 5ce5e20..8dceb26 100644 --- a/packages/adapter/src/lambda/helpers.ts +++ b/packages/adapter/src/lambda/helpers.ts @@ -61,14 +61,17 @@ export const createLambdaEdgeFunctionResponse = async ( response: Response, knownBinaryMediaTypes: Set, ): Promise => { - const cookies = [...app.setCookieHeaders(response)]; + const cookies = [...app.setCookieHeaders(response)] const responseHeadersObj = Object.fromEntries(response.headers.entries()) const headers: CloudFrontHeaders = { ...Object.fromEntries( Object.entries(responseHeadersObj) - .filter(([key]) => !DISALLOWED_EDGE_HEADERS.some((reg) => reg.test(key.toLowerCase()))) + .filter( + ([key]) => + !DISALLOWED_EDGE_HEADERS.some((reg) => reg.test(key.toLowerCase())), + ) .map(([key, value]) => [ key.toLowerCase(), [ @@ -85,9 +88,13 @@ export const createLambdaEdgeFunctionResponse = async ( value: cookie, })), }), - }; - const responseContentType = parseContentType(response.headers.get("content-type")); - const bodyEncoding = knownBinaryMediaTypes.has(responseContentType) ? "base64" : "text"; + } + const responseContentType = parseContentType( + response.headers.get("content-type"), + ) + const bodyEncoding = knownBinaryMediaTypes.has(responseContentType) + ? "base64" + : "text" return { body: await response.text(), From 78fdee5aca8a0e7b1955b83e36849515da6eadcd Mon Sep 17 00:00:00 2001 From: Luke Shay Date: Mon, 11 Sep 2023 09:13:23 -0500 Subject: [PATCH 03/13] fixed constraints --- apps/infra/package.json | 6 +- apps/www/package.json | 4 +- package.json | 2 +- packages/adapter/package.json | 6 +- packages/constructs/package.json | 10 +- scripts/package.json | 8 +- yarn.lock | 196 ++++++------------------------- 7 files changed, 54 insertions(+), 178 deletions(-) diff --git a/apps/infra/package.json b/apps/infra/package.json index 140cc7b..ac13135 100644 --- a/apps/infra/package.json +++ b/apps/infra/package.json @@ -34,9 +34,9 @@ "aws-cdk": "^2.94.0", "aws-cdk-lib": "^2.94.0", "constructs": "^10.1.253", - "eslint": "^8.34.0", - "prettier": "^2.8.4", - "typescript": "^4.9.5" + "eslint": "^8.49.0", + "prettier": "^3.0.3", + "typescript": "^5.2.2" }, "devDependencies": { "@astro-aws/scripts": "workspace:^", diff --git a/apps/www/package.json b/apps/www/package.json index be8ddf5..ef97c9c 100644 --- a/apps/www/package.json +++ b/apps/www/package.json @@ -49,8 +49,8 @@ "tailwindcss": "^3.2.7" }, "devDependencies": { - "eslint": "^8.34.0", - "prettier": "^2.8.4" + "eslint": "^8.49.0", + "prettier": "^3.0.3" }, "engines": { "node": "18.x" diff --git a/package.json b/package.json index 2800630..de14858 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "@lshay/eslint-config": "^0.3.5", "@lshay/prettier-config": "^0.6.0", "@rushstack/eslint-patch": "^1.3.3", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-import-resolver-typescript": "^3.6.0", "eslint-plugin-import": "^2.28.1", "prettier": "^3.0.3", diff --git a/packages/adapter/package.json b/packages/adapter/package.json index b99e397..acd7656 100644 --- a/packages/adapter/package.json +++ b/packages/adapter/package.json @@ -58,9 +58,9 @@ "@types/node": "^18.14.0", "astro": "^2.0.14", "aws-lambda": "^1.0.7", - "eslint": "^8.34.0", - "prettier": "^2.8.4", - "typescript": "^4.9.5", + "eslint": "^8.49.0", + "prettier": "^3.0.3", + "typescript": "^5.2.2", "vitest": "^0.28.5" }, "peerDependencies": { diff --git a/packages/constructs/package.json b/packages/constructs/package.json index d476546..7228624 100644 --- a/packages/constructs/package.json +++ b/packages/constructs/package.json @@ -37,14 +37,14 @@ "devDependencies": { "@astro-aws/scripts": "workspace:^", "@types/node": "^18.14.0", - "aws-cdk-lib": "^2.0.0", + "aws-cdk-lib": "^2.94.0", "constructs": "^10.1.253", - "eslint": "^8.34.0", - "prettier": "^2.8.4", - "typescript": "^4.9.5" + "eslint": "^8.49.0", + "prettier": "^3.0.3", + "typescript": "^5.2.2" }, "peerDependencies": { - "aws-cdk-lib": "^2.0.0", + "aws-cdk-lib": "^2.94.0", "constructs": "^10.1.0" }, "engines": { diff --git a/scripts/package.json b/scripts/package.json index 011d34d..175a210 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -34,13 +34,13 @@ "globby": "^13.1.3" }, "devDependencies": { - "eslint": "^8.34.0", - "prettier": "^2.8.4", + "eslint": "^8.49.0", + "prettier": "^3.0.3", "ts-node": "^10.9.1", - "typescript": "^4.9.5" + "typescript": "^5.2.2" }, "peerDependencies": { - "typescript": "^4.9.5" + "typescript": "^5.2.2" }, "engines": { "node": "18.x" diff --git a/yarn.lock b/yarn.lock index bb4c61e..2e70389 100644 --- a/yarn.lock +++ b/yarn.lock @@ -34,10 +34,10 @@ __metadata: astro: ^2.0.14 aws-lambda: ^1.0.7 esbuild: ^0.17.8 - eslint: ^8.34.0 + eslint: ^8.49.0 merge-anything: ^5.1.4 - prettier: ^2.8.4 - typescript: ^4.9.5 + prettier: ^3.0.3 + typescript: ^5.2.2 vitest: ^0.28.5 peerDependencies: astro: ">=1" @@ -50,13 +50,13 @@ __metadata: dependencies: "@astro-aws/scripts": "workspace:^" "@types/node": ^18.14.0 - aws-cdk-lib: ^2.0.0 + aws-cdk-lib: ^2.94.0 constructs: ^10.1.253 - eslint: ^8.34.0 - prettier: ^2.8.4 - typescript: ^4.9.5 + eslint: ^8.49.0 + prettier: ^3.0.3 + typescript: ^5.2.2 peerDependencies: - aws-cdk-lib: ^2.0.0 + aws-cdk-lib: ^2.94.0 constructs: ^10.1.0 languageName: unknown linkType: soft @@ -72,10 +72,10 @@ __metadata: aws-cdk: ^2.94.0 aws-cdk-lib: ^2.94.0 constructs: ^10.1.253 - eslint: ^8.34.0 + eslint: ^8.49.0 eslint-config-get-off-my-lawn: ^7.2.0 - prettier: ^2.8.4 - typescript: ^4.9.5 + prettier: ^3.0.3 + typescript: ^5.2.2 bin: astro-aws-cdk: dist/bin/infra.js languageName: unknown @@ -88,13 +88,13 @@ __metadata: commander: ^10.0.0 cosmiconfig: ^8.0.0 esbuild: ^0.17.8 - eslint: ^8.34.0 + eslint: ^8.49.0 globby: ^13.1.3 - prettier: ^2.8.4 + prettier: ^3.0.3 ts-node: ^10.9.1 - typescript: ^4.9.5 + typescript: ^5.2.2 peerDependencies: - typescript: ^4.9.5 + typescript: ^5.2.2 bin: aac: ./bin.js scripts: ./bin.js @@ -116,9 +116,9 @@ __metadata: autoprefixer: ^10.4.13 classnames: ^2.3.2 daisyui: ^2.50.1 - eslint: ^8.34.0 + eslint: ^8.49.0 postcss: ^8.4.21 - prettier: ^2.8.4 + prettier: ^3.0.3 remark-toc: ^8.0.1 rimraf: ^4.1.2 rollup: ^3.16.0 @@ -1308,23 +1308,6 @@ __metadata: languageName: node linkType: hard -"@eslint/eslintrc@npm:^1.4.1": - version: 1.4.1 - resolution: "@eslint/eslintrc@npm:1.4.1" - dependencies: - ajv: ^6.12.4 - debug: ^4.3.2 - espree: ^9.4.0 - globals: ^13.19.0 - ignore: ^5.2.0 - import-fresh: ^3.2.1 - js-yaml: ^4.1.0 - minimatch: ^3.1.2 - strip-json-comments: ^3.1.1 - checksum: cd3e5a8683db604739938b1c1c8b77927dc04fce3e28e0c88e7f2cd4900b89466baf83dfbad76b2b9e4d2746abdd00dd3f9da544d3e311633d8693f327d04cd7 - languageName: node - linkType: hard - "@eslint/eslintrc@npm:^2.1.2": version: 2.1.2 resolution: "@eslint/eslintrc@npm:2.1.2" @@ -1342,10 +1325,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.48.0": - version: 8.48.0 - resolution: "@eslint/js@npm:8.48.0" - checksum: b2755f9c0ee810c886eba3c50dcacb184ba5a5cd1cbc01988ee506ad7340653cae0bd55f1d95c64b56dfc6d25c2caa7825335ffd2c50165bae9996fe0f396851 +"@eslint/js@npm:8.49.0": + version: 8.49.0 + resolution: "@eslint/js@npm:8.49.0" + checksum: a6601807c8aeeefe866926ad92ed98007c034a735af20ff709009e39ad1337474243d47908500a3bde04e37bfba16bcf1d3452417f962e1345bc8756edd6b830 languageName: node linkType: hard @@ -1379,7 +1362,7 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.10": +"@humanwhocodes/config-array@npm:^0.11.11": version: 0.11.11 resolution: "@humanwhocodes/config-array@npm:0.11.11" dependencies: @@ -1390,17 +1373,6 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.8": - version: 0.11.8 - resolution: "@humanwhocodes/config-array@npm:0.11.8" - dependencies: - "@humanwhocodes/object-schema": ^1.2.1 - debug: ^4.1.1 - minimatch: ^3.0.5 - checksum: 0fd6b3c54f1674ce0a224df09b9c2f9846d20b9e54fabae1281ecfc04f2e6ad69bf19e1d6af6a28f88e8aa3990168b6cb9e1ef755868c3256a630605ec2cb1d3 - languageName: node - linkType: hard - "@humanwhocodes/module-importer@npm:^1.0.1": version: 1.0.1 resolution: "@humanwhocodes/module-importer@npm:1.0.1" @@ -2716,7 +2688,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.10.0, ajv@npm:^6.12.4, ajv@npm:~6.12.6": +"ajv@npm:^6.12.4, ajv@npm:~6.12.6": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -3153,7 +3125,7 @@ __metadata: languageName: node linkType: hard -"aws-cdk-lib@npm:^2.0.0, aws-cdk-lib@npm:^2.94.0": +"aws-cdk-lib@npm:^2.94.0": version: 2.94.0 resolution: "aws-cdk-lib@npm:2.94.0" dependencies: @@ -5625,16 +5597,6 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^7.1.1": - version: 7.1.1 - resolution: "eslint-scope@npm:7.1.1" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^5.2.0 - checksum: 9f6e974ab2db641ca8ab13508c405b7b859e72afe9f254e8131ff154d2f40c99ad4545ce326fd9fde3212ff29707102562a4834f1c48617b35d98c71a97fbf3e - languageName: node - linkType: hard - "eslint-scope@npm:^7.2.2": version: 7.2.2 resolution: "eslint-scope@npm:7.2.2" @@ -5693,64 +5655,15 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8.34.0": - version: 8.34.0 - resolution: "eslint@npm:8.34.0" - dependencies: - "@eslint/eslintrc": ^1.4.1 - "@humanwhocodes/config-array": ^0.11.8 - "@humanwhocodes/module-importer": ^1.0.1 - "@nodelib/fs.walk": ^1.2.8 - ajv: ^6.10.0 - chalk: ^4.0.0 - cross-spawn: ^7.0.2 - debug: ^4.3.2 - doctrine: ^3.0.0 - escape-string-regexp: ^4.0.0 - eslint-scope: ^7.1.1 - eslint-utils: ^3.0.0 - eslint-visitor-keys: ^3.3.0 - espree: ^9.4.0 - esquery: ^1.4.0 - esutils: ^2.0.2 - fast-deep-equal: ^3.1.3 - file-entry-cache: ^6.0.1 - find-up: ^5.0.0 - glob-parent: ^6.0.2 - globals: ^13.19.0 - grapheme-splitter: ^1.0.4 - ignore: ^5.2.0 - import-fresh: ^3.0.0 - imurmurhash: ^0.1.4 - is-glob: ^4.0.0 - is-path-inside: ^3.0.3 - js-sdsl: ^4.1.4 - js-yaml: ^4.1.0 - json-stable-stringify-without-jsonify: ^1.0.1 - levn: ^0.4.1 - lodash.merge: ^4.6.2 - minimatch: ^3.1.2 - natural-compare: ^1.4.0 - optionator: ^0.9.1 - regexpp: ^3.2.0 - strip-ansi: ^6.0.1 - strip-json-comments: ^3.1.0 - text-table: ^0.2.0 - bin: - eslint: bin/eslint.js - checksum: 4e13e9eb05ac2248efbb6acae0b2325091235d5c47ba91a4775c7d6760778cbcd358a773ebd42f4629d2ad89e27c02f5d66eb1f737d75d9f5fc411454f83b2e5 - languageName: node - linkType: hard - -"eslint@npm:^8.48.0": - version: 8.48.0 - resolution: "eslint@npm:8.48.0" +"eslint@npm:^8.49.0": + version: 8.49.0 + resolution: "eslint@npm:8.49.0" dependencies: "@eslint-community/eslint-utils": ^4.2.0 "@eslint-community/regexpp": ^4.6.1 "@eslint/eslintrc": ^2.1.2 - "@eslint/js": 8.48.0 - "@humanwhocodes/config-array": ^0.11.10 + "@eslint/js": 8.49.0 + "@humanwhocodes/config-array": ^0.11.11 "@humanwhocodes/module-importer": ^1.0.1 "@nodelib/fs.walk": ^1.2.8 ajv: ^6.12.4 @@ -5785,11 +5698,11 @@ __metadata: text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: f20b359a4f8123fec5c033577368cc020d42978b1b45303974acd8da7a27063168ee3fe297ab5b35327162f6a93154063e3ce6577102f70f9809aff793db9bd0 + checksum: 4dfe257e1e42da2f9da872b05aaaf99b0f5aa022c1a91eee8f2af1ab72651b596366320c575ccd4e0469f7b4c97aff5bb85ae3323ebd6a293c3faef4028b0d81 languageName: node linkType: hard -"espree@npm:^9.0.0, espree@npm:^9.4.0": +"espree@npm:^9.0.0": version: 9.4.1 resolution: "espree@npm:9.4.1" dependencies: @@ -6908,7 +6821,7 @@ __metadata: languageName: node linkType: hard -"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": +"import-fresh@npm:^3.2.1": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" dependencies: @@ -7530,13 +7443,6 @@ __metadata: languageName: node linkType: hard -"js-sdsl@npm:^4.1.4": - version: 4.3.0 - resolution: "js-sdsl@npm:4.3.0" - checksum: ce908257cf6909e213af580af3a691a736f5ee8b16315454768f917a682a4ea0c11bde1b241bbfaecedc0eb67b72101b2c2df2ffaed32aed5d539fca816f054e - languageName: node - linkType: hard - "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -9358,20 +9264,6 @@ __metadata: languageName: node linkType: hard -"optionator@npm:^0.9.1": - version: 0.9.1 - resolution: "optionator@npm:0.9.1" - dependencies: - deep-is: ^0.1.3 - fast-levenshtein: ^2.0.6 - levn: ^0.4.1 - prelude-ls: ^1.2.1 - type-check: ^0.4.0 - word-wrap: ^1.2.3 - checksum: dbc6fa065604b24ea57d734261914e697bd73b69eff7f18e967e8912aa2a40a19a9f599a507fa805be6c13c24c4eae8c71306c239d517d42d4c041c942f508a0 - languageName: node - linkType: hard - "optionator@npm:^0.9.3": version: 0.9.3 resolution: "optionator@npm:0.9.3" @@ -9916,15 +9808,6 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^2.8.4": - version: 2.8.4 - resolution: "prettier@npm:2.8.4" - bin: - prettier: bin-prettier.js - checksum: c173064bf3df57b6d93d19aa98753b9b9dd7657212e33b41ada8e2e9f9884066bb9ca0b4005b89b3ab137efffdf8fbe0b462785aba20364798ff4303aadda57e - languageName: node - linkType: hard - "prettier@npm:^3.0.0, prettier@npm:^3.0.3": version: 3.0.3 resolution: "prettier@npm:3.0.3" @@ -10662,7 +10545,7 @@ __metadata: "@lshay/eslint-config": ^0.3.5 "@lshay/prettier-config": ^0.6.0 "@rushstack/eslint-patch": ^1.3.3 - eslint: ^8.48.0 + eslint: ^8.49.0 eslint-import-resolver-typescript: ^3.6.0 eslint-plugin-import: ^2.28.1 prettier: ^3.0.3 @@ -11397,7 +11280,7 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": +"strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 @@ -12022,7 +11905,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:*, typescript@npm:^4.9.5": +"typescript@npm:*": version: 4.9.5 resolution: "typescript@npm:4.9.5" bin: @@ -12052,7 +11935,7 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@*#~builtin, typescript@patch:typescript@^4.9.5#~builtin": +"typescript@patch:typescript@*#~builtin": version: 4.9.5 resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=23ec76" bin: @@ -12850,13 +12733,6 @@ __metadata: languageName: node linkType: hard -"word-wrap@npm:^1.2.3": - version: 1.2.3 - resolution: "word-wrap@npm:1.2.3" - checksum: 30b48f91fcf12106ed3186ae4fa86a6a1842416df425be7b60485de14bec665a54a68e4b5156647dec3a70f25e84d270ca8bc8cd23182ed095f5c7206a938c1f - languageName: node - linkType: hard - "wrap-ansi@npm:^6.2.0": version: 6.2.0 resolution: "wrap-ansi@npm:6.2.0" From f435d0dca4a92bebe29ed7692741496d0be59c19 Mon Sep 17 00:00:00 2001 From: Luke Shay Date: Mon, 11 Sep 2023 19:10:32 -0500 Subject: [PATCH 04/13] starlight --- .tool-versions | 2 +- apps/docs/.gitignore | 21 + apps/docs/README.md | 51 + apps/docs/astro.config.ts | 40 + apps/docs/package.json | 46 + apps/docs/public/favicon.svg | 1 + apps/docs/scripts/copy-package-readmes.sh | 39 + apps/docs/src/assets/architecture-diagram.png | Bin 0 -> 272809 bytes apps/docs/src/assets/astro-aws.jpg | Bin 0 -> 106516 bytes apps/docs/src/assets/astro-aws.png | Bin 0 -> 1259940 bytes apps/docs/src/assets/astro-aws.webp | Bin 0 -> 12498 bytes apps/docs/src/assets/houston.webp | Bin 0 -> 98506 bytes apps/docs/src/content/config.ts | 7 + .../content/docs/guides/01-getting-started.md | 99 + apps/docs/src/content/docs/index.mdx | 20 + .../content/docs/reference/architecture.md | 15 + .../docs/reference/packages/adapter.md | 54 + .../docs/reference/packages/constructs.md | 154 ++ apps/docs/src/env.d.ts | 2 + apps/docs/src/styles/base.css | 29 + apps/docs/tsconfig.json | 3 + apps/infra/package.json | 1 + apps/infra/src/lib/stacks/website-stack.ts | 2 +- yarn.lock | 2218 ++++++++++++++++- 24 files changed, 2696 insertions(+), 108 deletions(-) create mode 100644 apps/docs/.gitignore create mode 100644 apps/docs/README.md create mode 100644 apps/docs/astro.config.ts create mode 100644 apps/docs/package.json create mode 100644 apps/docs/public/favicon.svg create mode 100755 apps/docs/scripts/copy-package-readmes.sh create mode 100644 apps/docs/src/assets/architecture-diagram.png create mode 100644 apps/docs/src/assets/astro-aws.jpg create mode 100644 apps/docs/src/assets/astro-aws.png create mode 100644 apps/docs/src/assets/astro-aws.webp create mode 100644 apps/docs/src/assets/houston.webp create mode 100644 apps/docs/src/content/config.ts create mode 100644 apps/docs/src/content/docs/guides/01-getting-started.md create mode 100644 apps/docs/src/content/docs/index.mdx create mode 100644 apps/docs/src/content/docs/reference/architecture.md create mode 100644 apps/docs/src/content/docs/reference/packages/adapter.md create mode 100644 apps/docs/src/content/docs/reference/packages/constructs.md create mode 100644 apps/docs/src/env.d.ts create mode 100644 apps/docs/src/styles/base.css create mode 100644 apps/docs/tsconfig.json diff --git a/.tool-versions b/.tool-versions index 0d92f6b..b20a880 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1 @@ -nodejs 18.12.1 \ No newline at end of file +nodejs 18.14.1 \ No newline at end of file diff --git a/apps/docs/.gitignore b/apps/docs/.gitignore new file mode 100644 index 0000000..6240da8 --- /dev/null +++ b/apps/docs/.gitignore @@ -0,0 +1,21 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store diff --git a/apps/docs/README.md b/apps/docs/README.md new file mode 100644 index 0000000..37dfc32 --- /dev/null +++ b/apps/docs/README.md @@ -0,0 +1,51 @@ +# Starlight Starter Kit: Basics + +``` +npm create astro@latest -- --template starlight +``` + +[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/starlight/tree/main/examples/basics) +[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/starlight/tree/main/examples/basics) + +> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! + +## 🚀 Project Structure + +Inside of your Astro + Starlight project, you'll see the following folders and files: + +``` +. +├── public/ +├── src/ +│ ├── assets/ +│ ├── content/ +│ │ ├── docs/ +│ │ └── config.ts +│ └── env.d.ts +├── astro.config.mjs +├── package.json +└── tsconfig.json +``` + +Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory. Each file is exposed as a route based on its file name. + +Images can be added to `src/assets/` and embedded in Markdown with a relative link. + +Static assets, like favicons, can be placed in the `public/` directory. + +## 🧞 Commands + +All commands are run from the root of the project, from a terminal: + +| Command | Action | +| :------------------------ | :----------------------------------------------- | +| `npm install` | Installs dependencies | +| `npm run dev` | Starts local dev server at `localhost:4321` | +| `npm run build` | Build your production site to `./dist/` | +| `npm run preview` | Preview your build locally, before deploying | +| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | +| `npm run astro -- --help` | Get help using the Astro CLI | + +## 👀 Want to learn more? + +Check out [Starlight’s docs](https://starlight.astro.build/), read [the Astro documentation](https://docs.astro.build), or jump into the [Astro Discord server](https://astro.build/chat). diff --git a/apps/docs/astro.config.ts b/apps/docs/astro.config.ts new file mode 100644 index 0000000..5b00351 --- /dev/null +++ b/apps/docs/astro.config.ts @@ -0,0 +1,40 @@ +import { defineConfig } from "astro/config" +import starlight from "@astrojs/starlight" +import aws from "@astro-aws/adapter" + +const isSSR = process.env.SSR_BUILD === "true" + +// https://astro.build/config +export default defineConfig({ + adapter: isSSR + ? aws({ + logFnRequest: true, + logFnResponse: true, + }) + : undefined, + integrations: [ + starlight({ + customCss: ["./src/styles/base.css"], + title: "Astro AWS", + tagline: "AWS CDK constructs for Astro", + social: { + github: "https://github.com/lukeshay/astro-aws", + }, + sidebar: [ + { + autogenerate: { + directory: "guides" }, + label: "Guides", + }, + { + autogenerate: { + directory: "reference" }, + label: "Reference", + }, + ], + }), + ], + outDir: isSSR ? "dist/server" : "dist/static", + output: isSSR ? "server" : "static", + site: `https://astro-aws.org/`, +}) diff --git a/apps/docs/package.json b/apps/docs/package.json new file mode 100644 index 0000000..af3f35b --- /dev/null +++ b/apps/docs/package.json @@ -0,0 +1,46 @@ +{ + "name": "@astro-aws/docs", + "version": "0.0.0", + "private": true, + "homepage": "https://astro-aws.org/", + "repository": { + "type": "git", + "url": "ssh://git@github.com/lukeshay/astro-aws.git", + "directory": "apps/www" + }, + "license": "MIT", + "type": "module", + "files": [ + "dist/lambda" + ], + "eslintConfig": { + "extends": [ + "../../.eslintrc.cjs" + ], + "root": false + }, + "scripts": { + "astro": "astro", + "build": "yarn clean && ./scripts/copy-package-readmes.sh && astro build && SSR_BUILD=true astro build", + "check": "astro check && tsc", + "clean": "rimraf dist", + "dev": "astro dev", + "preview": "astro preview", + "release": "yarn build && yarn package", + "start": "astro dev" + }, + "dependencies": { + "@astrojs/starlight": "^0.9.1", + "astro": "^3.0.6", + "sharp": "^0.32.5" + }, + "devDependencies": { + "@astro-aws/adapter": "workspace:^", + "eslint": "^8.49.0", + "prettier": "^3.0.3", + "rimraf": "^5.0.1" + }, + "engines": { + "node": "18.x" + } +} diff --git a/apps/docs/public/favicon.svg b/apps/docs/public/favicon.svg new file mode 100644 index 0000000..cba5ac1 --- /dev/null +++ b/apps/docs/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/docs/scripts/copy-package-readmes.sh b/apps/docs/scripts/copy-package-readmes.sh new file mode 100755 index 0000000..b94fbe0 --- /dev/null +++ b/apps/docs/scripts/copy-package-readmes.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +set -e + +create_frontmatter() { + NAME="${1}" + + echo "---" + echo "title: \"@astro-aws/${NAME}\"" + echo "description: \"NPM package @astro-aws/${NAME}\"" + echo "---" + echo "" +} + +create_more() { + echo "## More" + echo "" + echo "For more information, see the [documentation website](https://astro-aws.org/)" +} + +copy_readme() { + NAME="${1}" + + README_FILE="../../packages/${NAME}/README.md" + DOCS_FILE="./src/content/docs/reference/packages/${NAME}.md" + + if [ -f "${README_FILE}" ]; then + echo "Copying README for ${NAME}..." + + create_frontmatter "${NAME}" > "${DOCS_FILE}" + cat "${README_FILE}" | grep -v "# @astro-aws" >> "${DOCS_FILE}" + create_more >> "${DOCS_FILE}" + fi +} + +mkdir -p src/content/docs/reference/packages + +copy_readme "adapter" +copy_readme "constructs" diff --git a/apps/docs/src/assets/architecture-diagram.png b/apps/docs/src/assets/architecture-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..eb6b77ac66fef0b69c1af328f7df636bb44a2724 GIT binary patch literal 272809 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

>Bh=hW=^v;zAQR2z_gf8 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

-#GMQ9&HVy`a#+XVTm~bN--SJsjC)_1RWhH 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 wk}P}At@rOe6Py_2Qw+>$1g)rIJuyK( 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ΝOjIxMF48}E1R{TQX=CQKX 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