@aws/nx-plugin 1.0.0-rc.96 → 1.0.0-rc.98
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE-THIRD-PARTY +9 -9
- package/migrations.json +124 -84
- package/package.json +3 -3
- package/src/agentcore-gateway/__snapshots__/generator.spec.ts.snap +2 -2
- package/src/agentcore-gateway/generator.js +6 -0
- package/src/agentcore-gateway/generator.js.map +1 -1
- package/src/agentcore-gateway/react-connection/__snapshots__/generator.spec.ts.snap +4 -1
- package/src/agentcore-harness/__snapshots__/generator.spec.ts.snap +68 -4
- package/src/agentcore-harness/generator.js +6 -0
- package/src/agentcore-harness/generator.js.map +1 -1
- package/src/connection/gateway-runtime-config.js +1 -1
- package/src/connection/gateway-runtime-config.js.map +1 -1
- package/src/infra/app/__snapshots__/generator.spec.ts.snap +10 -10
- package/src/infra/app/generator.js +39 -9
- package/src/infra/app/generator.js.map +1 -1
- package/src/init/generator.d.ts +1 -1
- package/src/init/generator.js +8 -6
- package/src/init/generator.js.map +1 -1
- package/src/init/schema.d.js.map +1 -1
- package/src/init/schema.d.ts +1 -0
- package/src/init/schema.json +5 -0
- package/src/internal/test-matrix/generator.js +2 -2
- package/src/internal/test-matrix/generator.js.map +1 -1
- package/src/license/sync/generator.d.ts +10 -0
- package/src/license/sync/generator.js +1 -1
- package/src/license/sync/generator.js.map +1 -1
- package/src/mcp-server/server.js +2 -0
- package/src/mcp-server/server.js.map +1 -1
- package/src/mcp-server/tools/best-practices.d.ts +28 -0
- package/src/mcp-server/tools/best-practices.js +43 -0
- package/src/mcp-server/tools/best-practices.js.map +1 -0
- package/src/mcp-server/tools/general-guidance.d.ts +1 -1
- package/src/mcp-server/tools/general-guidance.js +13 -4
- package/src/mcp-server/tools/general-guidance.js.map +1 -1
- package/src/migrations/latest/sandbox-pattern-nested-stacks/metadata.json +3 -0
- package/src/migrations/latest/sandbox-pattern-nested-stacks/migration.js +68 -0
- package/src/migrations/latest/sandbox-pattern-nested-stacks/migration.js.map +1 -0
- package/src/migrations/latest/shadcn-cn-package/metadata.json +3 -0
- package/src/migrations/latest/shadcn-cn-package/migration.js +114 -0
- package/src/migrations/latest/shadcn-cn-package/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.90/0001-dev-target-depends-on-pull-image/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.90/0002-open-api-codegen-executor/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.90/0003-terraform-provider-plugin-cache/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.90/0004-python-test-input-scoping/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.90/0005-vitest-coverage-output-dir/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.90/0006-add-assemble-target/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.90/0007-docker-target-cache-soundness/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.90/0008-declare-cacheable-target-inputs/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.90/0009-terraform-fmt-check/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.92/0001-react-website-unique-dev-ports/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.94/0001-infra-deploy-express-mode/metadata.json +3 -0
- package/src/migrations/{latest/infra-deploy-express-mode → v1.0.0-rc.94/0001-infra-deploy-express-mode}/migration.js +26 -28
- package/src/migrations/v1.0.0-rc.94/0001-infra-deploy-express-mode/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.94/0002-shx-fs-commands/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.94/0003-agent-core-vendor-target/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.95/0001-rolldown-config-bundle-transient/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.95/0001-rolldown-config-bundle-transient/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.95/0002-agent-connection-pin-strands-peers/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.95/0003-ignore-package-manager-temp-files/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.95/0004-shadcn-package-imports-exports/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.95/0004-shadcn-package-imports-exports/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.97/0001-gateway-url-accessor/__snapshots__/migration.spec.ts.snap +84 -0
- package/src/migrations/v1.0.0-rc.97/0001-gateway-url-accessor/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.97/0001-gateway-url-accessor/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.97/0001-gateway-url-accessor/migration.js +94 -0
- package/src/migrations/v1.0.0-rc.97/0001-gateway-url-accessor/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.97/0002-checkov-scan-cache-inputs/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.97/0002-checkov-scan-cache-inputs/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.97/0002-checkov-scan-cache-inputs/migration.js +58 -0
- package/src/migrations/v1.0.0-rc.97/0002-checkov-scan-cache-inputs/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.97/0003-terraform-validate-without-backend/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.97/0003-terraform-validate-without-backend/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.97/0003-terraform-validate-without-backend/migration.js +84 -0
- package/src/migrations/v1.0.0-rc.97/0003-terraform-validate-without-backend/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.97/0004-py-lambda-powertools-context/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.97/0004-py-lambda-powertools-context/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.97/0004-py-lambda-powertools-context/migration.js +58 -0
- package/src/migrations/v1.0.0-rc.97/0004-py-lambda-powertools-context/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.97/0005-smithy-extension-trait-aliases/__snapshots__/migration.spec.ts.snap +25 -0
- package/src/migrations/v1.0.0-rc.97/0005-smithy-extension-trait-aliases/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.97/0005-smithy-extension-trait-aliases/migration.d.ts +28 -0
- package/src/migrations/v1.0.0-rc.97/0005-smithy-extension-trait-aliases/migration.js +75 -0
- package/src/migrations/v1.0.0-rc.97/0005-smithy-extension-trait-aliases/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.97/0006-script-project-quality-gates/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.97/0006-script-project-quality-gates/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.97/0006-script-project-quality-gates/migration.js +53 -0
- package/src/migrations/v1.0.0-rc.97/0006-script-project-quality-gates/migration.js.map +1 -0
- package/src/preset/__snapshots__/generator.spec.ts.snap +2 -2
- package/src/preset/generator.js +4 -25
- package/src/preset/generator.js.map +1 -1
- package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +2 -2
- package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +4 -4
- package/src/py/agent/__snapshots__/generator.protocols.spec.ts.snap +4 -4
- package/src/py/agent/a2a-connection/generator.d.ts +1 -1
- package/src/py/agent/gateway-connection/generator.d.ts +1 -1
- package/src/py/agent/mcp-connection/generator.d.ts +1 -1
- package/src/py/agent/react-connection/__snapshots__/generator.spec.ts.snap +4 -1
- package/src/py/agent/react-connection/generator.d.ts +1 -7
- package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +10 -12
- package/src/py/dynamodb/generator.js +34 -7
- package/src/py/dynamodb/generator.js.map +1 -1
- package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +12 -12
- package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +4 -3
- package/src/py/lambda-function/files/handler/__lambdaFunctionSnakeCase__.py.template +2 -1
- package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +3 -3
- package/src/py/project/schema.json +3 -1
- package/src/py/rdb/__snapshots__/generator.spec.ts.snap +31 -15
- package/src/py/rdb/files/Dockerfile.create-db-user.template +7 -3
- package/src/py/rdb/files/Dockerfile.migration.template +7 -3
- package/src/py/rdb/generator.js +29 -28
- package/src/py/rdb/generator.js.map +1 -1
- package/src/smithy/project/__snapshots__/generator.spec.ts.snap +5 -5
- package/src/smithy/react-connection/files/model/extensions.smithy.template +3 -3
- package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +8 -8
- package/src/smithy/ts/api/generator.js +7 -2
- package/src/smithy/ts/api/generator.js.map +1 -1
- package/src/terraform/project/generator.js +34 -10
- package/src/terraform/project/generator.js.map +1 -1
- package/src/terraform/project/schema.d.js +0 -3
- package/src/terraform/project/schema.d.js.map +1 -1
- package/src/terraform/project/schema.d.ts +0 -4
- package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +12 -12
- package/src/trpc/backend/generator.js +7 -1
- package/src/trpc/backend/generator.js.map +1 -1
- package/src/trpc/react/generator.js +6 -0
- package/src/trpc/react/generator.js.map +1 -1
- package/src/ts/agent/__snapshots__/generator.spec.ts.snap +4 -4
- package/src/ts/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +2 -2
- package/src/ts/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +2 -2
- package/src/ts/agent/generator.js +3 -3
- package/src/ts/agent/generator.js.map +1 -1
- package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +2 -2
- package/src/ts/agent/react-connection/generator.d.ts +1 -9
- package/src/ts/astro-docs/files/translation/scripts/translate.ts.template +47 -2
- package/src/ts/dcr-proxy/__snapshots__/generator.spec.ts.snap +1 -1
- package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +6 -4
- package/src/ts/dynamodb/generator.js +30 -6
- package/src/ts/dynamodb/generator.js.map +1 -1
- package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +2 -2
- package/src/ts/lib/biome.d.ts +15 -1
- package/src/ts/lib/biome.js +79 -63
- package/src/ts/lib/biome.js.map +1 -1
- package/src/ts/lib/generator.js +11 -7
- package/src/ts/lib/generator.js.map +1 -1
- package/src/ts/lib/ts-project-utils.d.ts +14 -0
- package/src/ts/lib/ts-project-utils.js +24 -0
- package/src/ts/lib/ts-project-utils.js.map +1 -1
- package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +3 -3
- package/src/ts/mcp-server/files/app/http.ts.template +1 -1
- package/src/ts/mcp-server/generator.js +3 -3
- package/src/ts/mcp-server/generator.js.map +1 -1
- package/src/ts/nx-generator/__snapshots__/generator.spec.ts.snap +2 -2
- package/src/ts/nx-generator/files/local/generator.spec.ts.template +2 -2
- package/src/ts/nx-migration/generator.js +3 -1
- package/src/ts/nx-migration/generator.js.map +1 -1
- package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +1 -25
- package/src/ts/nx-plugin/generator.js +19 -17
- package/src/ts/nx-plugin/generator.js.map +1 -1
- package/src/ts/nx-plugin/utils.d.ts +21 -0
- package/src/ts/nx-plugin/utils.js +41 -1
- package/src/ts/nx-plugin/utils.js.map +1 -1
- package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +13 -8
- package/src/ts/rdb/files/Dockerfile.template +5 -0
- package/src/ts/rdb/generator.d.ts +8 -0
- package/src/ts/rdb/generator.js +28 -24
- package/src/ts/rdb/generator.js.map +1 -1
- package/src/ts/rdb/trpc-connection/__snapshots__/generator.spec.ts.snap +39 -0
- package/src/ts/rdb/trpc-connection/generator.js +13 -0
- package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
- package/src/ts/react-website/agui/files/common/src/components/__agentNameKebabCase__-chat.tsx.template +9 -0
- package/src/ts/react-website/agui/files/common/src/hooks/useAgui__agentNameClassName__.tsx.template +4 -1
- package/src/ts/react-website/agui/generator.d.ts +1 -5
- package/src/ts/react-website/agui/generator.js +6 -2
- package/src/ts/react-website/agui/generator.js.map +1 -1
- package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +26 -26
- package/src/ts/react-website/app/generator.d.ts +1 -5
- package/src/ts/react-website/app/generator.js +3 -8
- package/src/ts/react-website/app/generator.js.map +1 -1
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +2 -2
- package/src/utils/agent-connection/agent-connection.d.ts +2 -1
- package/src/utils/agent-connection/agent-connection.js +6 -1
- package/src/utils/agent-connection/agent-connection.js.map +1 -1
- package/src/utils/agent-core-constructs/files/cdk/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.ts.template +11 -7
- package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/agentcore-gateway.ts.template +14 -6
- package/src/utils/agent-core-packaging.js +5 -5
- package/src/utils/agent-core-packaging.js.map +1 -1
- package/src/utils/api-constructs/api-constructs.d.ts +5 -0
- package/src/utils/api-constructs/api-constructs.js +8 -0
- package/src/utils/api-constructs/api-constructs.js.map +1 -1
- package/src/utils/api-constructs/files/cdk/app/apis/http/__apiNameKebabCase__.ts.template +4 -2
- package/src/utils/api-constructs/files/cdk/app/apis/rest/__apiNameKebabCase__.ts.template +4 -2
- package/src/utils/ast.d.ts +10 -0
- package/src/utils/ast.js +87 -15
- package/src/utils/ast.js.map +1 -1
- package/src/utils/dependencies.d.ts +10 -0
- package/src/utils/dependencies.js +93 -1
- package/src/utils/dependencies.js.map +1 -1
- package/src/utils/docker.d.ts +11 -0
- package/src/utils/docker.js +16 -3
- package/src/utils/docker.js.map +1 -1
- package/src/utils/dynamodb-config.d.ts +48 -0
- package/src/utils/dynamodb-config.js +44 -0
- package/src/utils/dynamodb-config.js.map +1 -0
- package/src/utils/dynamodb-constructs/files/cdk/app/dynamodb/__nameKebabCase__.ts.template +8 -4
- package/src/utils/files/common/shadcn/src/components/ui/alert.tsx.template +1 -2
- package/src/utils/files/common/shadcn/src/components/ui/avatar.tsx.template +1 -2
- package/src/utils/files/common/shadcn/src/components/ui/breadcrumb.tsx.template +1 -2
- package/src/utils/files/common/shadcn/src/components/ui/button.tsx.template +1 -2
- package/src/utils/files/common/shadcn/src/components/ui/card.tsx.template +1 -2
- package/src/utils/files/common/shadcn/src/components/ui/input.tsx.template +1 -2
- package/src/utils/files/common/shadcn/src/components/ui/separator.tsx.template +1 -2
- package/src/utils/files/common/shadcn/src/components/ui/sheet.tsx.template +1 -2
- package/src/utils/files/common/shadcn/src/components/ui/sidebar.tsx.template +1 -1
- package/src/utils/files/common/shadcn/src/components/ui/skeleton.tsx.template +1 -1
- package/src/utils/files/common/shadcn/src/components/ui/spinner.tsx.template +1 -2
- package/src/utils/files/common/shadcn/src/components/ui/textarea.tsx.template +1 -2
- package/src/utils/files/common/shadcn/src/components/ui/tooltip.tsx.template +1 -2
- package/src/utils/files/common/shadcn/src/lib/utils.ts.template +1 -6
- package/src/utils/git-secrets.d.ts +28 -0
- package/src/utils/git-secrets.js +66 -0
- package/src/utils/git-secrets.js.map +1 -0
- package/src/utils/init.js +7 -6
- package/src/utils/init.js.map +1 -1
- package/src/utils/local-project-dependency.d.ts +28 -0
- package/src/utils/local-project-dependency.js +40 -0
- package/src/utils/local-project-dependency.js.map +1 -0
- package/src/utils/nx.d.ts +14 -0
- package/src/utils/nx.js +30 -0
- package/src/utils/nx.js.map +1 -1
- package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +11 -6
- package/src/utils/script-project-targets.d.ts +26 -0
- package/src/utils/script-project-targets.js +75 -0
- package/src/utils/script-project-targets.js.map +1 -0
- package/src/utils/shared-shadcn.d.ts +1 -3
- package/src/utils/shared-shadcn.js +1 -4
- package/src/utils/shared-shadcn.js.map +1 -1
- package/src/utils/versions.d.ts +52 -50
- package/src/utils/versions.js +55 -49
- package/src/utils/versions.js.map +1 -1
- package/src/utils/website-constructs/files/cdk/app/static-websites/__websiteNameKebabCase__.ts.template +8 -4
- package/src/migrations/latest/add-assemble-target/migration.js.map +0 -1
- package/src/migrations/latest/agent-connection-pin-strands-peers/migration.js.map +0 -1
- package/src/migrations/latest/agent-core-vendor-target/migration.js.map +0 -1
- package/src/migrations/latest/declare-cacheable-target-inputs/migration.js.map +0 -1
- package/src/migrations/latest/dev-target-depends-on-pull-image/migration.js.map +0 -1
- package/src/migrations/latest/docker-target-cache-soundness/migration.js.map +0 -1
- package/src/migrations/latest/ignore-package-manager-temp-files/migration.js.map +0 -1
- package/src/migrations/latest/infra-deploy-express-mode/metadata.json +0 -3
- package/src/migrations/latest/infra-deploy-express-mode/migration.js.map +0 -1
- package/src/migrations/latest/open-api-codegen-executor/migration.js.map +0 -1
- package/src/migrations/latest/python-test-input-scoping/migration.js.map +0 -1
- package/src/migrations/latest/react-website-unique-dev-ports/migration.js.map +0 -1
- package/src/migrations/latest/rolldown-config-bundle-transient/migration.js.map +0 -1
- package/src/migrations/latest/shadcn-package-imports-exports/migration.js.map +0 -1
- package/src/migrations/latest/shx-fs-commands/migration.js.map +0 -1
- package/src/migrations/latest/terraform-fmt-check/migration.js.map +0 -1
- package/src/migrations/latest/terraform-provider-plugin-cache/migration.js.map +0 -1
- package/src/migrations/latest/vitest-coverage-output-dir/migration.js.map +0 -1
- package/src/py/dynamodb/files/__name__/__init__.py.template +0 -6
- package/src/py/dynamodb/files/__name__/entities/__init__.py.template +0 -4
- package/src/py/dynamodb/files/config.json.template +0 -24
- package/src/ts/dynamodb/files/config.json.template +0 -24
- package/src/ts/dynamodb/files/src/entities/index.ts.template +0 -1
- package/src/ts/dynamodb/files/src/index.ts.template +0 -2
- /package/src/migrations/latest/{add-assemble-target → sandbox-pattern-nested-stacks}/migration.d.ts +0 -0
- /package/src/migrations/latest/{agent-core-vendor-target → shadcn-cn-package}/migration.d.ts +0 -0
- /package/src/migrations/{latest/dev-target-depends-on-pull-image → v1.0.0-rc.90/0001-dev-target-depends-on-pull-image}/metadata.json +0 -0
- /package/src/migrations/{latest/declare-cacheable-target-inputs → v1.0.0-rc.90/0001-dev-target-depends-on-pull-image}/migration.d.ts +0 -0
- /package/src/migrations/{latest/dev-target-depends-on-pull-image → v1.0.0-rc.90/0001-dev-target-depends-on-pull-image}/migration.js +0 -0
- /package/src/migrations/{latest/open-api-codegen-executor → v1.0.0-rc.90/0002-open-api-codegen-executor}/metadata.json +0 -0
- /package/src/migrations/{latest/dev-target-depends-on-pull-image → v1.0.0-rc.90/0002-open-api-codegen-executor}/migration.d.ts +0 -0
- /package/src/migrations/{latest/open-api-codegen-executor → v1.0.0-rc.90/0002-open-api-codegen-executor}/migration.js +0 -0
- /package/src/migrations/{latest/terraform-provider-plugin-cache → v1.0.0-rc.90/0003-terraform-provider-plugin-cache}/metadata.json +0 -0
- /package/src/migrations/{latest/docker-target-cache-soundness → v1.0.0-rc.90/0003-terraform-provider-plugin-cache}/migration.d.ts +0 -0
- /package/src/migrations/{latest/terraform-provider-plugin-cache → v1.0.0-rc.90/0003-terraform-provider-plugin-cache}/migration.js +0 -0
- /package/src/migrations/{latest/python-test-input-scoping → v1.0.0-rc.90/0004-python-test-input-scoping}/metadata.json +0 -0
- /package/src/migrations/{latest/infra-deploy-express-mode → v1.0.0-rc.90/0004-python-test-input-scoping}/migration.d.ts +0 -0
- /package/src/migrations/{latest/python-test-input-scoping → v1.0.0-rc.90/0004-python-test-input-scoping}/migration.js +0 -0
- /package/src/migrations/{latest/vitest-coverage-output-dir → v1.0.0-rc.90/0005-vitest-coverage-output-dir}/metadata.json +0 -0
- /package/src/migrations/{latest/open-api-codegen-executor → v1.0.0-rc.90/0005-vitest-coverage-output-dir}/migration.d.ts +0 -0
- /package/src/migrations/{latest/vitest-coverage-output-dir → v1.0.0-rc.90/0005-vitest-coverage-output-dir}/migration.js +0 -0
- /package/src/migrations/{latest/add-assemble-target → v1.0.0-rc.90/0006-add-assemble-target}/metadata.json +0 -0
- /package/src/migrations/{latest/python-test-input-scoping → v1.0.0-rc.90/0006-add-assemble-target}/migration.d.ts +0 -0
- /package/src/migrations/{latest/add-assemble-target → v1.0.0-rc.90/0006-add-assemble-target}/migration.js +0 -0
- /package/src/migrations/{latest/docker-target-cache-soundness → v1.0.0-rc.90/0007-docker-target-cache-soundness}/metadata.json +0 -0
- /package/src/migrations/{latest/react-website-unique-dev-ports → v1.0.0-rc.90/0007-docker-target-cache-soundness}/migration.d.ts +0 -0
- /package/src/migrations/{latest/docker-target-cache-soundness → v1.0.0-rc.90/0007-docker-target-cache-soundness}/migration.js +0 -0
- /package/src/migrations/{latest/declare-cacheable-target-inputs → v1.0.0-rc.90/0008-declare-cacheable-target-inputs}/metadata.json +0 -0
- /package/src/migrations/{latest/rolldown-config-bundle-transient → v1.0.0-rc.90/0008-declare-cacheable-target-inputs}/migration.d.ts +0 -0
- /package/src/migrations/{latest/declare-cacheable-target-inputs → v1.0.0-rc.90/0008-declare-cacheable-target-inputs}/migration.js +0 -0
- /package/src/migrations/{latest/terraform-fmt-check → v1.0.0-rc.90/0009-terraform-fmt-check}/metadata.json +0 -0
- /package/src/migrations/{latest/shadcn-package-imports-exports → v1.0.0-rc.90/0009-terraform-fmt-check}/migration.d.ts +0 -0
- /package/src/migrations/{latest/terraform-fmt-check → v1.0.0-rc.90/0009-terraform-fmt-check}/migration.js +0 -0
- /package/src/migrations/{latest/react-website-unique-dev-ports → v1.0.0-rc.92/0001-react-website-unique-dev-ports}/metadata.json +0 -0
- /package/src/migrations/{latest/shx-fs-commands → v1.0.0-rc.92/0001-react-website-unique-dev-ports}/migration.d.ts +0 -0
- /package/src/migrations/{latest/react-website-unique-dev-ports → v1.0.0-rc.92/0001-react-website-unique-dev-ports}/migration.js +0 -0
- /package/src/migrations/{latest/terraform-fmt-check → v1.0.0-rc.94/0001-infra-deploy-express-mode}/migration.d.ts +0 -0
- /package/src/migrations/{latest/shx-fs-commands → v1.0.0-rc.94/0002-shx-fs-commands}/metadata.json +0 -0
- /package/src/migrations/{latest/terraform-provider-plugin-cache → v1.0.0-rc.94/0002-shx-fs-commands}/migration.d.ts +0 -0
- /package/src/migrations/{latest/shx-fs-commands → v1.0.0-rc.94/0002-shx-fs-commands}/migration.js +0 -0
- /package/src/migrations/{latest/agent-core-vendor-target → v1.0.0-rc.94/0003-agent-core-vendor-target}/metadata.json +0 -0
- /package/src/migrations/{latest/vitest-coverage-output-dir → v1.0.0-rc.94/0003-agent-core-vendor-target}/migration.d.ts +0 -0
- /package/src/migrations/{latest/agent-core-vendor-target → v1.0.0-rc.94/0003-agent-core-vendor-target}/migration.js +0 -0
- /package/src/migrations/{latest/rolldown-config-bundle-transient → v1.0.0-rc.95/0001-rolldown-config-bundle-transient}/metadata.json +0 -0
- /package/src/migrations/{latest/rolldown-config-bundle-transient → v1.0.0-rc.95/0001-rolldown-config-bundle-transient}/migration.js +0 -0
- /package/src/migrations/{latest/agent-connection-pin-strands-peers → v1.0.0-rc.95/0002-agent-connection-pin-strands-peers}/metadata.json +0 -0
- /package/src/migrations/{latest/agent-connection-pin-strands-peers → v1.0.0-rc.95/0002-agent-connection-pin-strands-peers}/migration.d.ts +0 -0
- /package/src/migrations/{latest/agent-connection-pin-strands-peers → v1.0.0-rc.95/0002-agent-connection-pin-strands-peers}/migration.js +0 -0
- /package/src/migrations/{latest/ignore-package-manager-temp-files → v1.0.0-rc.95/0003-ignore-package-manager-temp-files}/metadata.json +0 -0
- /package/src/migrations/{latest/ignore-package-manager-temp-files → v1.0.0-rc.95/0003-ignore-package-manager-temp-files}/migration.d.ts +0 -0
- /package/src/migrations/{latest/ignore-package-manager-temp-files → v1.0.0-rc.95/0003-ignore-package-manager-temp-files}/migration.js +0 -0
- /package/src/migrations/{latest/shadcn-package-imports-exports → v1.0.0-rc.95/0004-shadcn-package-imports-exports}/metadata.json +0 -0
- /package/src/migrations/{latest/shadcn-package-imports-exports → v1.0.0-rc.95/0004-shadcn-package-imports-exports}/migration.js +0 -0
package/src/py/rdb/generator.js
CHANGED
|
@@ -290,34 +290,35 @@ export const pyRdbGenerator = async (tree, options)=>{
|
|
|
290
290
|
}
|
|
291
291
|
};
|
|
292
292
|
if (options.infra !== 'none') {
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
293
|
+
// Both images ship under either provider — Terraform pushes the locally
|
|
294
|
+
// built tags, CDK builds the same contexts as image assets — so the build
|
|
295
|
+
// and its scan are wired up for either.
|
|
296
|
+
projectConfig.targets.docker = {
|
|
297
|
+
cache: IMAGE_BUILD_CACHE,
|
|
298
|
+
executor: 'nx:run-commands',
|
|
299
|
+
options: {
|
|
300
|
+
commands: [
|
|
301
|
+
`${containerEngine} build --platform linux/arm64 --provenance=false -t ${migrationDockerImageTag} ${migrationBundleDir}`,
|
|
302
|
+
`${containerEngine} build --platform linux/arm64 --provenance=false -t ${createDbUserDockerImageTag} ${createDbUserBundleDir}`
|
|
303
|
+
],
|
|
304
|
+
parallel: false
|
|
305
|
+
},
|
|
306
|
+
dependsOn: [
|
|
307
|
+
'bundle-migration',
|
|
308
|
+
'bundle-create-db-user'
|
|
309
|
+
]
|
|
310
|
+
};
|
|
311
|
+
addArtifactDependencyToTargets(projectConfig, 'docker');
|
|
312
|
+
addDockerScanTarget(tree, {
|
|
313
|
+
project: projectConfig,
|
|
314
|
+
containerEngine,
|
|
315
|
+
trivyTargetName: 'trivy',
|
|
316
|
+
dockerTargetName: 'docker',
|
|
317
|
+
imageTags: [
|
|
318
|
+
migrationDockerImageTag,
|
|
319
|
+
createDbUserDockerImageTag
|
|
320
|
+
]
|
|
321
|
+
}, DEPENDENCIES);
|
|
321
322
|
addDependencyToTargetIfNotPresent(projectConfig, 'build', 'bundle-migration');
|
|
322
323
|
addDependencyToTargetIfNotPresent(projectConfig, 'build', 'bundle-create-db-user');
|
|
323
324
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/py/rdb/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { relative } from 'node:path';\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n readProjectConfiguration,\n type Tree,\n updateProjectConfiguration,\n writeJson,\n} from '@nx/devkit';\nimport {\n addPyDependencies,\n addTsDependencies,\n} from '../../utils/add-dependencies.js';\nimport { addPythonReExport } from '../../utils/agent-connection/agent-connection.js';\nimport { addPythonBundleTarget } from '../../utils/bundle/bundle.js';\nimport { resolveContainers } from '../../utils/containers.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../utils/declared-dependencies.js';\nimport {\n addDockerScanTarget,\n DOCKER_DEPENDENCIES,\n IMAGE_BUILD_CACHE,\n} from '../../utils/docker.js';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { FS_DEPENDENCIES, FsCommands } from '../../utils/fs.js';\nimport { resolveIac } from '../../utils/iac.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport { kebabCase, snakeCase, toClassName } from '../../utils/names.js';\nimport { getNpmScope } from '../../utils/npm-scope.js';\nimport {\n addArtifactDependencyToTargets,\n addDependencyToTargetIfNotPresent,\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n projectExists,\n} from '../../utils/nx.js';\nimport { assignPort } from '../../utils/port.js';\nimport { addRdbInfra } from '../../utils/rdb-constructs/rdb-constructs.js';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../utils/shared-constructs.js';\nimport {\n type IacMetadata,\n PACKAGES_DIR,\n SHARED_SCRIPTS_DIR,\n} from '../../utils/shared-constructs-constants.js';\nimport {\n SHARED_RDB_SCRIPTS_DEPENDENCIES,\n sharedRdbScriptsGenerator,\n} from '../../utils/shared-rdb-scripts.js';\nimport { PY_VERSIONS } from '../../utils/versions.js';\nimport pyProjectGenerator, {\n getPyProjectDetails,\n} from '../project/generator.js';\nimport type { PyRdbGeneratorSchema } from './schema';\n\n/** The metadata this generator records, which its predicates read. */\nexport interface PyRdbMetadata extends IacMetadata {\n readonly engine: PyRdbGeneratorSchema['engine'];\n}\n\n/** The Postgres engine, which MySQL takes none of. */\nconst isPostgres = (m: PyRdbMetadata) => m.engine !== 'mysql';\n\n// Each entry names the engine branch it belongs to, so the same declaration\n// drives both adding and the version sync.\nexport const DEPENDENCIES = declareDependencies<PyRdbMetadata>()({\n ts: [\n // The engine client the local dev script wait-for-*-db.ts imports.\n { name: 'mariadb', when: (m) => m.engine === 'mysql', root: true },\n { name: 'pg', when: isPostgres, root: true },\n { name: '@types/pg', when: isPostgres, dev: true, root: true },\n // Added by the helpers that own the projects they belong to.\n ...ownedElsewhere(FS_DEPENDENCIES),\n ...ownedElsewhere(DOCKER_DEPENDENCIES),\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ...ownedElsewhere(SHARED_RDB_SCRIPTS_DEPENDENCIES),\n ],\n py: [\n { name: 'sqlmodel' },\n { name: 'alembic' },\n // SQLAlchemy's async engine (used by connection.py for both engines)\n // requires greenlet at runtime. Vend it explicitly at a pinned version so\n // the dependency graph is fully determined and doesn't float to an\n // unpublished-wheel release at install time.\n { name: 'greenlet' },\n { name: 'aiomysql', when: (m) => m.engine === 'mysql' },\n { name: 'asyncpg', when: (m) => m.engine !== 'mysql' },\n { name: 'boto3' },\n { name: 'aws-lambda-powertools' },\n ],\n});\n\nexport const PY_RDB_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const pyRdbGenerator = async (\n tree: Tree,\n options: PyRdbGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const nameClassName = toClassName(options.name);\n const databaseUser = options.databaseUser ?? 'dbadmin';\n const databaseName = snakeCase(options.databaseName ?? options.name);\n const containerEngine = await resolveContainers(tree, 'inherit');\n\n const { fullyQualifiedName, dir, normalizedModuleName } = getPyProjectDetails(\n tree,\n {\n name: options.name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n },\n );\n\n if (!projectExists(tree, fullyQualifiedName)) {\n await pyProjectGenerator(tree, {\n name: options.name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n type: 'library',\n });\n }\n\n const projectConfig = readProjectConfiguration(tree, fullyQualifiedName);\n\n const { engine } = options;\n // Recorded in the metadata below so the version sync can tell a CDK project\n // from a Terraform one; undefined when no infrastructure was generated.\n const iac =\n options.infra !== 'none' ? await resolveIac(tree, options.iac) : undefined;\n\n // Recorded below and read by the declaration's predicates, so the packages\n // added here are exactly the ones the version sync will own.\n const metadata: PyRdbMetadata = { engine, ...(iac ? { iac } : {}) };\n const localDbPort = assignPort(\n tree,\n projectConfig,\n engine === 'mysql' ? 3306 : 5432,\n );\n const localDbHost = 'localhost';\n const localDbUser = engine === 'mysql' ? 'root' : 'dbadmin';\n const localDbPassword = 'password';\n const containerName = `${getNpmScope(tree)}-${databaseName}`;\n const dockerImage =\n engine === 'mysql'\n ? 'public.ecr.aws/docker/library/mysql:8.0.44'\n : 'public.ecr.aws/docker/library/postgres:17.7';\n\n const templateOptions = {\n name: normalizedModuleName,\n runtimeConfigKey: nameClassName,\n engine,\n localDbPort,\n localDbHost,\n localDbName: databaseName,\n localDbUser,\n localDbPassword,\n containerEngine,\n containerName,\n dockerImage,\n sqlmodelVersion: PY_VERSIONS.sqlmodel,\n alembicVersion: PY_VERSIONS.alembic,\n aiomysqlVersion: PY_VERSIONS.aiomysql,\n asyncpgVersion: PY_VERSIONS.asyncpg,\n boto3Version: PY_VERSIONS.boto3,\n awsLambdaPowertoolsVersion: PY_VERSIONS['aws-lambda-powertools'],\n };\n\n // Models, the connection module, the Alembic config and the migration env are\n // user-editable, so a re-run (to add infrastructure, or after a failed run)\n // must not clobber the user's schema and edits.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n dir,\n templateOptions,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // The package barrel re-exports connection.py. `pyProjectGenerator` writes a\n // stub __init__.py when it creates the project, so the re-exports are added to\n // whatever is there rather than replacing it — which also leaves a user's own\n // additions to the barrel alone on a re-run.\n const initFilePath = joinPathFragments(\n dir,\n normalizedModuleName,\n '__init__.py',\n );\n for (const importName of ['get_engine', 'is_local_dev', 'session_context']) {\n await addPythonReExport(tree, initFilePath, '.connection', importName);\n }\n\n // config.json is framework-owned: it carries values derived from the\n // generator's options, so it converges on a re-run with changed options.\n writeJson(tree, joinPathFragments(dir, 'config.json'), {\n runtimeConfigKey: nameClassName,\n localDev: {\n containerEngine,\n containerName,\n image: dockerImage,\n port: localDbPort,\n host: localDbHost,\n dbName: databaseName,\n dbUser: localDbUser,\n dbPassword: localDbPassword,\n dbEngine: engine,\n },\n });\n\n await sharedRdbScriptsGenerator(tree, engine, DEPENDENCIES);\n const scriptsDir = relative(\n dir,\n joinPathFragments(PACKAGES_DIR, SHARED_SCRIPTS_DIR, 'src', 'rdb'),\n );\n const fs = new FsCommands(tree, DEPENDENCIES);\n\n const migrationBundleDir = joinPathFragments(\n 'dist',\n projectConfig.root,\n 'docker',\n 'migration',\n );\n const createDbUserBundleDir = joinPathFragments(\n 'dist',\n projectConfig.root,\n 'docker',\n 'create-db-user',\n );\n const migrationDockerImageTag = `${getNpmScope(tree)}-${kebabCase(options.name)}-migration:latest`;\n const createDbUserDockerImageTag = `${getNpmScope(tree)}-${kebabCase(\n options.name,\n )}-create-db-user:latest`;\n\n if (options.infra !== 'none') {\n const { bundleTargetName, bundleOutputDir } = addPythonBundleTarget(\n projectConfig,\n { pythonPlatform: 'aarch64-manylinux_2_28' },\n );\n\n projectConfig.targets['bundle-migration'] = {\n cache: true,\n inputs: ['default'],\n outputs: ['{workspaceRoot}/dist/{projectRoot}/docker/migration'],\n executor: 'nx:run-commands',\n options: {\n commands: [\n fs.rm(migrationBundleDir),\n fs.mkdir(migrationBundleDir),\n fs.cpDir(bundleOutputDir, migrationBundleDir),\n fs.cpDir(\n joinPathFragments(dir, 'migrations'),\n joinPathFragments(migrationBundleDir, 'migrations'),\n ),\n fs.cpFile(\n joinPathFragments(dir, 'alembic.ini'),\n joinPathFragments(migrationBundleDir, 'alembic.ini'),\n ),\n fs.cpFile(\n joinPathFragments(dir, 'Dockerfile.migration'),\n joinPathFragments(migrationBundleDir, 'Dockerfile'),\n ),\n ],\n parallel: false,\n },\n dependsOn: [bundleTargetName],\n };\n projectConfig.targets['bundle-create-db-user'] = {\n cache: true,\n inputs: ['default'],\n outputs: ['{workspaceRoot}/dist/{projectRoot}/docker/create-db-user'],\n executor: 'nx:run-commands',\n options: {\n commands: [\n fs.rm(createDbUserBundleDir),\n fs.mkdir(createDbUserBundleDir),\n fs.cpDir(bundleOutputDir, createDbUserBundleDir),\n fs.cpFile(\n joinPathFragments(dir, 'Dockerfile.create-db-user'),\n joinPathFragments(createDbUserBundleDir, 'Dockerfile'),\n ),\n ],\n parallel: false,\n },\n dependsOn: [bundleTargetName],\n };\n addDependencyToTargetIfNotPresent(\n projectConfig,\n 'bundle',\n 'bundle-migration',\n );\n addDependencyToTargetIfNotPresent(\n projectConfig,\n 'bundle',\n 'bundle-create-db-user',\n );\n }\n\n projectConfig.targets['pull-image'] = {\n executor: 'nx:run-commands',\n options: {\n command: `tsx ${scriptsDir}/pull-image.ts`,\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets['dev'] = {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n command: `tsx ${scriptsDir}/start-container.ts`,\n cwd: '{projectRoot}',\n },\n dependsOn: ['pull-image'],\n };\n projectConfig.targets['wait-for-db'] = {\n executor: 'nx:run-commands',\n dependsOn: ['dev'],\n options: {\n command: `tsx ${scriptsDir}/wait-for-${engine}-db.ts`,\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets.migrate = {\n executor: 'nx:run-commands',\n dependsOn: ['dev', 'wait-for-db'],\n options: {\n command: 'uv run alembic upgrade head',\n cwd: '{projectRoot}',\n env: {\n LOCAL_DEV: 'true',\n },\n },\n };\n projectConfig.targets.alembic = {\n executor: 'nx:run-commands',\n dependsOn: ['dev', 'wait-for-db'],\n options: {\n command: 'uv run alembic',\n cwd: '{projectRoot}',\n env: {\n LOCAL_DEV: 'true',\n },\n },\n };\n\n if (options.infra !== 'none') {\n if (iac === 'terraform') {\n projectConfig.targets.docker = {\n cache: IMAGE_BUILD_CACHE,\n executor: 'nx:run-commands',\n options: {\n commands: [\n `${containerEngine} build --platform linux/arm64 --provenance=false -t ${migrationDockerImageTag} ${migrationBundleDir}`,\n `${containerEngine} build --platform linux/arm64 --provenance=false -t ${createDbUserDockerImageTag} ${createDbUserBundleDir}`,\n ],\n parallel: false,\n },\n dependsOn: ['bundle-migration', 'bundle-create-db-user'],\n };\n addArtifactDependencyToTargets(projectConfig, 'docker');\n\n addDockerScanTarget(\n tree,\n {\n project: projectConfig,\n containerEngine,\n trivyTargetName: 'trivy',\n dockerTargetName: 'docker',\n imageTags: [migrationDockerImageTag, createDbUserDockerImageTag],\n },\n DEPENDENCIES,\n );\n }\n addDependencyToTargetIfNotPresent(\n projectConfig,\n 'build',\n 'bundle-migration',\n );\n addDependencyToTargetIfNotPresent(\n projectConfig,\n 'build',\n 'bundle-create-db-user',\n );\n }\n\n updateProjectConfiguration(tree, fullyQualifiedName, projectConfig);\n addGeneratorMetadata(\n tree,\n fullyQualifiedName,\n PY_RDB_GENERATOR_INFO,\n metadata,\n );\n\n if (options.infra !== 'none') {\n await sharedConstructsGenerator(tree, { iac }, DEPENDENCIES);\n await addRdbInfra(tree, {\n iac,\n projectName: fullyQualifiedName,\n projectRoot: dir,\n nameClassName,\n nameKebabCase: kebabCase(options.name),\n databasePackageAlias: normalizedModuleName,\n databaseName,\n adminUser: databaseUser,\n engine,\n migrationBundleDir,\n createDbUserBundleDir,\n framework: 'sqlmodel',\n createDbUserDockerImageTag,\n migrationDockerImageTag,\n containerEngine,\n });\n }\n\n addPyDependencies(tree, DEPENDENCIES, { metadata, projectRoot: dir });\n addTsDependencies(tree, DEPENDENCIES, { metadata });\n\n await addGeneratorMetricsIfApplicable(tree, [PY_RDB_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript', 'python'],\n });\n};\n\nexport default pyRdbGenerator;\n"],"names":["relative","generateFiles","joinPathFragments","OverwriteStrategy","readProjectConfiguration","updateProjectConfiguration","writeJson","addPyDependencies","addTsDependencies","addPythonReExport","addPythonBundleTarget","resolveContainers","declareDependencies","ownedElsewhere","addDockerScanTarget","DOCKER_DEPENDENCIES","IMAGE_BUILD_CACHE","formatFilesInSubtree","FS_DEPENDENCIES","FsCommands","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","kebabCase","snakeCase","toClassName","getNpmScope","addArtifactDependencyToTargets","addDependencyToTargetIfNotPresent","addGeneratorMetadata","getGeneratorInfo","projectExists","assignPort","addRdbInfra","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","PACKAGES_DIR","SHARED_SCRIPTS_DIR","SHARED_RDB_SCRIPTS_DEPENDENCIES","sharedRdbScriptsGenerator","PY_VERSIONS","pyProjectGenerator","getPyProjectDetails","isPostgres","m","engine","DEPENDENCIES","ts","name","when","root","dev","py","PY_RDB_GENERATOR_INFO","filename","pyRdbGenerator","tree","options","nameClassName","databaseUser","databaseName","containerEngine","fullyQualifiedName","dir","normalizedModuleName","directory","subDirectory","type","projectConfig","iac","infra","undefined","metadata","localDbPort","localDbHost","localDbUser","localDbPassword","containerName","dockerImage","templateOptions","runtimeConfigKey","localDbName","sqlmodelVersion","sqlmodel","alembicVersion","alembic","aiomysqlVersion","aiomysql","asyncpgVersion","asyncpg","boto3Version","boto3","awsLambdaPowertoolsVersion","dirname","overwriteStrategy","KeepExisting","initFilePath","importName","localDev","image","port","host","dbName","dbUser","dbPassword","dbEngine","scriptsDir","fs","migrationBundleDir","createDbUserBundleDir","migrationDockerImageTag","createDbUserDockerImageTag","bundleTargetName","bundleOutputDir","pythonPlatform","targets","cache","inputs","outputs","executor","commands","rm","mkdir","cpDir","cpFile","parallel","dependsOn","command","cwd","continuous","migrate","env","LOCAL_DEV","docker","project","trivyTargetName","dockerTargetName","imageTags","projectName","projectRoot","nameKebabCase","databasePackageAlias","adminUser","framework","preferInstallDependencies","languages"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/py/rdb/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { relative } from 'node:path';\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n readProjectConfiguration,\n type Tree,\n updateProjectConfiguration,\n writeJson,\n} from '@nx/devkit';\nimport {\n addPyDependencies,\n addTsDependencies,\n} from '../../utils/add-dependencies.js';\nimport { addPythonReExport } from '../../utils/agent-connection/agent-connection.js';\nimport { addPythonBundleTarget } from '../../utils/bundle/bundle.js';\nimport { resolveContainers } from '../../utils/containers.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../utils/declared-dependencies.js';\nimport {\n addDockerScanTarget,\n DOCKER_DEPENDENCIES,\n IMAGE_BUILD_CACHE,\n} from '../../utils/docker.js';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { FS_DEPENDENCIES, FsCommands } from '../../utils/fs.js';\nimport { resolveIac } from '../../utils/iac.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport { kebabCase, snakeCase, toClassName } from '../../utils/names.js';\nimport { getNpmScope } from '../../utils/npm-scope.js';\nimport {\n addArtifactDependencyToTargets,\n addDependencyToTargetIfNotPresent,\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n projectExists,\n} from '../../utils/nx.js';\nimport { assignPort } from '../../utils/port.js';\nimport { addRdbInfra } from '../../utils/rdb-constructs/rdb-constructs.js';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../utils/shared-constructs.js';\nimport {\n type IacMetadata,\n PACKAGES_DIR,\n SHARED_SCRIPTS_DIR,\n} from '../../utils/shared-constructs-constants.js';\nimport {\n SHARED_RDB_SCRIPTS_DEPENDENCIES,\n sharedRdbScriptsGenerator,\n} from '../../utils/shared-rdb-scripts.js';\nimport { PY_VERSIONS } from '../../utils/versions.js';\nimport pyProjectGenerator, {\n getPyProjectDetails,\n} from '../project/generator.js';\nimport type { PyRdbGeneratorSchema } from './schema';\n\n/** The metadata this generator records, which its predicates read. */\nexport interface PyRdbMetadata extends IacMetadata {\n readonly engine: PyRdbGeneratorSchema['engine'];\n}\n\n/** The Postgres engine, which MySQL takes none of. */\nconst isPostgres = (m: PyRdbMetadata) => m.engine !== 'mysql';\n\n// Each entry names the engine branch it belongs to, so the same declaration\n// drives both adding and the version sync.\nexport const DEPENDENCIES = declareDependencies<PyRdbMetadata>()({\n ts: [\n // The engine client the local dev script wait-for-*-db.ts imports.\n { name: 'mariadb', when: (m) => m.engine === 'mysql', root: true },\n { name: 'pg', when: isPostgres, root: true },\n { name: '@types/pg', when: isPostgres, dev: true, root: true },\n // Added by the helpers that own the projects they belong to.\n ...ownedElsewhere(FS_DEPENDENCIES),\n ...ownedElsewhere(DOCKER_DEPENDENCIES),\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ...ownedElsewhere(SHARED_RDB_SCRIPTS_DEPENDENCIES),\n ],\n py: [\n { name: 'sqlmodel' },\n { name: 'alembic' },\n // SQLAlchemy's async engine (used by connection.py for both engines)\n // requires greenlet at runtime. Vend it explicitly at a pinned version so\n // the dependency graph is fully determined and doesn't float to an\n // unpublished-wheel release at install time.\n { name: 'greenlet' },\n { name: 'aiomysql', when: (m) => m.engine === 'mysql' },\n { name: 'asyncpg', when: (m) => m.engine !== 'mysql' },\n { name: 'boto3' },\n { name: 'aws-lambda-powertools' },\n ],\n});\n\nexport const PY_RDB_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const pyRdbGenerator = async (\n tree: Tree,\n options: PyRdbGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const nameClassName = toClassName(options.name);\n const databaseUser = options.databaseUser ?? 'dbadmin';\n const databaseName = snakeCase(options.databaseName ?? options.name);\n const containerEngine = await resolveContainers(tree, 'inherit');\n\n const { fullyQualifiedName, dir, normalizedModuleName } = getPyProjectDetails(\n tree,\n {\n name: options.name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n },\n );\n\n if (!projectExists(tree, fullyQualifiedName)) {\n await pyProjectGenerator(tree, {\n name: options.name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n type: 'library',\n });\n }\n\n const projectConfig = readProjectConfiguration(tree, fullyQualifiedName);\n\n const { engine } = options;\n // Recorded in the metadata below so the version sync can tell a CDK project\n // from a Terraform one; undefined when no infrastructure was generated.\n const iac =\n options.infra !== 'none' ? await resolveIac(tree, options.iac) : undefined;\n\n // Recorded below and read by the declaration's predicates, so the packages\n // added here are exactly the ones the version sync will own.\n const metadata: PyRdbMetadata = { engine, ...(iac ? { iac } : {}) };\n const localDbPort = assignPort(\n tree,\n projectConfig,\n engine === 'mysql' ? 3306 : 5432,\n );\n const localDbHost = 'localhost';\n const localDbUser = engine === 'mysql' ? 'root' : 'dbadmin';\n const localDbPassword = 'password';\n const containerName = `${getNpmScope(tree)}-${databaseName}`;\n const dockerImage =\n engine === 'mysql'\n ? 'public.ecr.aws/docker/library/mysql:8.0.44'\n : 'public.ecr.aws/docker/library/postgres:17.7';\n\n const templateOptions = {\n name: normalizedModuleName,\n runtimeConfigKey: nameClassName,\n engine,\n localDbPort,\n localDbHost,\n localDbName: databaseName,\n localDbUser,\n localDbPassword,\n containerEngine,\n containerName,\n dockerImage,\n sqlmodelVersion: PY_VERSIONS.sqlmodel,\n alembicVersion: PY_VERSIONS.alembic,\n aiomysqlVersion: PY_VERSIONS.aiomysql,\n asyncpgVersion: PY_VERSIONS.asyncpg,\n boto3Version: PY_VERSIONS.boto3,\n awsLambdaPowertoolsVersion: PY_VERSIONS['aws-lambda-powertools'],\n };\n\n // Models, the connection module, the Alembic config and the migration env are\n // user-editable, so a re-run (to add infrastructure, or after a failed run)\n // must not clobber the user's schema and edits.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n dir,\n templateOptions,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // The package barrel re-exports connection.py. `pyProjectGenerator` writes a\n // stub __init__.py when it creates the project, so the re-exports are added to\n // whatever is there rather than replacing it — which also leaves a user's own\n // additions to the barrel alone on a re-run.\n const initFilePath = joinPathFragments(\n dir,\n normalizedModuleName,\n '__init__.py',\n );\n for (const importName of ['get_engine', 'is_local_dev', 'session_context']) {\n await addPythonReExport(tree, initFilePath, '.connection', importName);\n }\n\n // config.json is framework-owned: it carries values derived from the\n // generator's options, so it converges on a re-run with changed options.\n writeJson(tree, joinPathFragments(dir, 'config.json'), {\n runtimeConfigKey: nameClassName,\n localDev: {\n containerEngine,\n containerName,\n image: dockerImage,\n port: localDbPort,\n host: localDbHost,\n dbName: databaseName,\n dbUser: localDbUser,\n dbPassword: localDbPassword,\n dbEngine: engine,\n },\n });\n\n await sharedRdbScriptsGenerator(tree, engine, DEPENDENCIES);\n const scriptsDir = relative(\n dir,\n joinPathFragments(PACKAGES_DIR, SHARED_SCRIPTS_DIR, 'src', 'rdb'),\n );\n const fs = new FsCommands(tree, DEPENDENCIES);\n\n const migrationBundleDir = joinPathFragments(\n 'dist',\n projectConfig.root,\n 'docker',\n 'migration',\n );\n const createDbUserBundleDir = joinPathFragments(\n 'dist',\n projectConfig.root,\n 'docker',\n 'create-db-user',\n );\n const migrationDockerImageTag = `${getNpmScope(tree)}-${kebabCase(options.name)}-migration:latest`;\n const createDbUserDockerImageTag = `${getNpmScope(tree)}-${kebabCase(\n options.name,\n )}-create-db-user:latest`;\n\n if (options.infra !== 'none') {\n const { bundleTargetName, bundleOutputDir } = addPythonBundleTarget(\n projectConfig,\n { pythonPlatform: 'aarch64-manylinux_2_28' },\n );\n\n projectConfig.targets['bundle-migration'] = {\n cache: true,\n inputs: ['default'],\n outputs: ['{workspaceRoot}/dist/{projectRoot}/docker/migration'],\n executor: 'nx:run-commands',\n options: {\n commands: [\n fs.rm(migrationBundleDir),\n fs.mkdir(migrationBundleDir),\n fs.cpDir(bundleOutputDir, migrationBundleDir),\n fs.cpDir(\n joinPathFragments(dir, 'migrations'),\n joinPathFragments(migrationBundleDir, 'migrations'),\n ),\n fs.cpFile(\n joinPathFragments(dir, 'alembic.ini'),\n joinPathFragments(migrationBundleDir, 'alembic.ini'),\n ),\n fs.cpFile(\n joinPathFragments(dir, 'Dockerfile.migration'),\n joinPathFragments(migrationBundleDir, 'Dockerfile'),\n ),\n ],\n parallel: false,\n },\n dependsOn: [bundleTargetName],\n };\n projectConfig.targets['bundle-create-db-user'] = {\n cache: true,\n inputs: ['default'],\n outputs: ['{workspaceRoot}/dist/{projectRoot}/docker/create-db-user'],\n executor: 'nx:run-commands',\n options: {\n commands: [\n fs.rm(createDbUserBundleDir),\n fs.mkdir(createDbUserBundleDir),\n fs.cpDir(bundleOutputDir, createDbUserBundleDir),\n fs.cpFile(\n joinPathFragments(dir, 'Dockerfile.create-db-user'),\n joinPathFragments(createDbUserBundleDir, 'Dockerfile'),\n ),\n ],\n parallel: false,\n },\n dependsOn: [bundleTargetName],\n };\n addDependencyToTargetIfNotPresent(\n projectConfig,\n 'bundle',\n 'bundle-migration',\n );\n addDependencyToTargetIfNotPresent(\n projectConfig,\n 'bundle',\n 'bundle-create-db-user',\n );\n }\n\n projectConfig.targets['pull-image'] = {\n executor: 'nx:run-commands',\n options: {\n command: `tsx ${scriptsDir}/pull-image.ts`,\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets['dev'] = {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n command: `tsx ${scriptsDir}/start-container.ts`,\n cwd: '{projectRoot}',\n },\n dependsOn: ['pull-image'],\n };\n projectConfig.targets['wait-for-db'] = {\n executor: 'nx:run-commands',\n dependsOn: ['dev'],\n options: {\n command: `tsx ${scriptsDir}/wait-for-${engine}-db.ts`,\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets.migrate = {\n executor: 'nx:run-commands',\n dependsOn: ['dev', 'wait-for-db'],\n options: {\n command: 'uv run alembic upgrade head',\n cwd: '{projectRoot}',\n env: {\n LOCAL_DEV: 'true',\n },\n },\n };\n projectConfig.targets.alembic = {\n executor: 'nx:run-commands',\n dependsOn: ['dev', 'wait-for-db'],\n options: {\n command: 'uv run alembic',\n cwd: '{projectRoot}',\n env: {\n LOCAL_DEV: 'true',\n },\n },\n };\n\n if (options.infra !== 'none') {\n // Both images ship under either provider — Terraform pushes the locally\n // built tags, CDK builds the same contexts as image assets — so the build\n // and its scan are wired up for either.\n projectConfig.targets.docker = {\n cache: IMAGE_BUILD_CACHE,\n executor: 'nx:run-commands',\n options: {\n commands: [\n `${containerEngine} build --platform linux/arm64 --provenance=false -t ${migrationDockerImageTag} ${migrationBundleDir}`,\n `${containerEngine} build --platform linux/arm64 --provenance=false -t ${createDbUserDockerImageTag} ${createDbUserBundleDir}`,\n ],\n parallel: false,\n },\n dependsOn: ['bundle-migration', 'bundle-create-db-user'],\n };\n addArtifactDependencyToTargets(projectConfig, 'docker');\n\n addDockerScanTarget(\n tree,\n {\n project: projectConfig,\n containerEngine,\n trivyTargetName: 'trivy',\n dockerTargetName: 'docker',\n imageTags: [migrationDockerImageTag, createDbUserDockerImageTag],\n },\n DEPENDENCIES,\n );\n addDependencyToTargetIfNotPresent(\n projectConfig,\n 'build',\n 'bundle-migration',\n );\n addDependencyToTargetIfNotPresent(\n projectConfig,\n 'build',\n 'bundle-create-db-user',\n );\n }\n\n updateProjectConfiguration(tree, fullyQualifiedName, projectConfig);\n addGeneratorMetadata(\n tree,\n fullyQualifiedName,\n PY_RDB_GENERATOR_INFO,\n metadata,\n );\n\n if (options.infra !== 'none') {\n await sharedConstructsGenerator(tree, { iac }, DEPENDENCIES);\n await addRdbInfra(tree, {\n iac,\n projectName: fullyQualifiedName,\n projectRoot: dir,\n nameClassName,\n nameKebabCase: kebabCase(options.name),\n databasePackageAlias: normalizedModuleName,\n databaseName,\n adminUser: databaseUser,\n engine,\n migrationBundleDir,\n createDbUserBundleDir,\n framework: 'sqlmodel',\n createDbUserDockerImageTag,\n migrationDockerImageTag,\n containerEngine,\n });\n }\n\n addPyDependencies(tree, DEPENDENCIES, { metadata, projectRoot: dir });\n addTsDependencies(tree, DEPENDENCIES, { metadata });\n\n await addGeneratorMetricsIfApplicable(tree, [PY_RDB_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript', 'python'],\n });\n};\n\nexport default pyRdbGenerator;\n"],"names":["relative","generateFiles","joinPathFragments","OverwriteStrategy","readProjectConfiguration","updateProjectConfiguration","writeJson","addPyDependencies","addTsDependencies","addPythonReExport","addPythonBundleTarget","resolveContainers","declareDependencies","ownedElsewhere","addDockerScanTarget","DOCKER_DEPENDENCIES","IMAGE_BUILD_CACHE","formatFilesInSubtree","FS_DEPENDENCIES","FsCommands","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","kebabCase","snakeCase","toClassName","getNpmScope","addArtifactDependencyToTargets","addDependencyToTargetIfNotPresent","addGeneratorMetadata","getGeneratorInfo","projectExists","assignPort","addRdbInfra","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","PACKAGES_DIR","SHARED_SCRIPTS_DIR","SHARED_RDB_SCRIPTS_DEPENDENCIES","sharedRdbScriptsGenerator","PY_VERSIONS","pyProjectGenerator","getPyProjectDetails","isPostgres","m","engine","DEPENDENCIES","ts","name","when","root","dev","py","PY_RDB_GENERATOR_INFO","filename","pyRdbGenerator","tree","options","nameClassName","databaseUser","databaseName","containerEngine","fullyQualifiedName","dir","normalizedModuleName","directory","subDirectory","type","projectConfig","iac","infra","undefined","metadata","localDbPort","localDbHost","localDbUser","localDbPassword","containerName","dockerImage","templateOptions","runtimeConfigKey","localDbName","sqlmodelVersion","sqlmodel","alembicVersion","alembic","aiomysqlVersion","aiomysql","asyncpgVersion","asyncpg","boto3Version","boto3","awsLambdaPowertoolsVersion","dirname","overwriteStrategy","KeepExisting","initFilePath","importName","localDev","image","port","host","dbName","dbUser","dbPassword","dbEngine","scriptsDir","fs","migrationBundleDir","createDbUserBundleDir","migrationDockerImageTag","createDbUserDockerImageTag","bundleTargetName","bundleOutputDir","pythonPlatform","targets","cache","inputs","outputs","executor","commands","rm","mkdir","cpDir","cpFile","parallel","dependsOn","command","cwd","continuous","migrate","env","LOCAL_DEV","docker","project","trivyTargetName","dockerTargetName","imageTags","projectName","projectRoot","nameKebabCase","databasePackageAlias","adminUser","framework","preferInstallDependencies","languages"],"mappings":"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"}
|
|
@@ -45,7 +45,7 @@ exports[`smithyProjectGenerator > shape libraries > should generate a shape libr
|
|
|
45
45
|
"shx rm -rf dist/{projectRoot}/build",
|
|
46
46
|
"shx rm -rf dist/{projectRoot}/smithy",
|
|
47
47
|
"shx mkdir -p dist/{projectRoot}/build",
|
|
48
|
-
"npx -y mise@2026.
|
|
48
|
+
"npx -y mise@2026.9.1 exec smithy@1.73.0 -- smithy build -c {projectRoot}/smithy-build.json --output dist/{projectRoot}/smithy",
|
|
49
49
|
"shx cp dist/{projectRoot}/smithy/source/model/model.json dist/{projectRoot}/build/model.json"
|
|
50
50
|
],
|
|
51
51
|
"parallel": false,
|
|
@@ -122,7 +122,7 @@ exports[`smithyProjectGenerator > should generate smithy project with all custom
|
|
|
122
122
|
"shx rm -rf dist/{projectRoot}/build",
|
|
123
123
|
"shx rm -rf dist/{projectRoot}/smithy",
|
|
124
124
|
"shx mkdir -p dist/{projectRoot}/build",
|
|
125
|
-
"npx -y mise@2026.
|
|
125
|
+
"npx -y mise@2026.9.1 exec smithy@1.73.0 -- smithy build -c {projectRoot}/smithy-build.json --output dist/{projectRoot}/smithy",
|
|
126
126
|
"shx mkdir -p dist/{projectRoot}/build/openapi",
|
|
127
127
|
"shx cp \\"dist/{projectRoot}/smithy/source/openapi/*.openapi.json\\" dist/{projectRoot}/build/openapi/openapi.json"
|
|
128
128
|
],
|
|
@@ -180,7 +180,7 @@ exports[`smithyProjectGenerator > should generate smithy project with custom dir
|
|
|
180
180
|
"shx rm -rf dist/{projectRoot}/build",
|
|
181
181
|
"shx rm -rf dist/{projectRoot}/smithy",
|
|
182
182
|
"shx mkdir -p dist/{projectRoot}/build",
|
|
183
|
-
"npx -y mise@2026.
|
|
183
|
+
"npx -y mise@2026.9.1 exec smithy@1.73.0 -- smithy build -c {projectRoot}/smithy-build.json --output dist/{projectRoot}/smithy",
|
|
184
184
|
"shx mkdir -p dist/{projectRoot}/build/openapi",
|
|
185
185
|
"shx cp \\"dist/{projectRoot}/smithy/source/openapi/*.openapi.json\\" dist/{projectRoot}/build/openapi/openapi.json"
|
|
186
186
|
],
|
|
@@ -330,7 +330,7 @@ exports[`smithyProjectGenerator > should generate smithy project with default op
|
|
|
330
330
|
"shx rm -rf dist/{projectRoot}/build",
|
|
331
331
|
"shx rm -rf dist/{projectRoot}/smithy",
|
|
332
332
|
"shx mkdir -p dist/{projectRoot}/build",
|
|
333
|
-
"npx -y mise@2026.
|
|
333
|
+
"npx -y mise@2026.9.1 exec smithy@1.73.0 -- smithy build -c {projectRoot}/smithy-build.json --output dist/{projectRoot}/smithy",
|
|
334
334
|
"shx mkdir -p dist/{projectRoot}/build/openapi",
|
|
335
335
|
"shx cp \\"dist/{projectRoot}/smithy/source/openapi/*.openapi.json\\" dist/{projectRoot}/build/openapi/openapi.json"
|
|
336
336
|
],
|
|
@@ -474,7 +474,7 @@ exports[`smithyProjectGenerator > should generate smithy project with subdirecto
|
|
|
474
474
|
"shx rm -rf dist/{projectRoot}/build",
|
|
475
475
|
"shx rm -rf dist/{projectRoot}/smithy",
|
|
476
476
|
"shx mkdir -p dist/{projectRoot}/build",
|
|
477
|
-
"npx -y mise@2026.
|
|
477
|
+
"npx -y mise@2026.9.1 exec smithy@1.73.0 -- smithy build -c {projectRoot}/smithy-build.json --output dist/{projectRoot}/smithy",
|
|
478
478
|
"shx mkdir -p dist/{projectRoot}/build/openapi",
|
|
479
479
|
"shx cp \\"dist/{projectRoot}/smithy/source/openapi/*.openapi.json\\" dist/{projectRoot}/build/openapi/openapi.json"
|
|
480
480
|
],
|
|
@@ -11,19 +11,19 @@ use smithy.openapi#specificationExtension
|
|
|
11
11
|
/// Use this trait if you have an operation with an HTTP method typically associated with a mutation (PUT, POST, etc) but
|
|
12
12
|
/// wish for it to be considered as a query by the client
|
|
13
13
|
@trait
|
|
14
|
-
@specificationExtension
|
|
14
|
+
@specificationExtension(as: "x-query")
|
|
15
15
|
structure query {}
|
|
16
16
|
|
|
17
17
|
/// Use this trait if you have an operation with an HTTP method typically associated with a query (GET, HEAD, etc) but
|
|
18
18
|
/// wish for it to be considered as a mutation by the client
|
|
19
19
|
@trait
|
|
20
|
-
@specificationExtension
|
|
20
|
+
@specificationExtension(as: "x-mutation")
|
|
21
21
|
structure mutation {}
|
|
22
22
|
|
|
23
23
|
/// By default, operations which accept a parameter named "cursor" are treated as paginated by the client
|
|
24
24
|
/// Use this trait if you have an operation where the pagination cursor is named something other than "cursor"
|
|
25
25
|
@trait
|
|
26
|
-
@specificationExtension
|
|
26
|
+
@specificationExtension(as: "x-cursor")
|
|
27
27
|
structure cursor {
|
|
28
28
|
// Use inputToken to change the input parameter used for pagination
|
|
29
29
|
inputToken: String
|
|
@@ -416,7 +416,7 @@ terraform {
|
|
|
416
416
|
required_providers {
|
|
417
417
|
aws = {
|
|
418
418
|
source = "hashicorp/aws"
|
|
419
|
-
version = "6.
|
|
419
|
+
version = "6.63.0"
|
|
420
420
|
}
|
|
421
421
|
random = {
|
|
422
422
|
source = "hashicorp/random"
|
|
@@ -732,7 +732,7 @@ exports[`tsSmithyApiGenerator > should generate smithy ts api with Terraform pro
|
|
|
732
732
|
}
|
|
733
733
|
aws = {
|
|
734
734
|
source = "hashicorp/aws"
|
|
735
|
-
version = "6.
|
|
735
|
+
version = "6.63.0"
|
|
736
736
|
}
|
|
737
737
|
random = {
|
|
738
738
|
source = "hashicorp/random"
|
|
@@ -2113,7 +2113,7 @@ exports[`tsSmithyApiGenerator > should generate smithy ts api with default optio
|
|
|
2113
2113
|
"shx rm -rf dist/{projectRoot}/build",
|
|
2114
2114
|
"shx rm -rf dist/{projectRoot}/smithy",
|
|
2115
2115
|
"shx mkdir -p dist/{projectRoot}/build",
|
|
2116
|
-
"npx -y mise@2026.
|
|
2116
|
+
"npx -y mise@2026.9.1 exec smithy@1.73.0 -- smithy build -c {projectRoot}/smithy-build.json --output dist/{projectRoot}/smithy",
|
|
2117
2117
|
"shx mkdir -p dist/{projectRoot}/build/openapi",
|
|
2118
2118
|
"shx cp \\"dist/{projectRoot}/smithy/source/openapi/*.openapi.json\\" dist/{projectRoot}/build/openapi/openapi.json"
|
|
2119
2119
|
],
|
|
@@ -2253,7 +2253,7 @@ terraform {
|
|
|
2253
2253
|
required_providers {
|
|
2254
2254
|
aws = {
|
|
2255
2255
|
source = "hashicorp/aws"
|
|
2256
|
-
version = "6.
|
|
2256
|
+
version = "6.63.0"
|
|
2257
2257
|
}
|
|
2258
2258
|
random = {
|
|
2259
2259
|
source = "hashicorp/random"
|
|
@@ -2566,7 +2566,7 @@ output "waf_web_acl_arn" {
|
|
|
2566
2566
|
}
|
|
2567
2567
|
aws = {
|
|
2568
2568
|
source = "hashicorp/aws"
|
|
2569
|
-
version = "6.
|
|
2569
|
+
version = "6.63.0"
|
|
2570
2570
|
}
|
|
2571
2571
|
random = {
|
|
2572
2572
|
source = "hashicorp/random"
|
|
@@ -3566,7 +3566,7 @@ terraform {
|
|
|
3566
3566
|
required_providers {
|
|
3567
3567
|
aws = {
|
|
3568
3568
|
source = "hashicorp/aws"
|
|
3569
|
-
version = "6.
|
|
3569
|
+
version = "6.63.0"
|
|
3570
3570
|
}
|
|
3571
3571
|
random = {
|
|
3572
3572
|
source = "hashicorp/random"
|
|
@@ -3879,7 +3879,7 @@ output "waf_web_acl_arn" {
|
|
|
3879
3879
|
}
|
|
3880
3880
|
aws = {
|
|
3881
3881
|
source = "hashicorp/aws"
|
|
3882
|
-
version = "6.
|
|
3882
|
+
version = "6.63.0"
|
|
3883
3883
|
}
|
|
3884
3884
|
random = {
|
|
3885
3885
|
source = "hashicorp/random"
|
|
@@ -4868,7 +4868,7 @@ exports[`tsSmithyApiGenerator > terraform iac > should generate terraform with c
|
|
|
4868
4868
|
}
|
|
4869
4869
|
aws = {
|
|
4870
4870
|
source = "hashicorp/aws"
|
|
4871
|
-
version = "6.
|
|
4871
|
+
version = "6.63.0"
|
|
4872
4872
|
}
|
|
4873
4873
|
random = {
|
|
4874
4874
|
source = "hashicorp/random"
|
|
@@ -131,12 +131,17 @@ export const tsSmithyApiGenerator = async (tree, options)=>{
|
|
|
131
131
|
addGeneratorMetadata(tree, backendFullyQualifiedName, TS_SMITHY_API_GENERATOR_INFO, metadata);
|
|
132
132
|
const backendProjectConfig = readProjectConfigurationUnqualified(tree, backendFullyQualifiedName);
|
|
133
133
|
const port = assignPort(tree, backendProjectConfig, 3001);
|
|
134
|
-
|
|
135
|
-
|
|
134
|
+
if (!projectExists) {
|
|
135
|
+
// Delete default index.ts with "hello" function
|
|
136
|
+
tree.delete(joinPathFragments(backendProjectConfig.sourceRoot, 'index.ts'));
|
|
137
|
+
}
|
|
138
|
+
// The API's source is user-owned, so a re-run leaves existing files alone.
|
|
136
139
|
generateFiles(tree, joinPathFragments(import.meta.dirname, 'files'), backendProjectConfig.sourceRoot, {
|
|
137
140
|
apiNameClassName,
|
|
138
141
|
port,
|
|
139
142
|
...esmVars(tree)
|
|
143
|
+
}, {
|
|
144
|
+
overwriteStrategy: OverwriteStrategy.KeepExisting
|
|
140
145
|
});
|
|
141
146
|
if (options.infra !== 'none') {
|
|
142
147
|
if (options.auth === 'custom') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../packages/nx-plugin/src/smithy/ts/api/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport tsProjectGenerator, {\n getTsLibDetails,\n} from '../../../ts/lib/generator.js';\nimport { addTsDependencies } from '../../../utils/add-dependencies.js';\nimport {\n API_CONSTRUCTS_DEPENDENCIES,\n API_CONSTRUCTS_PY_DEPENDENCIES,\n addApiGatewayInfra,\n} from '../../../utils/api-constructs/api-constructs.js';\nimport { addSharedConstructsOpenApiMetadataGenerateTarget } from '../../../utils/api-constructs/open-api-metadata.js';\nimport {\n addTypeScriptBundleTarget,\n BUNDLE_DEPENDENCIES,\n} from '../../../utils/bundle/bundle.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../../utils/declared-dependencies.js';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\nimport { FS_DEPENDENCIES, FsCommands } from '../../../utils/fs.js';\nimport { updateGitIgnore } from '../../../utils/git.js';\nimport { resolveIac } from '../../../utils/iac.js';\nimport { installDependencies } from '../../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics.js';\nimport { esmVars } from '../../../utils/module-format.js';\nimport { toClassName, toKebabCase } from '../../../utils/names.js';\nimport {\n addDependencyToTargetIfNotPresent,\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n normalizeTargetKeyOrder,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx.js';\nimport { assignPort } from '../../../utils/port.js';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../../utils/shared-constructs.js';\nimport type { IacMetadata } from '../../../utils/shared-constructs-constants.js';\nimport smithyProjectGenerator from '../../project/generator.js';\nimport type { TsSmithyApiGeneratorSchema } from './schema';\n\n/** The metadata this generator records, which its predicates read. */\nexport interface TsSmithyApiMetadata extends IacMetadata {\n readonly apiName: string;\n readonly auth: TsSmithyApiGeneratorSchema['auth'];\n readonly modelProject: string;\n}\n\n// Each entry names the branch it belongs to, so the same declaration drives both\n// adding and the version sync.\nexport const DEPENDENCIES = declareDependencies<TsSmithyApiMetadata>()({\n ts: [\n { name: '@smithy/server-apigateway' },\n { name: '@smithy/server-node' },\n { name: '@middy/core' },\n { name: '@aws-lambda-powertools/logger' },\n { name: '@aws-lambda-powertools/parameters' },\n { name: '@aws-lambda-powertools/tracer' },\n { name: '@aws-lambda-powertools/metrics' },\n { name: '@aws-sdk/client-appconfigdata' },\n // The custom authorizer handler parses its event.\n { name: '@aws-lambda-powertools/parser', when: (m) => m.auth === 'custom' },\n { name: '@types/aws-lambda', dev: true },\n // tsx runs the local server from the workspace root.\n { name: 'tsx', dev: true, root: true },\n ...ownedElsewhere(FS_DEPENDENCIES),\n ...ownedElsewhere(API_CONSTRUCTS_DEPENDENCIES),\n ...ownedElsewhere(BUNDLE_DEPENDENCIES),\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ],\n py: ownedElsewhere(API_CONSTRUCTS_PY_DEPENDENCIES),\n});\n\nexport const TS_SMITHY_API_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsSmithyApiGenerator = async (\n tree: Tree,\n options: TsSmithyApiGeneratorSchema,\n): Promise<GeneratorCallback> => {\n if (\n (options.infra as string) !== 'rest-lambda' &&\n (options.infra as string) !== 'none'\n ) {\n throw new Error(\n `Unsupported infra '${options.infra}' for Smithy TypeScript API. ` +\n `Only 'rest-lambda' (API Gateway REST API) is supported.`,\n );\n }\n\n const integrationPattern = getIntegrationPattern(options);\n const apiNameClassName = toClassName(options.name);\n const apiNameKebabCase = toKebabCase(options.name);\n const { fullyQualifiedName: backendFullyQualifiedName, dir } =\n getTsLibDetails(tree, options);\n const modelProjectName = `${apiNameKebabCase}-model`;\n\n let projectExists: boolean;\n try {\n readProjectConfigurationUnqualified(tree, backendFullyQualifiedName);\n projectExists = true;\n } catch {\n projectExists = false;\n }\n\n if (!projectExists) {\n // Generate the model project\n await smithyProjectGenerator(tree, {\n name: modelProjectName,\n serviceName: apiNameClassName,\n namespace: options.namespace,\n directory: dir,\n subDirectory: 'model',\n preferInstallDependencies: false,\n });\n\n // Generate the backend project\n await tsProjectGenerator(tree, {\n name: options.name,\n directory: dir,\n subDirectory: 'backend',\n preferInstallDependencies: false,\n });\n }\n\n // Add metadata to associate backend project with model project\n const modelProjectConfig = readProjectConfigurationUnqualified(\n tree,\n modelProjectName,\n );\n updateProjectConfiguration(tree, modelProjectConfig.name, {\n ...modelProjectConfig,\n metadata: {\n ...modelProjectConfig.metadata,\n backendProject: backendFullyQualifiedName,\n } as any,\n });\n\n // Recorded in the metadata below so the version sync can tell a CDK\n // project from a Terraform one; undefined when no infrastructure was\n // generated, in which case neither provider's packages were added.\n const iac =\n options.infra !== 'none' ? await resolveIac(tree, options.iac) : undefined;\n\n // Recorded here and read by the declaration's predicates, so the packages\n // added below are exactly the ones the version sync will own.\n const metadata: TsSmithyApiMetadata = {\n apiName: options.name,\n auth: options.auth,\n modelProject: modelProjectConfig.name,\n ...(iac ? { iac } : {}),\n };\n\n addGeneratorMetadata(\n tree,\n backendFullyQualifiedName,\n TS_SMITHY_API_GENERATOR_INFO,\n metadata,\n );\n\n const backendProjectConfig = readProjectConfigurationUnqualified(\n tree,\n backendFullyQualifiedName,\n );\n const port = assignPort(tree, backendProjectConfig, 3001);\n\n // Delete default index.ts with \"hello\" function\n tree.delete(joinPathFragments(backendProjectConfig.sourceRoot, 'index.ts'));\n\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n backendProjectConfig.sourceRoot,\n {\n apiNameClassName,\n port,\n ...esmVars(tree),\n },\n );\n\n if (options.infra !== 'none') {\n if (options.auth === 'custom') {\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n '..',\n '..',\n '..',\n 'utils',\n 'api-constructs',\n 'files',\n 'cdk',\n 'authorizer',\n 'rest',\n ),\n backendProjectConfig.sourceRoot,\n {},\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n }\n\n // Add infrastructure\n await sharedConstructsGenerator(\n tree,\n {\n iac,\n },\n DEPENDENCIES,\n );\n await addApiGatewayInfra(\n tree,\n {\n iac,\n apiProjectName: backendFullyQualifiedName,\n apiNameClassName,\n apiNameKebabCase,\n auth: options.auth,\n constructType: 'rest',\n backend: {\n type: 'smithy',\n bundleOutputDir: joinPathFragments(\n 'dist',\n backendProjectConfig.root,\n 'bundle',\n ),\n integrationPattern,\n ...(options.auth === 'custom' && {\n authorizerBundleOutputDir: joinPathFragments(\n 'dist',\n backendProjectConfig.root,\n 'bundle',\n 'authorizer',\n ),\n }),\n },\n },\n DEPENDENCIES,\n );\n addSharedConstructsOpenApiMetadataGenerateTarget(tree, {\n iac,\n apiNameKebabCase,\n specPath: joinPathFragments(\n 'dist',\n modelProjectConfig.root,\n 'build',\n 'openapi',\n 'openapi.json',\n ),\n specBuildTargetName: `${modelProjectConfig.name}:build`,\n integrationPattern,\n });\n\n // Add bundle target using rolldown\n await addTypeScriptBundleTarget(\n tree,\n backendProjectConfig,\n {\n targetFilePath: 'src/handler.ts',\n external: [/@aws-sdk\\/.*/], // lambda runtime provides aws sdk\n },\n DEPENDENCIES,\n );\n\n if (options.auth === 'custom') {\n await addTypeScriptBundleTarget(\n tree,\n backendProjectConfig,\n {\n targetFilePath: 'src/authorizer.ts',\n bundleOutputDir: 'authorizer',\n external: [/@aws-sdk\\/.*/],\n },\n DEPENDENCIES,\n );\n }\n }\n\n const cmd = new FsCommands(tree, DEPENDENCIES);\n const generatedSrcDirFromRoot = '{projectRoot}/src/generated';\n\n // Target for copying the ssdk built by the model\n backendProjectConfig.targets['copy-ssdk'] = {\n cache: true,\n inputs: [\n {\n dependentTasksOutputFiles: '**/*',\n },\n ],\n executor: 'nx:run-commands',\n options: {\n commands: [\n cmd.rm(generatedSrcDirFromRoot),\n cmd.mkdir(generatedSrcDirFromRoot),\n cmd.cpDir(\n joinPathFragments('dist', modelProjectConfig.root, 'build', 'ssdk'),\n joinPathFragments(generatedSrcDirFromRoot, 'ssdk'),\n ),\n ],\n parallel: false,\n },\n outputs: ['{projectRoot}/src/generated'],\n dependsOn: [`${modelProjectConfig.name}:build`],\n };\n addDependencyToTargetIfNotPresent(\n backendProjectConfig,\n 'compile',\n 'copy-ssdk',\n );\n\n // Add a project which continuously copies based on changes to the model project\n // This allows the \"serve\" target to hot reload when the smithy model is changed\n backendProjectConfig.targets['watch-copy-ssdk'] = {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n command: `nx watch --projects=${modelProjectConfig.name} --includeDependencies -- nx run ${backendFullyQualifiedName}:copy-ssdk`,\n },\n };\n\n // Add serve target for running the server locally\n backendProjectConfig.targets.serve = normalizeTargetKeyOrder({\n executor: 'nx:run-commands',\n continuous: true,\n dependsOn: ['copy-ssdk', 'watch-copy-ssdk'],\n options: {\n command: 'tsx --watch src/local-server.ts',\n cwd: '{projectRoot}',\n },\n });\n\n const existingDevDependsOn =\n backendProjectConfig.targets['dev']?.dependsOn ?? [];\n\n backendProjectConfig.targets['dev'] = normalizeTargetKeyOrder({\n ...backendProjectConfig.targets.serve,\n // Own copy of dependsOn so adding dev dependencies below doesn't\n // mutate the shared array referenced by the serve target.\n dependsOn: [...(backendProjectConfig.targets.serve.dependsOn ?? [])],\n options: {\n ...backendProjectConfig.targets.serve.options,\n env: {\n LOCAL_DEV: 'true',\n },\n },\n });\n\n // Preserve any dependencies added to dev by connection generators\n for (const dependency of existingDevDependsOn) {\n addDependencyToTargetIfNotPresent(backendProjectConfig, 'dev', dependency);\n }\n\n // Ignore generated code\n updateGitIgnore(tree, backendProjectConfig.root, (patterns) => [\n ...patterns,\n 'src/generated',\n ]);\n\n updateProjectConfiguration(\n tree,\n backendFullyQualifiedName,\n backendProjectConfig,\n );\n\n addTsDependencies(tree, DEPENDENCIES, {\n metadata,\n projectRoot: backendProjectConfig.root,\n });\n\n await addGeneratorMetricsIfApplicable(tree, [TS_SMITHY_API_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nconst getIntegrationPattern = (\n options: TsSmithyApiGeneratorSchema,\n): 'isolated' | 'shared' => options.integrationPattern ?? 'isolated';\n\nexport default tsSmithyApiGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","tsProjectGenerator","getTsLibDetails","addTsDependencies","API_CONSTRUCTS_DEPENDENCIES","API_CONSTRUCTS_PY_DEPENDENCIES","addApiGatewayInfra","addSharedConstructsOpenApiMetadataGenerateTarget","addTypeScriptBundleTarget","BUNDLE_DEPENDENCIES","declareDependencies","ownedElsewhere","formatFilesInSubtree","FS_DEPENDENCIES","FsCommands","updateGitIgnore","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","esmVars","toClassName","toKebabCase","addDependencyToTargetIfNotPresent","addGeneratorMetadata","getGeneratorInfo","normalizeTargetKeyOrder","readProjectConfigurationUnqualified","assignPort","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","smithyProjectGenerator","DEPENDENCIES","ts","name","when","m","auth","dev","root","py","TS_SMITHY_API_GENERATOR_INFO","filename","tsSmithyApiGenerator","tree","options","infra","Error","integrationPattern","getIntegrationPattern","apiNameClassName","apiNameKebabCase","fullyQualifiedName","backendFullyQualifiedName","dir","modelProjectName","projectExists","serviceName","namespace","directory","subDirectory","preferInstallDependencies","modelProjectConfig","metadata","backendProject","iac","undefined","apiName","modelProject","backendProjectConfig","port","delete","sourceRoot","dirname","overwriteStrategy","KeepExisting","apiProjectName","constructType","backend","type","bundleOutputDir","authorizerBundleOutputDir","specPath","specBuildTargetName","targetFilePath","external","cmd","generatedSrcDirFromRoot","targets","cache","inputs","dependentTasksOutputFiles","executor","commands","rm","mkdir","cpDir","parallel","outputs","dependsOn","continuous","command","serve","cwd","existingDevDependsOn","env","LOCAL_DEV","dependency","patterns","projectRoot","languages"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../packages/nx-plugin/src/smithy/ts/api/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport tsProjectGenerator, {\n getTsLibDetails,\n} from '../../../ts/lib/generator.js';\nimport { addTsDependencies } from '../../../utils/add-dependencies.js';\nimport {\n API_CONSTRUCTS_DEPENDENCIES,\n API_CONSTRUCTS_PY_DEPENDENCIES,\n addApiGatewayInfra,\n} from '../../../utils/api-constructs/api-constructs.js';\nimport { addSharedConstructsOpenApiMetadataGenerateTarget } from '../../../utils/api-constructs/open-api-metadata.js';\nimport {\n addTypeScriptBundleTarget,\n BUNDLE_DEPENDENCIES,\n} from '../../../utils/bundle/bundle.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../../utils/declared-dependencies.js';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\nimport { FS_DEPENDENCIES, FsCommands } from '../../../utils/fs.js';\nimport { updateGitIgnore } from '../../../utils/git.js';\nimport { resolveIac } from '../../../utils/iac.js';\nimport { installDependencies } from '../../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics.js';\nimport { esmVars } from '../../../utils/module-format.js';\nimport { toClassName, toKebabCase } from '../../../utils/names.js';\nimport {\n addDependencyToTargetIfNotPresent,\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n normalizeTargetKeyOrder,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx.js';\nimport { assignPort } from '../../../utils/port.js';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../../utils/shared-constructs.js';\nimport type { IacMetadata } from '../../../utils/shared-constructs-constants.js';\nimport smithyProjectGenerator from '../../project/generator.js';\nimport type { TsSmithyApiGeneratorSchema } from './schema';\n\n/** The metadata this generator records, which its predicates read. */\nexport interface TsSmithyApiMetadata extends IacMetadata {\n readonly apiName: string;\n readonly auth: TsSmithyApiGeneratorSchema['auth'];\n readonly modelProject: string;\n}\n\n// Each entry names the branch it belongs to, so the same declaration drives both\n// adding and the version sync.\nexport const DEPENDENCIES = declareDependencies<TsSmithyApiMetadata>()({\n ts: [\n { name: '@smithy/server-apigateway' },\n { name: '@smithy/server-node' },\n { name: '@middy/core' },\n { name: '@aws-lambda-powertools/logger' },\n { name: '@aws-lambda-powertools/parameters' },\n { name: '@aws-lambda-powertools/tracer' },\n { name: '@aws-lambda-powertools/metrics' },\n { name: '@aws-sdk/client-appconfigdata' },\n // The custom authorizer handler parses its event.\n { name: '@aws-lambda-powertools/parser', when: (m) => m.auth === 'custom' },\n { name: '@types/aws-lambda', dev: true },\n // tsx runs the local server from the workspace root.\n { name: 'tsx', dev: true, root: true },\n ...ownedElsewhere(FS_DEPENDENCIES),\n ...ownedElsewhere(API_CONSTRUCTS_DEPENDENCIES),\n ...ownedElsewhere(BUNDLE_DEPENDENCIES),\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ],\n py: ownedElsewhere(API_CONSTRUCTS_PY_DEPENDENCIES),\n});\n\nexport const TS_SMITHY_API_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsSmithyApiGenerator = async (\n tree: Tree,\n options: TsSmithyApiGeneratorSchema,\n): Promise<GeneratorCallback> => {\n if (\n (options.infra as string) !== 'rest-lambda' &&\n (options.infra as string) !== 'none'\n ) {\n throw new Error(\n `Unsupported infra '${options.infra}' for Smithy TypeScript API. ` +\n `Only 'rest-lambda' (API Gateway REST API) is supported.`,\n );\n }\n\n const integrationPattern = getIntegrationPattern(options);\n const apiNameClassName = toClassName(options.name);\n const apiNameKebabCase = toKebabCase(options.name);\n const { fullyQualifiedName: backendFullyQualifiedName, dir } =\n getTsLibDetails(tree, options);\n const modelProjectName = `${apiNameKebabCase}-model`;\n\n let projectExists: boolean;\n try {\n readProjectConfigurationUnqualified(tree, backendFullyQualifiedName);\n projectExists = true;\n } catch {\n projectExists = false;\n }\n\n if (!projectExists) {\n // Generate the model project\n await smithyProjectGenerator(tree, {\n name: modelProjectName,\n serviceName: apiNameClassName,\n namespace: options.namespace,\n directory: dir,\n subDirectory: 'model',\n preferInstallDependencies: false,\n });\n\n // Generate the backend project\n await tsProjectGenerator(tree, {\n name: options.name,\n directory: dir,\n subDirectory: 'backend',\n preferInstallDependencies: false,\n });\n }\n\n // Add metadata to associate backend project with model project\n const modelProjectConfig = readProjectConfigurationUnqualified(\n tree,\n modelProjectName,\n );\n updateProjectConfiguration(tree, modelProjectConfig.name, {\n ...modelProjectConfig,\n metadata: {\n ...modelProjectConfig.metadata,\n backendProject: backendFullyQualifiedName,\n } as any,\n });\n\n // Recorded in the metadata below so the version sync can tell a CDK\n // project from a Terraform one; undefined when no infrastructure was\n // generated, in which case neither provider's packages were added.\n const iac =\n options.infra !== 'none' ? await resolveIac(tree, options.iac) : undefined;\n\n // Recorded here and read by the declaration's predicates, so the packages\n // added below are exactly the ones the version sync will own.\n const metadata: TsSmithyApiMetadata = {\n apiName: options.name,\n auth: options.auth,\n modelProject: modelProjectConfig.name,\n ...(iac ? { iac } : {}),\n };\n\n addGeneratorMetadata(\n tree,\n backendFullyQualifiedName,\n TS_SMITHY_API_GENERATOR_INFO,\n metadata,\n );\n\n const backendProjectConfig = readProjectConfigurationUnqualified(\n tree,\n backendFullyQualifiedName,\n );\n const port = assignPort(tree, backendProjectConfig, 3001);\n\n if (!projectExists) {\n // Delete default index.ts with \"hello\" function\n tree.delete(joinPathFragments(backendProjectConfig.sourceRoot, 'index.ts'));\n }\n\n // The API's source is user-owned, so a re-run leaves existing files alone.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n backendProjectConfig.sourceRoot,\n {\n apiNameClassName,\n port,\n ...esmVars(tree),\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n if (options.infra !== 'none') {\n if (options.auth === 'custom') {\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n '..',\n '..',\n '..',\n 'utils',\n 'api-constructs',\n 'files',\n 'cdk',\n 'authorizer',\n 'rest',\n ),\n backendProjectConfig.sourceRoot,\n {},\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n }\n\n // Add infrastructure\n await sharedConstructsGenerator(\n tree,\n {\n iac,\n },\n DEPENDENCIES,\n );\n await addApiGatewayInfra(\n tree,\n {\n iac,\n apiProjectName: backendFullyQualifiedName,\n apiNameClassName,\n apiNameKebabCase,\n auth: options.auth,\n constructType: 'rest',\n backend: {\n type: 'smithy',\n bundleOutputDir: joinPathFragments(\n 'dist',\n backendProjectConfig.root,\n 'bundle',\n ),\n integrationPattern,\n ...(options.auth === 'custom' && {\n authorizerBundleOutputDir: joinPathFragments(\n 'dist',\n backendProjectConfig.root,\n 'bundle',\n 'authorizer',\n ),\n }),\n },\n },\n DEPENDENCIES,\n );\n addSharedConstructsOpenApiMetadataGenerateTarget(tree, {\n iac,\n apiNameKebabCase,\n specPath: joinPathFragments(\n 'dist',\n modelProjectConfig.root,\n 'build',\n 'openapi',\n 'openapi.json',\n ),\n specBuildTargetName: `${modelProjectConfig.name}:build`,\n integrationPattern,\n });\n\n // Add bundle target using rolldown\n await addTypeScriptBundleTarget(\n tree,\n backendProjectConfig,\n {\n targetFilePath: 'src/handler.ts',\n external: [/@aws-sdk\\/.*/], // lambda runtime provides aws sdk\n },\n DEPENDENCIES,\n );\n\n if (options.auth === 'custom') {\n await addTypeScriptBundleTarget(\n tree,\n backendProjectConfig,\n {\n targetFilePath: 'src/authorizer.ts',\n bundleOutputDir: 'authorizer',\n external: [/@aws-sdk\\/.*/],\n },\n DEPENDENCIES,\n );\n }\n }\n\n const cmd = new FsCommands(tree, DEPENDENCIES);\n const generatedSrcDirFromRoot = '{projectRoot}/src/generated';\n\n // Target for copying the ssdk built by the model\n backendProjectConfig.targets['copy-ssdk'] = {\n cache: true,\n inputs: [\n {\n dependentTasksOutputFiles: '**/*',\n },\n ],\n executor: 'nx:run-commands',\n options: {\n commands: [\n cmd.rm(generatedSrcDirFromRoot),\n cmd.mkdir(generatedSrcDirFromRoot),\n cmd.cpDir(\n joinPathFragments('dist', modelProjectConfig.root, 'build', 'ssdk'),\n joinPathFragments(generatedSrcDirFromRoot, 'ssdk'),\n ),\n ],\n parallel: false,\n },\n outputs: ['{projectRoot}/src/generated'],\n dependsOn: [`${modelProjectConfig.name}:build`],\n };\n addDependencyToTargetIfNotPresent(\n backendProjectConfig,\n 'compile',\n 'copy-ssdk',\n );\n\n // Add a project which continuously copies based on changes to the model project\n // This allows the \"serve\" target to hot reload when the smithy model is changed\n backendProjectConfig.targets['watch-copy-ssdk'] = {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n command: `nx watch --projects=${modelProjectConfig.name} --includeDependencies -- nx run ${backendFullyQualifiedName}:copy-ssdk`,\n },\n };\n\n // Add serve target for running the server locally\n backendProjectConfig.targets.serve = normalizeTargetKeyOrder({\n executor: 'nx:run-commands',\n continuous: true,\n dependsOn: ['copy-ssdk', 'watch-copy-ssdk'],\n options: {\n command: 'tsx --watch src/local-server.ts',\n cwd: '{projectRoot}',\n },\n });\n\n const existingDevDependsOn =\n backendProjectConfig.targets['dev']?.dependsOn ?? [];\n\n backendProjectConfig.targets['dev'] = normalizeTargetKeyOrder({\n ...backendProjectConfig.targets.serve,\n // Own copy of dependsOn so adding dev dependencies below doesn't\n // mutate the shared array referenced by the serve target.\n dependsOn: [...(backendProjectConfig.targets.serve.dependsOn ?? [])],\n options: {\n ...backendProjectConfig.targets.serve.options,\n env: {\n LOCAL_DEV: 'true',\n },\n },\n });\n\n // Preserve any dependencies added to dev by connection generators\n for (const dependency of existingDevDependsOn) {\n addDependencyToTargetIfNotPresent(backendProjectConfig, 'dev', dependency);\n }\n\n // Ignore generated code\n updateGitIgnore(tree, backendProjectConfig.root, (patterns) => [\n ...patterns,\n 'src/generated',\n ]);\n\n updateProjectConfiguration(\n tree,\n backendFullyQualifiedName,\n backendProjectConfig,\n );\n\n addTsDependencies(tree, DEPENDENCIES, {\n metadata,\n projectRoot: backendProjectConfig.root,\n });\n\n await addGeneratorMetricsIfApplicable(tree, [TS_SMITHY_API_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nconst getIntegrationPattern = (\n options: TsSmithyApiGeneratorSchema,\n): 'isolated' | 'shared' => options.integrationPattern ?? 'isolated';\n\nexport default tsSmithyApiGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","tsProjectGenerator","getTsLibDetails","addTsDependencies","API_CONSTRUCTS_DEPENDENCIES","API_CONSTRUCTS_PY_DEPENDENCIES","addApiGatewayInfra","addSharedConstructsOpenApiMetadataGenerateTarget","addTypeScriptBundleTarget","BUNDLE_DEPENDENCIES","declareDependencies","ownedElsewhere","formatFilesInSubtree","FS_DEPENDENCIES","FsCommands","updateGitIgnore","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","esmVars","toClassName","toKebabCase","addDependencyToTargetIfNotPresent","addGeneratorMetadata","getGeneratorInfo","normalizeTargetKeyOrder","readProjectConfigurationUnqualified","assignPort","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","smithyProjectGenerator","DEPENDENCIES","ts","name","when","m","auth","dev","root","py","TS_SMITHY_API_GENERATOR_INFO","filename","tsSmithyApiGenerator","tree","options","infra","Error","integrationPattern","getIntegrationPattern","apiNameClassName","apiNameKebabCase","fullyQualifiedName","backendFullyQualifiedName","dir","modelProjectName","projectExists","serviceName","namespace","directory","subDirectory","preferInstallDependencies","modelProjectConfig","metadata","backendProject","iac","undefined","apiName","modelProject","backendProjectConfig","port","delete","sourceRoot","dirname","overwriteStrategy","KeepExisting","apiProjectName","constructType","backend","type","bundleOutputDir","authorizerBundleOutputDir","specPath","specBuildTargetName","targetFilePath","external","cmd","generatedSrcDirFromRoot","targets","cache","inputs","dependentTasksOutputFiles","executor","commands","rm","mkdir","cpDir","parallel","outputs","dependsOn","continuous","command","serve","cwd","existingDevDependsOn","env","LOCAL_DEV","dependency","patterns","projectRoot","languages"],"mappings":"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"}
|
|
@@ -112,9 +112,11 @@ export async function terraformProjectGenerator(tree, schema) {
|
|
|
112
112
|
const distDir = joinPathFragments(outDirToRootRelativePath, 'dist', '{projectRoot}');
|
|
113
113
|
const tfDistDir = joinPathFragments(distDir, 'terraform');
|
|
114
114
|
const checkovReportJsonPath = joinPathFragments(distDir, 'checkov', 'checkov_report.json');
|
|
115
|
-
// `test`
|
|
116
|
-
// never races the backend-configured targets
|
|
115
|
+
// `test` and `validate` each keep their `.terraform` here rather than in
|
|
116
|
+
// `src`, so initialising one never races the backend-configured targets, or
|
|
117
|
+
// the other, over the shared one.
|
|
117
118
|
const testDataDir = joinPathFragments(distDir, 'terraform-test');
|
|
119
|
+
const validateDataDir = joinPathFragments(distDir, 'terraform-validate');
|
|
118
120
|
// Provider downloads persist here, so a target whose `.terraform` was cleaned
|
|
119
121
|
// links the providers it already has rather than re-downloading them. Nx does
|
|
120
122
|
// not interpolate `{workspaceRoot}` inside `env`, so this is relative to the
|
|
@@ -369,20 +371,37 @@ export async function terraformProjectGenerator(tree, schema) {
|
|
|
369
371
|
}
|
|
370
372
|
}
|
|
371
373
|
},
|
|
374
|
+
// Mirrors `test`: `-backend=false` installs the modules and providers
|
|
375
|
+
// validation needs without configuring the S3 backend, so this runs on a
|
|
376
|
+
// fresh workspace before `bootstrap` and needs no credentials. `TF_DATA_DIR`
|
|
377
|
+
// keeps that `.terraform` out of `src`, so it never races the
|
|
378
|
+
// backend-configured targets over the shared one, and declaring no outputs
|
|
379
|
+
// keeps a cache hit to what it asserts (see `test` above).
|
|
372
380
|
validate: {
|
|
373
381
|
executor: 'nx:run-commands',
|
|
374
382
|
cache: true,
|
|
375
383
|
inputs: [
|
|
376
|
-
'default'
|
|
384
|
+
'default',
|
|
385
|
+
'^production'
|
|
377
386
|
],
|
|
387
|
+
outputs: [],
|
|
378
388
|
options: {
|
|
379
|
-
|
|
389
|
+
commands: [
|
|
390
|
+
{
|
|
391
|
+
command: `shx mkdir -p ${pluginCacheDir}`,
|
|
392
|
+
forwardAllArgs: false
|
|
393
|
+
},
|
|
394
|
+
'terraform init -backend=false',
|
|
395
|
+
'terraform validate'
|
|
396
|
+
],
|
|
380
397
|
forwardAllArgs: true,
|
|
381
|
-
cwd: '{projectRoot}/src'
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
398
|
+
cwd: '{projectRoot}/src',
|
|
399
|
+
parallel: false,
|
|
400
|
+
env: {
|
|
401
|
+
TF_DATA_DIR: validateDataDir,
|
|
402
|
+
TF_PLUGIN_CACHE_DIR: pluginCacheDir
|
|
403
|
+
}
|
|
404
|
+
}
|
|
386
405
|
}
|
|
387
406
|
};
|
|
388
407
|
const projectConfiguration = {
|
|
@@ -406,12 +425,17 @@ export async function terraformProjectGenerator(tree, schema) {
|
|
|
406
425
|
addGeneratorMetadata(tree, lib.fullyQualifiedName, TERRAFORM_PROJECT_GENERATOR_INFO, {
|
|
407
426
|
iac: 'terraform'
|
|
408
427
|
});
|
|
428
|
+
// The guides tell the reader to declare resources in `main.tf`, add variables
|
|
429
|
+
// and outputs, and configure environments in `env/*.tfvars`, so everything
|
|
430
|
+
// here is scaffolded once and then left alone. Provider version bumps reach
|
|
431
|
+
// `providers.tf` through the vended version sync, which rewrites the pin in
|
|
432
|
+
// place rather than the whole file.
|
|
409
433
|
generateFiles(tree, joinPathFragments(import.meta.dirname, `./files/${schema.type}`), lib.dir, {
|
|
410
434
|
metricsModulePath,
|
|
411
435
|
stateKeyPrefix: kebabCase(lib.fullyQualifiedName),
|
|
412
436
|
...terraformProviderVersions()
|
|
413
437
|
}, {
|
|
414
|
-
overwriteStrategy: OverwriteStrategy.
|
|
438
|
+
overwriteStrategy: OverwriteStrategy.KeepExisting
|
|
415
439
|
});
|
|
416
440
|
// Checkov skips are the user's to curate, so preserve any they have added.
|
|
417
441
|
generateFiles(tree, joinPathFragments(import.meta.dirname, './files/checkov'), lib.dir, {}, {
|