@aws/nx-plugin 1.0.0-rc.3 → 1.0.0-rc.31
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 +6746 -6133
- package/README.md +7 -7
- package/executors.json +9 -0
- package/generators.json +100 -1
- package/package.json +35 -17
- package/src/agentcore-gateway/attach-upstream.d.ts +33 -0
- package/src/agentcore-gateway/attach-upstream.js +38 -0
- package/src/agentcore-gateway/attach-upstream.js.map +1 -0
- package/src/agentcore-gateway/files/cedar/policies/README.md +52 -0
- package/src/agentcore-gateway/files/cedar/policies/permit-all.cedar +11 -0
- package/src/agentcore-gateway/files/project/local-dev.ts.template +134 -0
- package/src/agentcore-gateway/gateway-connection/generator.d.ts +21 -0
- package/src/agentcore-gateway/gateway-connection/generator.js +101 -0
- package/src/agentcore-gateway/gateway-connection/generator.js.map +1 -0
- package/src/agentcore-gateway/gateway-connection/schema.d.js +6 -0
- package/src/agentcore-gateway/gateway-connection/schema.d.js.map +1 -0
- package/src/agentcore-gateway/gateway-connection/schema.d.ts +13 -0
- package/src/agentcore-gateway/gateway-connection/schema.json +31 -0
- package/src/agentcore-gateway/generator.d.ts +25 -0
- package/src/agentcore-gateway/generator.js +149 -0
- package/src/agentcore-gateway/generator.js.map +1 -0
- package/src/agentcore-gateway/mcp-connection/generator.d.ts +19 -0
- package/src/agentcore-gateway/mcp-connection/generator.js +59 -0
- package/src/agentcore-gateway/mcp-connection/generator.js.map +1 -0
- package/src/agentcore-gateway/mcp-connection/schema.d.js +6 -0
- package/src/agentcore-gateway/mcp-connection/schema.d.js.map +1 -0
- package/src/agentcore-gateway/mcp-connection/schema.d.ts +13 -0
- package/src/agentcore-gateway/mcp-connection/schema.json +31 -0
- package/src/agentcore-gateway/schema.d.js +6 -0
- package/src/agentcore-gateway/schema.d.js.map +1 -0
- package/src/agentcore-gateway/schema.d.ts +17 -0
- package/src/agentcore-gateway/schema.json +70 -0
- package/src/bin/aws-nx-mcp.js +14 -0
- package/src/bin/aws-nx-mcp.js.map +1 -0
- package/src/connection/{agent-serve-local.d.ts → agent-local-dev.d.ts} +7 -7
- package/src/connection/agent-local-dev.js +42 -0
- package/src/connection/agent-local-dev.js.map +1 -0
- package/src/connection/agent-runtime-config.d.ts +1 -1
- package/src/connection/agent-runtime-config.js +9 -14
- package/src/connection/agent-runtime-config.js.map +1 -1
- package/src/connection/generator.d.ts +7 -14
- package/src/connection/generator.js +158 -177
- package/src/connection/generator.js.map +1 -1
- package/src/connection/local-dev.d.ts +15 -0
- package/src/connection/local-dev.js +37 -0
- package/src/connection/local-dev.js.map +1 -0
- package/src/connection/schema.d.js +6 -0
- package/src/connection/schema.d.js.map +1 -0
- package/src/connection/schema.d.ts +1 -0
- package/src/connection/schema.json +5 -0
- package/src/connection/supported-connections.d.ts +98 -0
- package/src/connection/supported-connections.js +138 -0
- package/src/connection/supported-connections.js.map +1 -0
- package/src/index.js +2 -5
- package/src/index.js.map +1 -1
- package/src/infra/app/__snapshots__/generator.spec.ts.snap +51 -81
- package/src/infra/app/generator.d.ts +3 -3
- package/src/infra/app/generator.js +141 -123
- package/src/infra/app/generator.js.map +1 -1
- package/src/infra/app/schema.d.js +6 -0
- package/src/infra/app/schema.d.js.map +1 -0
- package/src/infra/app/schema.d.ts +1 -1
- package/src/infra/app/schema.json +5 -0
- package/src/license/__snapshots__/config.spec.ts.snap +23 -0
- package/src/license/config-types.d.ts +18 -1
- package/src/license/config-types.js +8 -2
- package/src/license/config-types.js.map +1 -1
- package/src/license/config.d.ts +65 -7
- package/src/license/config.js +442 -109
- package/src/license/config.js.map +1 -1
- package/src/license/dependency-check/check.d.ts +16 -0
- package/src/license/dependency-check/check.js +116 -0
- package/src/license/dependency-check/check.js.map +1 -0
- package/src/license/dependency-check/collectors/collector.d.ts +21 -0
- package/src/license/dependency-check/collectors/collector.js +46 -0
- package/src/license/dependency-check/collectors/collector.js.map +1 -0
- package/src/license/dependency-check/collectors/npm-collector.d.ts +10 -0
- package/src/license/dependency-check/collectors/npm-collector.js +68 -0
- package/src/license/dependency-check/collectors/npm-collector.js.map +1 -0
- package/src/license/dependency-check/collectors/python-collector.d.ts +23 -0
- package/src/license/dependency-check/collectors/python-collector.js +114 -0
- package/src/license/dependency-check/collectors/python-collector.js.map +1 -0
- package/src/license/dependency-check/evaluator.d.ts +9 -0
- package/src/license/dependency-check/evaluator.js +94 -0
- package/src/license/dependency-check/evaluator.js.map +1 -0
- package/src/license/dependency-check/executor-schema.json +6 -0
- package/src/license/dependency-check/executor.d.ts +9 -0
- package/src/license/dependency-check/executor.js +51 -0
- package/src/license/dependency-check/executor.js.map +1 -0
- package/src/license/dependency-check/pre-approved.d.ts +6 -0
- package/src/license/dependency-check/pre-approved.js +1893 -0
- package/src/license/dependency-check/pre-approved.js.map +1 -0
- package/src/license/dependency-check/types.d.ts +45 -0
- package/src/license/dependency-check/types.js +6 -0
- package/src/license/dependency-check/types.js.map +1 -0
- package/src/license/generator.d.ts +3 -3
- package/src/license/generator.js +127 -30
- package/src/license/generator.js.map +1 -1
- package/src/license/index.d.ts +8 -0
- package/src/license/index.js +7 -0
- package/src/license/index.js.map +1 -0
- package/src/license/known-exceptions.d.ts +7 -0
- package/src/license/known-exceptions.js +39 -0
- package/src/license/known-exceptions.js.map +1 -0
- package/src/license/schema.d.js +6 -0
- package/src/license/schema.d.js.map +1 -0
- package/src/license/schema.d.ts +7 -0
- package/src/license/schema.json +11 -0
- package/src/license/sync/generator.d.ts +2 -2
- package/src/license/sync/generator.js +100 -125
- package/src/license/sync/generator.js.map +1 -1
- package/src/license/sync/project-file-sync.d.ts +3 -3
- package/src/license/sync/project-file-sync.js +28 -35
- package/src/license/sync/project-file-sync.js.map +1 -1
- package/src/mcp-server/generator-info.d.ts +5 -1
- package/src/mcp-server/generator-info.js +130 -160
- package/src/mcp-server/generator-info.js.map +1 -1
- package/src/mcp-server/guide-pipeline.d.ts +1 -1
- package/src/mcp-server/guide-pipeline.js +184 -206
- package/src/mcp-server/guide-pipeline.js.map +1 -1
- package/src/mcp-server/guide-render.js +10 -25
- package/src/mcp-server/guide-render.js.map +1 -1
- package/src/mcp-server/index.js +6 -10
- package/src/mcp-server/index.js.map +1 -1
- package/src/mcp-server/mdx-ast.js +42 -56
- package/src/mcp-server/mdx-ast.js.map +1 -1
- package/src/mcp-server/option-filter.js +33 -47
- package/src/mcp-server/option-filter.js.map +1 -1
- package/src/mcp-server/schema-registry.d.ts +9 -3
- package/src/mcp-server/schema-registry.js +41 -38
- package/src/mcp-server/schema-registry.js.map +1 -1
- package/src/mcp-server/schema.js +9 -7
- package/src/mcp-server/schema.js.map +1 -1
- package/src/mcp-server/server.js +20 -24
- package/src/mcp-server/server.js.map +1 -1
- package/src/mcp-server/tools/create-workspace-command.d.ts +1 -1
- package/src/mcp-server/tools/create-workspace-command.js +23 -24
- package/src/mcp-server/tools/create-workspace-command.js.map +1 -1
- package/src/mcp-server/tools/general-guidance.d.ts +2 -2
- package/src/mcp-server/tools/general-guidance.js +46 -25
- package/src/mcp-server/tools/general-guidance.js.map +1 -1
- package/src/mcp-server/tools/generator-guide.d.ts +2 -2
- package/src/mcp-server/tools/generator-guide.js +29 -37
- package/src/mcp-server/tools/generator-guide.js.map +1 -1
- package/src/mcp-server/tools/list-generators.d.ts +2 -2
- package/src/mcp-server/tools/list-generators.js +19 -25
- package/src/mcp-server/tools/list-generators.js.map +1 -1
- package/src/open-api/ts-client/__snapshots__/generator.additional-properties.spec.ts.snap +147 -33
- package/src/open-api/ts-client/__snapshots__/generator.arrays.spec.ts.snap +308 -75
- package/src/open-api/ts-client/__snapshots__/generator.complex-types.spec.ts.snap +286 -62
- package/src/open-api/ts-client/__snapshots__/generator.composite-types.spec.ts.snap +674 -93
- package/src/open-api/ts-client/__snapshots__/generator.content-type.spec.ts.snap +147 -33
- package/src/open-api/ts-client/__snapshots__/generator.duplicate-types.spec.ts.snap +196 -44
- package/src/open-api/ts-client/__snapshots__/generator.edge-cases.spec.ts.snap +5507 -0
- package/src/open-api/ts-client/__snapshots__/generator.fast-api.spec.ts.snap +219 -60
- package/src/open-api/ts-client/__snapshots__/generator.primitive-types.spec.ts.snap +351 -80
- package/src/open-api/ts-client/__snapshots__/generator.request.spec.ts.snap +170 -49
- package/src/open-api/ts-client/__snapshots__/generator.reserved-keywords.spec.ts.snap +99 -23
- package/src/open-api/ts-client/__snapshots__/generator.response.spec.ts.snap +147 -33
- package/src/open-api/ts-client/__snapshots__/generator.streaming.spec.ts.snap +392 -88
- package/src/open-api/ts-client/__snapshots__/generator.tags.spec.ts.snap +196 -44
- package/src/open-api/ts-client/files/client.gen.ts.template +130 -18
- package/src/open-api/ts-client/files/types.gen.ts.template +4 -4
- package/src/open-api/ts-client/generator.d.ts +3 -3
- package/src/open-api/ts-client/generator.js +16 -26
- package/src/open-api/ts-client/generator.js.map +1 -1
- package/src/open-api/ts-client/schema.d.js +6 -0
- package/src/open-api/ts-client/schema.d.js.map +1 -0
- package/src/open-api/ts-hooks/files/options-proxy.gen.ts.template +5 -0
- package/src/open-api/ts-hooks/generator.d.ts +3 -3
- package/src/open-api/ts-hooks/generator.js +13 -21
- package/src/open-api/ts-hooks/generator.js.map +1 -1
- package/src/open-api/ts-hooks/generator.spec.tsx +84 -14
- package/src/open-api/ts-hooks/schema.d.js +6 -0
- package/src/open-api/ts-hooks/schema.d.js.map +1 -0
- package/src/open-api/ts-metadata/generator.d.ts +3 -3
- package/src/open-api/ts-metadata/generator.js +12 -20
- package/src/open-api/ts-metadata/generator.js.map +1 -1
- package/src/open-api/ts-metadata/schema.d.js +6 -0
- package/src/open-api/ts-metadata/schema.d.js.map +1 -0
- package/src/open-api/utils/codegen-data/languages.d.ts +3 -5
- package/src/open-api/utils/codegen-data/languages.js +53 -66
- package/src/open-api/utils/codegen-data/languages.js.map +1 -1
- package/src/open-api/utils/codegen-data/types.d.ts +240 -10
- package/src/open-api/utils/codegen-data/types.js +54 -30
- package/src/open-api/utils/codegen-data/types.js.map +1 -1
- package/src/open-api/utils/codegen-data.d.ts +8 -4
- package/src/open-api/utils/codegen-data.js +398 -674
- package/src/open-api/utils/codegen-data.js.map +1 -1
- package/src/open-api/utils/normalise.d.ts +5 -1
- package/src/open-api/utils/normalise.js +386 -247
- package/src/open-api/utils/normalise.js.map +1 -1
- package/src/open-api/utils/parse.d.ts +2 -2
- package/src/open-api/utils/parse.js +11 -13
- package/src/open-api/utils/parse.js.map +1 -1
- package/src/open-api/utils/parser.d.ts +55 -0
- package/src/open-api/utils/parser.js +743 -0
- package/src/open-api/utils/parser.js.map +1 -0
- package/src/open-api/utils/refs.d.ts +1 -1
- package/src/open-api/utils/refs.js +12 -22
- package/src/open-api/utils/refs.js.map +1 -1
- package/src/open-api/utils/types.d.ts +15 -0
- package/src/open-api/utils/types.js +5 -2
- package/src/open-api/utils/types.js.map +1 -1
- package/src/preset/__snapshots__/generator.spec.ts.snap +160 -17
- package/src/preset/generator.d.ts +4 -4
- package/src/preset/generator.js +140 -112
- package/src/preset/generator.js.map +1 -1
- package/src/preset/schema.d.js +6 -0
- package/src/preset/schema.d.js.map +1 -0
- package/src/preset/schema.d.ts +4 -2
- package/src/preset/schema.json +10 -5
- package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +304 -0
- package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +734 -0
- package/src/py/agent/__snapshots__/{generator.spec.ts.snap → generator.protocols.spec.ts.snap} +80 -314
- package/src/py/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +189 -0
- package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client_strands.py.template +30 -0
- package/src/py/agent/a2a-connection/files/langchain/agent-connection/app/__targetAgentSnakeCase___client_langchain.py.template +28 -0
- package/src/py/agent/a2a-connection/generator.d.ts +3 -3
- package/src/py/agent/a2a-connection/generator.js +113 -85
- package/src/py/agent/a2a-connection/generator.js.map +1 -1
- package/src/py/agent/a2a-connection/schema.d.js +8 -0
- package/src/py/agent/a2a-connection/schema.d.js.map +1 -0
- package/src/py/agent/a2a-connection/schema.d.ts +1 -0
- package/src/py/agent/a2a-connection/schema.json +5 -0
- package/src/py/agent/files/a2a-langchain/main.py.template +89 -0
- package/src/py/agent/files/ag-ui-langchain/main.py.template +83 -0
- package/src/py/agent/files/common/agent.py.template +2 -0
- package/src/py/agent/files/common-langchain/agent.py.template +30 -0
- package/src/py/agent/files/http/init.py.template +7 -25
- package/src/py/agent/files/http/main.py.template +2 -3
- package/src/py/agent/files/http-langchain/main.py.template +84 -0
- package/src/py/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +184 -0
- package/src/py/agent/gateway-connection/files/agent-connection/app/__gatewaySnakeCase___client_strands.py.template +35 -0
- package/src/py/agent/gateway-connection/files/langchain/agent-connection/app/__gatewaySnakeCase___client_langchain.py.template +34 -0
- package/src/py/agent/gateway-connection/generator.d.ts +10 -0
- package/src/py/agent/gateway-connection/generator.js +119 -0
- package/src/py/agent/gateway-connection/generator.js.map +1 -0
- package/src/py/agent/gateway-connection/schema.d.js +6 -0
- package/src/py/agent/gateway-connection/schema.d.js.map +1 -0
- package/src/py/agent/gateway-connection/schema.d.ts +13 -0
- package/src/py/agent/gateway-connection/schema.json +31 -0
- package/src/py/agent/generator.d.ts +3 -3
- package/src/py/agent/generator.js +280 -180
- package/src/py/agent/generator.js.map +1 -1
- package/src/py/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +153 -89
- package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client_strands.py.template +30 -0
- package/src/py/agent/mcp-connection/files/langchain/agent-connection/app/__mcpServerSnakeCase___client_langchain.py.template +30 -0
- package/src/py/agent/mcp-connection/generator.d.ts +3 -3
- package/src/py/agent/mcp-connection/generator.js +65 -126
- package/src/py/agent/mcp-connection/generator.js.map +1 -1
- package/src/py/agent/mcp-connection/schema.d.js +8 -0
- package/src/py/agent/mcp-connection/schema.d.js.map +1 -0
- package/src/py/agent/mcp-connection/schema.d.ts +1 -0
- package/src/py/agent/mcp-connection/schema.json +5 -0
- package/src/py/agent/react-connection/__snapshots__/generator.spec.ts.snap +11 -19
- package/src/py/agent/react-connection/generator.d.ts +4 -4
- package/src/py/agent/react-connection/generator.js +55 -59
- package/src/py/agent/react-connection/generator.js.map +1 -1
- package/src/py/agent/react-connection/{serve-local.d.ts → local-dev.d.ts} +6 -6
- package/src/py/agent/react-connection/local-dev.js +36 -0
- package/src/py/agent/react-connection/local-dev.js.map +1 -0
- package/src/py/agent/react-connection/schema.d.js +8 -0
- package/src/py/agent/react-connection/schema.d.js.map +1 -0
- package/src/py/agent/react-connection/schema.d.ts +1 -0
- package/src/py/agent/react-connection/schema.json +5 -0
- package/src/py/agent/schema.d.js +6 -0
- package/src/py/agent/schema.d.js.map +1 -0
- package/src/py/agent/schema.d.ts +2 -1
- package/src/py/agent/schema.json +6 -1
- package/src/py/api/generator.d.ts +3 -3
- package/src/py/api/generator.js +12 -11
- package/src/py/api/generator.js.map +1 -1
- package/src/py/api/schema.d.js +6 -0
- package/src/py/api/schema.d.js.map +1 -0
- package/src/py/api/schema.d.ts +1 -0
- package/src/py/api/schema.json +5 -0
- package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +1526 -0
- package/src/py/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +45 -0
- package/src/py/dynamodb/agent-connection/generator.d.ts +10 -0
- package/src/py/dynamodb/agent-connection/generator.js +39 -0
- package/src/py/dynamodb/agent-connection/generator.js.map +1 -0
- package/src/py/dynamodb/agent-connection/schema.d.js +8 -0
- package/src/py/dynamodb/agent-connection/schema.d.js.map +1 -0
- package/src/py/dynamodb/agent-connection/schema.d.ts +15 -0
- package/src/py/dynamodb/agent-connection/schema.json +27 -0
- package/src/py/dynamodb/fast-api-connection/__snapshots__/generator.spec.ts.snap +23 -0
- package/src/py/dynamodb/fast-api-connection/generator.d.ts +10 -0
- package/src/py/dynamodb/fast-api-connection/generator.js +37 -0
- package/src/py/dynamodb/fast-api-connection/generator.js.map +1 -0
- package/src/py/dynamodb/fast-api-connection/schema.d.js +8 -0
- package/src/py/dynamodb/fast-api-connection/schema.d.js.map +1 -0
- package/src/py/dynamodb/fast-api-connection/schema.d.ts +13 -0
- package/src/py/dynamodb/fast-api-connection/schema.json +23 -0
- package/src/py/dynamodb/files/__name__/__init__.py.template +6 -0
- package/src/py/dynamodb/files/__name__/client.py.template +39 -0
- package/src/py/dynamodb/files/__name__/entities/__init__.py.template +4 -0
- package/src/py/dynamodb/files/__name__/entities/base.py.template +63 -0
- package/src/py/dynamodb/files/__name__/entities/example.py.template +64 -0
- package/src/py/dynamodb/files/config.json.template +24 -0
- package/src/py/dynamodb/generator.d.ts +10 -0
- package/src/py/dynamodb/generator.js +110 -0
- package/src/py/dynamodb/generator.js.map +1 -0
- package/src/py/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +45 -0
- package/src/py/dynamodb/mcp-server-connection/generator.d.ts +10 -0
- package/src/py/dynamodb/mcp-server-connection/generator.js +39 -0
- package/src/py/dynamodb/mcp-server-connection/generator.js.map +1 -0
- package/src/py/dynamodb/mcp-server-connection/schema.d.js +8 -0
- package/src/py/dynamodb/mcp-server-connection/schema.d.js.map +1 -0
- package/src/py/dynamodb/mcp-server-connection/schema.d.ts +15 -0
- package/src/py/dynamodb/mcp-server-connection/schema.json +27 -0
- package/src/py/dynamodb/schema.d.js +6 -0
- package/src/py/dynamodb/schema.d.js.map +1 -0
- package/src/py/dynamodb/schema.d.ts +16 -0
- package/src/py/dynamodb/schema.json +75 -0
- package/src/py/fast-api/__snapshots__/generator.spec.ts.snap +212 -4678
- package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +4833 -0
- package/src/py/fast-api/files/app/__name__/init.py.template +5 -22
- package/src/py/fast-api/files/app/__name__/main.py.template +4 -1
- package/src/py/fast-api/generator.d.ts +3 -3
- package/src/py/fast-api/generator.js +90 -87
- package/src/py/fast-api/generator.js.map +1 -1
- package/src/py/fast-api/react/__snapshots__/generator.spec.ts.snap +4 -3
- package/src/py/fast-api/react/generator.d.ts +4 -4
- package/src/py/fast-api/react/generator.js +25 -25
- package/src/py/fast-api/react/generator.js.map +1 -1
- package/src/py/fast-api/react/open-api.d.ts +1 -1
- package/src/py/fast-api/react/open-api.js +31 -29
- package/src/py/fast-api/react/open-api.js.map +1 -1
- package/src/py/fast-api/react/schema.d.js +6 -0
- package/src/py/fast-api/react/schema.d.js.map +1 -0
- package/src/py/fast-api/react/schema.d.ts +1 -0
- package/src/py/fast-api/react/schema.json +5 -0
- package/src/py/fast-api/schema.d.js +6 -0
- package/src/py/fast-api/schema.d.js.map +1 -0
- package/src/py/fast-api/schema.d.ts +1 -0
- package/src/py/fast-api/schema.json +5 -0
- package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +4 -4
- package/src/py/lambda-function/generator.d.ts +3 -3
- package/src/py/lambda-function/generator.js +60 -59
- package/src/py/lambda-function/generator.js.map +1 -1
- package/src/py/lambda-function/schema.d.js +6 -0
- package/src/py/lambda-function/schema.d.js.map +1 -0
- package/src/py/lambda-function/schema.d.ts +1 -0
- package/src/py/lambda-function/schema.json +5 -0
- package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +87 -17
- package/src/py/mcp-server/generator.d.ts +3 -3
- package/src/py/mcp-server/generator.js +152 -125
- package/src/py/mcp-server/generator.js.map +1 -1
- package/src/py/mcp-server/schema.d.js +6 -0
- package/src/py/mcp-server/schema.d.js.map +1 -0
- package/src/py/mcp-server/schema.d.ts +1 -0
- package/src/py/mcp-server/schema.json +5 -0
- package/src/py/project/generator.d.ts +17 -4
- package/src/py/project/generator.js +205 -127
- package/src/py/project/generator.js.map +1 -1
- package/src/py/project/schema.d.js +6 -0
- package/src/py/project/schema.d.js.map +1 -0
- package/src/py/project/schema.d.ts +1 -0
- package/src/py/project/schema.json +5 -0
- package/src/sdk/agentcore-gateway.d.ts +6 -0
- package/src/sdk/agentcore-gateway.js +7 -0
- package/src/sdk/agentcore-gateway.js.map +1 -0
- package/src/sdk/connection.d.ts +6 -0
- package/src/sdk/connection.js +6 -0
- package/src/sdk/connection.js.map +1 -0
- package/src/sdk/license.d.ts +8 -0
- package/src/sdk/license.js +7 -0
- package/src/sdk/license.js.map +1 -0
- package/src/sdk/open-api.d.ts +10 -0
- package/src/sdk/open-api.js +8 -0
- package/src/sdk/open-api.js.map +1 -0
- package/src/sdk/py.d.ts +14 -0
- package/src/sdk/py.js +10 -0
- package/src/sdk/py.js.map +1 -0
- package/src/sdk/terraform.d.ts +6 -0
- package/src/sdk/terraform.js +7 -0
- package/src/sdk/terraform.js.map +1 -0
- package/src/sdk/ts.d.ts +33 -0
- package/src/sdk/ts.js +35 -0
- package/src/sdk/ts.js.map +1 -0
- package/{sdk → src/sdk}/utils/ast.d.ts +1 -2
- package/src/sdk/utils/ast.js +6 -0
- package/src/sdk/utils/ast.js.map +1 -0
- package/{sdk → src/sdk}/utils/format.d.ts +1 -1
- package/src/sdk/utils/format.js +6 -0
- package/src/sdk/utils/format.js.map +1 -0
- package/{sdk → src/sdk}/utils/test.d.ts +1 -1
- package/src/sdk/utils/test.js +6 -0
- package/src/sdk/utils/test.js.map +1 -0
- package/src/smithy/project/__snapshots__/generator.spec.ts.snap +19 -24
- package/src/smithy/project/files/build.Dockerfile.template +1 -4
- package/src/smithy/project/files/src/operations/echo.smithy.template +1 -0
- package/src/smithy/project/generator.d.ts +3 -3
- package/src/smithy/project/generator.js +64 -57
- package/src/smithy/project/generator.js.map +1 -1
- package/src/smithy/project/schema.d.js +6 -0
- package/src/smithy/project/schema.d.js.map +1 -0
- package/src/smithy/project/schema.d.ts +1 -0
- package/src/smithy/project/schema.json +5 -0
- package/src/smithy/react-connection/__snapshots__/generator.spec.ts.snap +1 -1
- package/src/smithy/react-connection/generator.d.ts +3 -3
- package/src/smithy/react-connection/generator.js +39 -47
- package/src/smithy/react-connection/generator.js.map +1 -1
- package/src/smithy/react-connection/schema.d.js +6 -0
- package/src/smithy/react-connection/schema.d.js.map +1 -0
- package/src/smithy/react-connection/schema.d.ts +1 -0
- package/src/smithy/react-connection/schema.json +5 -0
- package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +409 -106
- package/src/smithy/ts/api/generator.d.ts +3 -3
- package/src/smithy/ts/api/generator.js +127 -106
- package/src/smithy/ts/api/generator.js.map +1 -1
- package/src/smithy/ts/api/schema.d.js +6 -0
- package/src/smithy/ts/api/schema.d.js.map +1 -0
- package/src/smithy/ts/api/schema.d.ts +1 -0
- package/src/smithy/ts/api/schema.json +5 -0
- package/src/terraform/project/files/application/src/main.tf.template +6 -1
- package/src/terraform/project/files/application/src/providers.tf.template +1 -1
- package/src/terraform/project/generator.d.ts +3 -3
- package/src/terraform/project/generator.js +156 -104
- package/src/terraform/project/generator.js.map +1 -1
- package/src/terraform/project/schema.d.js +9 -0
- package/src/terraform/project/schema.d.js.map +1 -0
- package/src/terraform/project/schema.d.ts +1 -0
- package/src/terraform/project/schema.json +5 -0
- package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +499 -110
- package/src/trpc/backend/files/src/procedures/echo.ts.template +1 -1
- package/src/trpc/backend/files/src/schema/echo.ts.template +2 -2
- package/src/trpc/backend/generator.d.ts +4 -4
- package/src/trpc/backend/generator.js +97 -85
- package/src/trpc/backend/generator.js.map +1 -1
- package/src/trpc/backend/schema.d.js +6 -0
- package/src/trpc/backend/schema.d.js.map +1 -0
- package/src/trpc/backend/schema.d.ts +3 -2
- package/src/trpc/backend/schema.json +5 -0
- package/src/trpc/react/__snapshots__/generator.spec.ts.snap +4 -4
- package/src/trpc/react/files/src/components/__apiNameClassName__ClientProvider.tsx.template +3 -3
- package/src/trpc/react/generator.d.ts +4 -4
- package/src/trpc/react/generator.js +63 -58
- package/src/trpc/react/generator.js.map +1 -1
- package/src/trpc/react/schema.d.js +6 -0
- package/src/trpc/react/schema.d.js.map +1 -0
- package/src/trpc/react/schema.d.ts +1 -0
- package/src/trpc/react/schema.json +5 -0
- package/src/ts/agent/__snapshots__/generator.spec.ts.snap +656 -18
- package/src/ts/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +256 -0
- package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client-strands.ts.template +23 -0
- package/src/ts/agent/a2a-connection/generator.d.ts +3 -3
- package/src/ts/agent/a2a-connection/generator.js +63 -56
- package/src/ts/agent/a2a-connection/generator.js.map +1 -1
- package/src/ts/agent/a2a-connection/schema.d.js +8 -0
- package/src/ts/agent/a2a-connection/schema.d.js.map +1 -0
- package/src/ts/agent/a2a-connection/schema.d.ts +1 -0
- package/src/ts/agent/a2a-connection/schema.json +5 -0
- package/src/ts/agent/files/common/agent.ts.template +6 -2
- package/src/ts/agent/files/http/router.ts.template +1 -1
- package/src/ts/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +220 -0
- package/src/ts/agent/gateway-connection/files/agent-connection/app/__gatewayKebabCase__-client-strands.ts.template +30 -0
- package/src/ts/agent/gateway-connection/generator.d.ts +10 -0
- package/src/ts/agent/gateway-connection/generator.js +114 -0
- package/src/ts/agent/gateway-connection/generator.js.map +1 -0
- package/src/ts/agent/gateway-connection/schema.d.js +6 -0
- package/src/ts/agent/gateway-connection/schema.d.js.map +1 -0
- package/src/ts/agent/gateway-connection/schema.d.ts +13 -0
- package/src/ts/agent/gateway-connection/schema.json +31 -0
- package/src/ts/agent/generator.d.ts +3 -3
- package/src/ts/agent/generator.js +188 -144
- package/src/ts/agent/generator.js.map +1 -1
- package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +192 -111
- package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client-strands.ts.template +22 -0
- package/src/ts/agent/mcp-connection/generator.d.ts +3 -3
- package/src/ts/agent/mcp-connection/generator.js +53 -60
- package/src/ts/agent/mcp-connection/generator.js.map +1 -1
- package/src/ts/agent/mcp-connection/schema.d.js +8 -0
- package/src/ts/agent/mcp-connection/schema.d.js.map +1 -0
- package/src/ts/agent/mcp-connection/schema.d.ts +1 -0
- package/src/ts/agent/mcp-connection/schema.json +5 -0
- package/src/ts/agent/react-connection/generator.d.ts +4 -4
- package/src/ts/agent/react-connection/generator.js +86 -80
- package/src/ts/agent/react-connection/generator.js.map +1 -1
- package/src/ts/agent/react-connection/local-dev.d.ts +13 -0
- package/src/ts/agent/react-connection/local-dev.js +17 -0
- package/src/ts/agent/react-connection/local-dev.js.map +1 -0
- package/src/ts/agent/react-connection/schema.d.js +8 -0
- package/src/ts/agent/react-connection/schema.d.js.map +1 -0
- package/src/ts/agent/react-connection/schema.d.ts +1 -0
- package/src/ts/agent/react-connection/schema.json +5 -0
- package/src/ts/agent/schema.d.js +6 -0
- package/src/ts/agent/schema.d.js.map +1 -0
- package/src/ts/agent/schema.d.ts +1 -0
- package/src/ts/agent/schema.json +5 -0
- package/src/ts/api/generator.d.ts +3 -3
- package/src/ts/api/generator.js +16 -16
- package/src/ts/api/generator.js.map +1 -1
- package/src/ts/api/schema.d.js +6 -0
- package/src/ts/api/schema.d.js.map +1 -0
- package/src/ts/api/schema.d.ts +3 -1
- package/src/ts/api/schema.json +5 -0
- package/src/ts/astro-docs/__snapshots__/generator.spec.ts.snap +15 -16
- package/src/ts/astro-docs/generator.d.ts +3 -3
- package/src/ts/astro-docs/generator.js +69 -54
- package/src/ts/astro-docs/generator.js.map +1 -1
- package/src/ts/astro-docs/schema.d.js +6 -0
- package/src/ts/astro-docs/schema.d.js.map +1 -0
- package/src/ts/astro-docs/schema.d.ts +2 -2
- package/src/ts/astro-docs/schema.json +3 -3
- package/src/ts/docs/generator.d.ts +3 -3
- package/src/ts/docs/generator.js +10 -10
- package/src/ts/docs/generator.js.map +1 -1
- package/src/ts/docs/schema.d.js +6 -0
- package/src/ts/docs/schema.d.js.map +1 -0
- package/src/ts/docs/schema.d.ts +1 -4
- package/src/ts/docs/schema.json +3 -3
- package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +1390 -0
- package/src/ts/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +45 -0
- package/src/ts/dynamodb/agent-connection/generator.d.ts +10 -0
- package/src/ts/dynamodb/agent-connection/generator.js +30 -0
- package/src/ts/dynamodb/agent-connection/generator.js.map +1 -0
- package/src/ts/dynamodb/agent-connection/schema.d.js +8 -0
- package/src/ts/dynamodb/agent-connection/schema.d.js.map +1 -0
- package/src/ts/dynamodb/agent-connection/schema.d.ts +15 -0
- package/src/ts/dynamodb/agent-connection/schema.json +27 -0
- package/src/ts/dynamodb/files/config.json.template +24 -0
- package/src/ts/dynamodb/files/src/client.ts.template +61 -0
- package/src/ts/dynamodb/files/src/entities/example.ts.template +47 -0
- package/src/ts/dynamodb/files/src/entities/index.ts.template +1 -0
- package/src/ts/dynamodb/files/src/index.ts.template +2 -0
- package/src/ts/dynamodb/generator.d.ts +10 -0
- package/src/ts/dynamodb/generator.js +116 -0
- package/src/ts/dynamodb/generator.js.map +1 -0
- package/src/ts/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +45 -0
- package/src/ts/dynamodb/mcp-server-connection/generator.d.ts +10 -0
- package/src/ts/dynamodb/mcp-server-connection/generator.js +30 -0
- package/src/ts/dynamodb/mcp-server-connection/generator.js.map +1 -0
- package/src/ts/dynamodb/mcp-server-connection/schema.d.js +8 -0
- package/src/ts/dynamodb/mcp-server-connection/schema.d.js.map +1 -0
- package/src/ts/dynamodb/mcp-server-connection/schema.d.ts +15 -0
- package/src/ts/dynamodb/mcp-server-connection/schema.json +27 -0
- package/src/ts/dynamodb/schema.d.js +6 -0
- package/src/ts/dynamodb/schema.d.js.map +1 -0
- package/src/ts/dynamodb/schema.d.ts +16 -0
- package/src/ts/dynamodb/schema.json +75 -0
- package/src/ts/dynamodb/smithy-connection/__snapshots__/generator.spec.ts.snap +23 -0
- package/src/ts/dynamodb/smithy-connection/generator.d.ts +10 -0
- package/src/ts/dynamodb/smithy-connection/generator.js +28 -0
- package/src/ts/dynamodb/smithy-connection/generator.js.map +1 -0
- package/src/ts/dynamodb/smithy-connection/schema.d.js +8 -0
- package/src/ts/dynamodb/smithy-connection/schema.d.js.map +1 -0
- package/src/ts/dynamodb/smithy-connection/schema.d.ts +13 -0
- package/src/ts/dynamodb/smithy-connection/schema.json +23 -0
- package/src/ts/dynamodb/trpc-connection/__snapshots__/generator.spec.ts.snap +23 -0
- package/src/ts/dynamodb/trpc-connection/generator.d.ts +10 -0
- package/src/ts/dynamodb/trpc-connection/generator.js +28 -0
- package/src/ts/dynamodb/trpc-connection/generator.js.map +1 -0
- package/src/ts/dynamodb/trpc-connection/schema.d.js +8 -0
- package/src/ts/dynamodb/trpc-connection/schema.d.js.map +1 -0
- package/src/ts/dynamodb/trpc-connection/schema.d.ts +13 -0
- package/src/ts/dynamodb/trpc-connection/schema.json +23 -0
- package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +4 -4
- package/src/ts/lambda-function/generator.d.ts +3 -3
- package/src/ts/lambda-function/generator.js +59 -56
- package/src/ts/lambda-function/generator.js.map +1 -1
- package/src/ts/lambda-function/io.js +83 -52
- package/src/ts/lambda-function/io.js.map +1 -1
- package/src/ts/lambda-function/schema.d.js +6 -0
- package/src/ts/lambda-function/schema.d.js.map +1 -0
- package/src/ts/lambda-function/schema.d.ts +1 -0
- package/src/ts/lambda-function/schema.json +5 -0
- package/src/ts/lib/__snapshots__/generator.spec.ts.snap +53 -99
- package/src/ts/lib/__snapshots__/vitest.spec.ts.snap +24 -0
- package/src/ts/lib/biome.d.ts +7 -0
- package/src/ts/lib/biome.js +58 -0
- package/src/ts/lib/biome.js.map +1 -0
- package/src/ts/lib/generator.d.ts +3 -3
- package/src/ts/lib/generator.js +96 -96
- package/src/ts/lib/generator.js.map +1 -1
- package/src/ts/lib/grit/vitest-pass-with-no-tests.grit +1 -4
- package/src/ts/lib/schema.d.js +6 -0
- package/src/ts/lib/schema.d.js.map +1 -0
- package/src/ts/lib/schema.d.ts +1 -1
- package/src/ts/lib/schema.json +5 -0
- package/src/ts/lib/ts-project-utils.d.ts +12 -2
- package/src/ts/lib/ts-project-utils.js +80 -65
- package/src/ts/lib/ts-project-utils.js.map +1 -1
- package/src/ts/lib/types.js +5 -2
- package/src/ts/lib/types.js.map +1 -1
- package/src/ts/lib/vitest.d.ts +2 -2
- package/src/ts/lib/vitest.js +29 -26
- package/src/ts/lib/vitest.js.map +1 -1
- package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +83 -13
- package/src/ts/mcp-server/generator.d.ts +3 -3
- package/src/ts/mcp-server/generator.js +164 -120
- package/src/ts/mcp-server/generator.js.map +1 -1
- package/src/ts/mcp-server/schema.d.js +6 -0
- package/src/ts/mcp-server/schema.d.js.map +1 -0
- package/src/ts/mcp-server/schema.d.ts +1 -0
- package/src/ts/mcp-server/schema.json +5 -0
- package/src/ts/nx-generator/__snapshots__/generator.spec.ts.snap +46 -26
- package/src/ts/nx-generator/files/common/schema.d.ts.template +1 -0
- package/src/ts/nx-generator/files/common/schema.json.template +5 -0
- package/src/ts/nx-generator/files/local/generator.ts.template +3 -3
- package/src/ts/nx-generator/files/nx-plugin-for-aws/generator/generator.ts.template +6 -7
- package/src/ts/nx-generator/generator.d.ts +2 -2
- package/src/ts/nx-generator/generator.js +111 -74
- package/src/ts/nx-generator/generator.js.map +1 -1
- package/src/ts/nx-generator/schema.d.js +6 -0
- package/src/ts/nx-generator/schema.d.js.map +1 -0
- package/src/ts/nx-generator/schema.d.ts +1 -0
- package/src/ts/nx-generator/schema.json +5 -0
- package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +30 -18
- package/src/ts/nx-plugin/files/mcp-server/server.ts.template +5 -5
- package/src/ts/nx-plugin/files/mcp-server/tools/create-workspace-command.ts.template +2 -2
- package/src/ts/nx-plugin/files/mcp-server/tools/general-guidance.ts.template +1 -1
- package/src/ts/nx-plugin/files/mcp-server/tools/generator-guide.ts.template +2 -2
- package/src/ts/nx-plugin/files/mcp-server/tools/list-generators.ts.template +2 -2
- package/src/ts/nx-plugin/files/mcp-server/utils.ts.template +3 -3
- package/src/ts/nx-plugin/generator.d.ts +3 -3
- package/src/ts/nx-plugin/generator.js +60 -51
- package/src/ts/nx-plugin/generator.js.map +1 -1
- package/src/ts/nx-plugin/schema.d.js +9 -0
- package/src/ts/nx-plugin/schema.d.js.map +1 -0
- package/src/ts/nx-plugin/schema.json +5 -0
- package/src/ts/nx-plugin/utils.d.ts +1 -1
- package/src/ts/nx-plugin/utils.js +32 -38
- package/src/ts/nx-plugin/utils.js.map +1 -1
- package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +312 -482
- package/src/ts/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +6 -6
- package/src/ts/rdb/agent-connection/generator.d.ts +3 -3
- package/src/ts/rdb/agent-connection/generator.js +38 -39
- package/src/ts/rdb/agent-connection/generator.js.map +1 -1
- package/src/ts/rdb/agent-connection/schema.d.js +8 -0
- package/src/ts/rdb/agent-connection/schema.d.js.map +1 -0
- package/src/ts/rdb/agent-connection/schema.d.ts +1 -0
- package/src/ts/rdb/agent-connection/schema.json +5 -0
- package/src/ts/rdb/files/config.json.template +14 -0
- package/src/ts/rdb/files/prisma.config.ts.template +6 -5
- package/src/ts/rdb/files/src/create-db-user-handler.ts.template +7 -9
- package/src/ts/rdb/files/src/index.ts.template +0 -1
- package/src/ts/rdb/files/src/migration-handler.ts.template +1 -28
- package/src/ts/rdb/files/src/prisma.ts.template +28 -23
- package/src/ts/rdb/files/src/utils.ts.template +3 -0
- package/src/ts/rdb/generator.d.ts +3 -7
- package/src/ts/rdb/generator.js +158 -130
- package/src/ts/rdb/generator.js.map +1 -1
- package/src/ts/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +6 -6
- package/src/ts/rdb/mcp-server-connection/generator.d.ts +3 -3
- package/src/ts/rdb/mcp-server-connection/generator.js +36 -37
- package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
- package/src/ts/rdb/mcp-server-connection/schema.d.js +8 -0
- package/src/ts/rdb/mcp-server-connection/schema.d.js.map +1 -0
- package/src/ts/rdb/mcp-server-connection/schema.d.ts +1 -0
- package/src/ts/rdb/mcp-server-connection/schema.json +5 -0
- package/src/ts/rdb/schema.d.js +6 -0
- package/src/ts/rdb/schema.d.js.map +1 -0
- package/src/ts/rdb/schema.d.ts +1 -0
- package/src/ts/rdb/schema.json +5 -0
- package/src/ts/rdb/smithy-connection/__snapshots__/generator.spec.ts.snap +3 -3
- package/src/ts/rdb/smithy-connection/generator.d.ts +3 -3
- package/src/ts/rdb/smithy-connection/generator.js +46 -43
- package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
- package/src/ts/rdb/smithy-connection/schema.d.js +8 -0
- package/src/ts/rdb/smithy-connection/schema.d.js.map +1 -0
- package/src/ts/rdb/smithy-connection/schema.d.ts +1 -0
- package/src/ts/rdb/smithy-connection/schema.json +5 -0
- package/src/ts/rdb/trpc-connection/__snapshots__/generator.spec.ts.snap +3 -3
- package/src/ts/rdb/trpc-connection/generator.d.ts +3 -3
- package/src/ts/rdb/trpc-connection/generator.js +36 -31
- package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
- package/src/ts/rdb/trpc-connection/schema.d.js +8 -0
- package/src/ts/rdb/trpc-connection/schema.d.js.map +1 -0
- package/src/ts/rdb/trpc-connection/schema.d.ts +1 -0
- package/src/ts/rdb/trpc-connection/schema.json +5 -0
- package/src/ts/rdb/utils.d.ts +1 -1
- package/src/ts/rdb/utils.js +9 -11
- package/src/ts/rdb/utils.js.map +1 -1
- package/src/ts/react-website/agui/files/common/src/hooks/useAgui__agentNameClassName__.tsx.template +1 -16
- package/src/ts/react-website/agui/generator.d.ts +1 -1
- package/src/ts/react-website/agui/generator.js +69 -62
- package/src/ts/react-website/agui/generator.js.map +1 -1
- package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +626 -612
- package/src/ts/react-website/app/generator.d.ts +4 -4
- package/src/ts/react-website/app/generator.js +217 -192
- package/src/ts/react-website/app/generator.js.map +1 -1
- package/src/ts/react-website/app/schema.d.js +6 -0
- package/src/ts/react-website/app/schema.d.js.map +1 -0
- package/src/ts/react-website/app/schema.d.ts +1 -1
- package/src/ts/react-website/app/schema.json +11 -6
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +129 -18
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +36 -10
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.ux-provider.spec.ts.snap +0 -20
- package/src/ts/react-website/cognito-auth/files/app/components/CognitoAuth/index.tsx.template +2 -2
- package/src/ts/react-website/cognito-auth/generator.d.ts +4 -4
- package/src/ts/react-website/cognito-auth/generator.js +64 -63
- package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
- package/src/ts/react-website/cognito-auth/grit/cloudscape-auth-menu.grit +8 -6
- package/src/ts/react-website/cognito-auth/grit/cognito-auth-wrapper.grit +1 -1
- package/src/ts/react-website/cognito-auth/grit/none-auth-menu.grit +1 -0
- package/src/ts/react-website/cognito-auth/grit/shadcn-auth-menu.grit +3 -1
- package/src/ts/react-website/cognito-auth/grit/shadcn-state-declarations.grit +3 -1
- package/src/ts/react-website/cognito-auth/schema.d.js +6 -0
- package/src/ts/react-website/cognito-auth/schema.d.js.map +1 -0
- package/src/ts/react-website/cognito-auth/schema.d.ts +1 -0
- package/src/ts/react-website/cognito-auth/schema.json +5 -0
- package/src/ts/react-website/cognito-auth/utils.d.ts +1 -1
- package/src/ts/react-website/cognito-auth/utils.js +34 -32
- package/src/ts/react-website/cognito-auth/utils.js.map +1 -1
- package/src/ts/react-website/runtime-config/__snapshots__/generator.spec.ts.snap +2 -2
- package/src/ts/react-website/runtime-config/files/app/components/RuntimeConfig/index.tsx.template +2 -2
- package/src/ts/react-website/runtime-config/generator.d.ts +3 -3
- package/src/ts/react-website/runtime-config/generator.js +29 -31
- package/src/ts/react-website/runtime-config/generator.js.map +1 -1
- package/src/ts/react-website/runtime-config/schema.d.js +6 -0
- package/src/ts/react-website/runtime-config/schema.d.js.map +1 -0
- package/src/ts/react-website/runtime-config/schema.d.ts +1 -0
- package/src/ts/react-website/runtime-config/schema.json +5 -0
- package/src/ts/sync/generator.d.ts +3 -3
- package/src/ts/sync/generator.js +60 -59
- package/src/ts/sync/generator.js.map +1 -1
- package/src/ts/website/app/generator.d.ts +3 -3
- package/src/ts/website/app/generator.js +10 -10
- package/src/ts/website/app/generator.js.map +1 -1
- package/src/ts/website/app/schema.d.js +6 -0
- package/src/ts/website/app/schema.d.js.map +1 -0
- package/src/ts/website/app/schema.d.ts +1 -1
- package/src/ts/website/app/schema.json +11 -6
- package/src/ts/website/auth/generator.d.ts +4 -4
- package/src/ts/website/auth/generator.js +11 -10
- package/src/ts/website/auth/generator.js.map +1 -1
- package/src/ts/website/auth/schema.d.js +6 -0
- package/src/ts/website/auth/schema.d.js.map +1 -0
- package/src/ts/website/auth/schema.d.ts +1 -0
- package/src/ts/website/auth/schema.json +5 -0
- package/src/utils/agent-chat/agent-chat.d.ts +31 -0
- package/src/utils/agent-chat/agent-chat.js +29 -0
- package/src/utils/agent-chat/agent-chat.js.map +1 -0
- package/src/utils/agent-chat/files/a2a/chat.ts.template +33 -0
- package/src/utils/agent-chat/files/ag-ui/chat.ts.template +17 -0
- package/src/utils/agent-chat/files/common/agentcore.ts.template +81 -0
- package/src/utils/agent-chat/files/http-py/chat.ts.template +43 -0
- package/src/utils/agent-chat/files/http-ts/chat.ts.template +54 -0
- package/src/utils/agent-connection/agent-connection.d.ts +117 -25
- package/src/utils/agent-connection/agent-connection.js +411 -103
- package/src/utils/agent-connection/agent-connection.js.map +1 -1
- package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client-config.ts.template +93 -0
- package/src/utils/agent-connection/files/core-auth/agentcore-endpoints.ts.template +37 -0
- package/src/utils/agent-connection/files/core-auth/agentcore-fetch.ts.template +54 -0
- package/src/utils/agent-connection/files/core-gateway/agentcore-gateway-mcp-transport.ts.template +41 -0
- package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-transport.ts.template +70 -0
- package/src/utils/agent-connection/files/core-runtime-config/runtime-config.ts.template +22 -32
- package/src/utils/agent-connection/files/core-shared/agentcore-transport.ts.template +39 -0
- package/src/utils/agent-connection/files/core-strands/a2a/agentcore-a2a-client-strands.ts.template +61 -0
- package/src/utils/agent-connection/files/core-strands/base/model-errors-strands.ts.template +36 -0
- package/src/utils/agent-connection/files/core-strands/gateway/agentcore-gateway-mcp-client-strands.ts.template +26 -0
- package/src/utils/agent-connection/files/core-strands/mcp/agentcore-mcp-client-strands.ts.template +27 -0
- package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client_config.py.template +43 -0
- package/src/utils/agent-connection/files/py-core-auth/agentcore_endpoints.py.template +47 -0
- package/src/utils/agent-connection/files/py-core-auth/auth/session.py.template +51 -0
- package/src/utils/agent-connection/files/py-core-gateway/agentcore_gateway_mcp_transport.py.template +28 -0
- package/src/utils/agent-connection/files/py-core-langchain/a2a/agentcore_a2a_client_langchain.py.template +99 -0
- package/src/utils/agent-connection/files/py-core-langchain/gateway/agentcore_gateway_mcp_client_langchain.py.template +57 -0
- package/src/utils/agent-connection/files/py-core-langchain/mcp/agentcore_mcp_client_langchain.py.template +64 -0
- package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_transport.py.template +34 -0
- package/src/utils/agent-connection/files/py-core-runtime-config/runtime_config.py.template +5 -18
- package/src/utils/agent-connection/files/py-core-shared/agentcore_transport.py.template +40 -0
- package/src/utils/agent-connection/files/py-core-strands/a2a/agentcore_a2a_client_strands.py.template +66 -0
- package/src/utils/agent-connection/files/py-core-strands/base/model_errors_strands.py.template +40 -0
- package/src/utils/agent-connection/files/py-core-strands/gateway/agentcore_gateway_mcp_client_strands.py.template +22 -0
- package/src/utils/agent-connection/files/py-core-strands/mcp/agentcore_mcp_client_strands.py.template +30 -0
- package/src/utils/agent-core-constructs/agent-core-constructs.d.ts +11 -3
- package/src/utils/agent-core-constructs/agent-core-constructs.js +86 -38
- package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
- package/src/utils/agent-core-constructs/files/cdk/app/agent-core/__nameKebabCase__/__nameKebabCase__.ts.template +4 -0
- package/src/utils/agent-core-constructs/files/cdk/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.ts.template +50 -0
- package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/agentcore-gateway.ts.template +487 -0
- package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/readiness-probe/index.js.template +55 -0
- package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.tf.template +449 -0
- package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/render-cedar.cjs.template +13 -0
- package/src/utils/agent-core-constructs/files/terraform/core/agent-core/runtime.tf.template +80 -12
- package/src/utils/agent-core-constructs/files/terraform/core/agentcore-gateway/gateway.tf.template +14 -0
- package/src/utils/api-constructs/api-constructs.d.ts +2 -2
- package/src/utils/api-constructs/api-constructs.js +30 -31
- package/src/utils/api-constructs/api-constructs.js.map +1 -1
- package/src/utils/api-constructs/files/cdk/app/apis/rest/__apiNameKebabCase__.ts.template +3 -0
- package/src/utils/api-constructs/files/cdk/core/api/http/http-api.ts.template +23 -6
- package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account/index.js.template +58 -0
- package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account.ts.template +82 -0
- package/src/utils/api-constructs/files/cdk/core/api/rest/rest-api.ts.template +51 -15
- package/src/utils/api-constructs/files/cdk/core/api/utils/utils.ts.template +61 -7
- package/src/utils/api-constructs/files/terraform/app/apis/http/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +1 -8
- package/src/utils/api-constructs/files/terraform/app/apis/rest/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +94 -4
- package/src/utils/api-constructs/files/terraform/core/api/http/http-api/http-api.tf.template +1 -1
- package/src/utils/api-constructs/files/terraform/core/api/rest/api-gateway-account/api-gateway-account.tf.template +83 -0
- package/src/utils/api-constructs/files/terraform/core/api/rest/rest-api/rest-api.tf.template +5 -11
- package/src/utils/api-constructs/open-api-metadata.d.ts +2 -2
- package/src/utils/api-constructs/open-api-metadata.js +22 -22
- package/src/utils/api-constructs/open-api-metadata.js.map +1 -1
- package/src/utils/ast/website.d.ts +5 -1
- package/src/utils/ast/website.js +18 -20
- package/src/utils/ast/website.js.map +1 -1
- package/src/utils/ast.d.ts +33 -1
- package/src/utils/ast.js +130 -70
- package/src/utils/ast.js.map +1 -1
- package/src/utils/bundle/bundle.d.ts +1 -1
- package/src/utils/bundle/bundle.js +50 -47
- package/src/utils/bundle/bundle.js.map +1 -1
- package/src/utils/commands.js +47 -26
- package/src/utils/commands.js.map +1 -1
- package/src/utils/config/index.d.ts +5 -5
- package/src/utils/config/index.js +5 -4
- package/src/utils/config/index.js.map +1 -1
- package/src/utils/config/utils.d.ts +13 -3
- package/src/utils/config/utils.js +65 -43
- package/src/utils/config/utils.js.map +1 -1
- package/src/utils/connection/open-api/files/components/__apiNameClassName__Provider.tsx.template +1 -1
- package/src/utils/connection/open-api/react.d.ts +6 -6
- package/src/utils/connection/open-api/react.js +81 -77
- package/src/utils/connection/open-api/react.js.map +1 -1
- package/src/utils/containers.d.ts +1 -1
- package/src/utils/containers.js +22 -23
- package/src/utils/containers.js.map +1 -1
- package/src/utils/dynamodb-constructs/dynamodb-constructs.d.ts +18 -0
- package/src/utils/dynamodb-constructs/dynamodb-constructs.js +48 -0
- package/src/utils/dynamodb-constructs/dynamodb-constructs.js.map +1 -0
- package/src/utils/dynamodb-constructs/files/cdk/app/dynamodb/__nameKebabCase__.ts.template +43 -0
- package/src/utils/dynamodb-constructs/files/cdk/core/dynamodb.ts.template +105 -0
- package/src/utils/dynamodb-constructs/files/terraform/app/dynamodb/__nameKebabCase__/__nameKebabCase__.tf.template +72 -0
- package/src/utils/dynamodb-constructs/files/terraform/core/dynamodb/dynamodb.tf.template +155 -0
- package/src/utils/files/common/scripts/src/dynamodb/create-local-table.ts.template +195 -0
- package/src/utils/files/common/scripts/src/dynamodb/pull-image.ts.template +13 -0
- package/src/utils/files/common/scripts/src/dynamodb/start-container.ts.template +106 -0
- package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/cdk-command.ts.template +6 -3
- package/src/utils/files/common/scripts/src/rdb/mysql/wait-for-mysql-db.ts.template +32 -0
- package/src/utils/files/common/scripts/src/rdb/postgres/wait-for-postgres-db.ts.template +32 -0
- package/src/utils/files/common/scripts/src/rdb/shared/pull-image.ts.template +16 -0
- package/src/utils/files/common/scripts/src/rdb/shared/start-container.ts.template +117 -0
- package/src/utils/files/terraform/src/core/asset-bucket/asset-bucket.tf.template +2 -2
- package/src/utils/files/terraform/src/core/runtime-config/appconfig/appconfig.tf.template +1 -1
- package/src/utils/files/terraform/src/core/runtime-config/appconfig-deployment/appconfig-deployment.tf.template +12 -6
- package/src/utils/files/terraform/src/core/runtime-config/entry/entry.tf.template +1 -1
- package/src/utils/files/terraform/src/core/runtime-config/read/read.tf.template +9 -4
- package/src/utils/files/website/hooks/sigv4/useSigV4.tsx.template +1 -1
- package/src/utils/format.d.ts +45 -2
- package/src/utils/format.js +323 -81
- package/src/utils/format.js.map +1 -1
- package/src/utils/fs.d.ts +1 -1
- package/src/utils/fs.js +14 -13
- package/src/utils/fs.js.map +1 -1
- package/src/utils/function-constructs/files/terraform/app/lambda-functions/__nameKebabCase__/__nameKebabCase__.tf.template +2 -2
- package/src/utils/function-constructs/function-constructs.d.ts +2 -2
- package/src/utils/function-constructs/function-constructs.js +21 -26
- package/src/utils/function-constructs/function-constructs.js.map +1 -1
- package/src/utils/generators.d.ts +4 -0
- package/src/utils/generators.js +18 -20
- package/src/utils/generators.js.map +1 -1
- package/src/utils/git.d.ts +1 -1
- package/src/utils/git.js +19 -34
- package/src/utils/git.js.map +1 -1
- package/src/utils/iac-providers.js +5 -5
- package/src/utils/iac-providers.js.map +1 -1
- package/src/utils/iac.d.ts +1 -1
- package/src/utils/iac.js +12 -14
- package/src/utils/iac.js.map +1 -1
- package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +123 -14
- package/src/utils/identity-constructs/files/terraform/core/user-identity/add-callback-url/add-callback-url.tf.template +28 -9
- package/src/utils/identity-constructs/files/terraform/core/user-identity/identity/identity.tf.template +106 -6
- package/src/utils/identity-constructs/files/terraform/core/user-identity/main.tf.template +7 -0
- package/src/utils/identity-constructs/identity-constructs.d.ts +2 -2
- package/src/utils/identity-constructs/identity-constructs.js +24 -28
- package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
- package/src/utils/install.d.ts +32 -0
- package/src/utils/install.js +56 -0
- package/src/utils/install.js.map +1 -0
- package/src/utils/js.d.ts +4 -0
- package/src/utils/js.js +27 -20
- package/src/utils/js.js.map +1 -1
- package/src/utils/mcp.d.ts +25 -0
- package/src/utils/mcp.js +74 -0
- package/src/utils/mcp.js.map +1 -0
- package/src/utils/metrics.d.ts +9 -3
- package/src/utils/metrics.js +61 -46
- package/src/utils/metrics.js.map +1 -1
- package/src/utils/mock-project-graph.js +8 -12
- package/src/utils/mock-project-graph.js.map +1 -1
- package/src/utils/names.d.ts +22 -0
- package/src/utils/names.js +44 -48
- package/src/utils/names.js.map +1 -1
- package/src/utils/npm-scope.d.ts +1 -1
- package/src/utils/npm-scope.js +9 -17
- package/src/utils/npm-scope.js.map +1 -1
- package/src/utils/nx.d.ts +25 -4
- package/src/utils/nx.js +144 -75
- package/src/utils/nx.js.map +1 -1
- package/src/utils/nxlv-python.d.ts +1 -1
- package/src/utils/nxlv-python.js +27 -15
- package/src/utils/nxlv-python.js.map +1 -1
- package/src/utils/object.js +5 -11
- package/src/utils/object.js.map +1 -1
- package/src/utils/paths.d.ts +1 -1
- package/src/utils/paths.js +11 -15
- package/src/utils/paths.js.map +1 -1
- package/src/utils/pkg-manager.js +4 -9
- package/src/utils/pkg-manager.js.map +1 -1
- package/src/utils/pnpm-workspace.d.ts +1 -1
- package/src/utils/pnpm-workspace.js +22 -22
- package/src/utils/pnpm-workspace.js.map +1 -1
- package/src/utils/port.d.ts +31 -3
- package/src/utils/port.js +72 -12
- package/src/utils/port.js.map +1 -1
- package/src/utils/py.d.ts +16 -3
- package/src/utils/py.js +72 -47
- package/src/utils/py.js.map +1 -1
- package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +12 -2
- package/src/utils/rdb-constructs/files/cdk/core/rdb/aurora.ts.template +35 -16
- package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +42 -48
- package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +31 -16
- package/src/utils/rdb-constructs/rdb-constructs.d.ts +5 -4
- package/src/utils/rdb-constructs/rdb-constructs.js +31 -41
- package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
- package/src/utils/shared-constructs-constants.d.ts +1 -0
- package/src/utils/shared-constructs-constants.js +16 -15
- package/src/utils/shared-constructs-constants.js.map +1 -1
- package/src/utils/shared-constructs.d.ts +2 -2
- package/src/utils/shared-constructs.js +57 -54
- package/src/utils/shared-constructs.js.map +1 -1
- package/src/utils/shared-dynamodb-scripts.d.ts +11 -0
- package/src/utils/shared-dynamodb-scripts.js +25 -0
- package/src/utils/shared-dynamodb-scripts.js.map +1 -0
- package/src/utils/shared-infra-config.d.ts +1 -1
- package/src/utils/shared-infra-config.js +30 -31
- package/src/utils/shared-infra-config.js.map +1 -1
- package/src/utils/shared-infra-scripts.d.ts +11 -0
- package/src/utils/shared-infra-scripts.js +40 -0
- package/src/utils/shared-infra-scripts.js.map +1 -0
- package/src/utils/shared-rdb-scripts.d.ts +16 -0
- package/src/utils/shared-rdb-scripts.js +28 -0
- package/src/utils/shared-rdb-scripts.js.map +1 -0
- package/src/utils/shared-scripts.d.ts +2 -5
- package/src/utils/shared-scripts.js +12 -38
- package/src/utils/shared-scripts.js.map +1 -1
- package/src/utils/shared-shadcn.d.ts +1 -1
- package/src/utils/shared-shadcn.js +64 -72
- package/src/utils/shared-shadcn.js.map +1 -1
- package/src/utils/test.d.ts +13 -1
- package/src/utils/test.js +35 -23
- package/src/utils/test.js.map +1 -1
- package/src/utils/toml.d.ts +1 -1
- package/src/utils/toml.js +10 -14
- package/src/utils/toml.js.map +1 -1
- package/src/utils/versions.d.ts +116 -84
- package/src/utils/versions.js +124 -102
- package/src/utils/versions.js.map +1 -1
- package/src/utils/website-constructs/files/cdk/core/static-website.ts.template +73 -5
- package/src/utils/website-constructs/files/terraform/app/static-websites/__websiteNameKebabCase__/__websiteNameKebabCase__.tf.template +1 -1
- package/src/utils/website-constructs/files/terraform/core/static-website/static-website.tf.template +68 -19
- package/src/utils/website-constructs/website-constructs.d.ts +2 -2
- package/src/utils/website-constructs/website-constructs.js +31 -30
- package/src/utils/website-constructs/website-constructs.js.map +1 -1
- package/bin/aws-nx-mcp.js +0 -17
- package/bin/aws-nx-mcp.js.map +0 -1
- package/sdk/connection.d.ts +0 -6
- package/sdk/connection.js +0 -10
- package/sdk/connection.js.map +0 -1
- package/sdk/open-api.d.ts +0 -10
- package/sdk/open-api.js +0 -15
- package/sdk/open-api.js.map +0 -1
- package/sdk/py.d.ts +0 -14
- package/sdk/py.js +0 -18
- package/sdk/py.js.map +0 -1
- package/sdk/terraform.d.ts +0 -6
- package/sdk/terraform.js +0 -11
- package/sdk/terraform.js.map +0 -1
- package/sdk/ts.d.ts +0 -29
- package/sdk/ts.js +0 -47
- package/sdk/ts.js.map +0 -1
- package/sdk/utils/ast.js +0 -12
- package/sdk/utils/ast.js.map +0 -1
- package/sdk/utils/format.js +0 -10
- package/sdk/utils/format.js.map +0 -1
- package/sdk/utils/test.js +0 -10
- package/sdk/utils/test.js.map +0 -1
- package/src/connection/agent-serve-local.js +0 -48
- package/src/connection/agent-serve-local.js.map +0 -1
- package/src/connection/serve-local.d.ts +0 -15
- package/src/connection/serve-local.js +0 -41
- package/src/connection/serve-local.js.map +0 -1
- package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client.py.template +0 -22
- package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client.py.template +0 -22
- package/src/py/agent/react-connection/serve-local.js +0 -30
- package/src/py/agent/react-connection/serve-local.js.map +0 -1
- package/src/py/agent/scripts/http/chat.ts.template +0 -38
- package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client.ts.template +0 -19
- package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client.ts.template +0 -19
- package/src/ts/agent/react-connection/serve-local.d.ts +0 -13
- package/src/ts/agent/react-connection/serve-local.js +0 -19
- package/src/ts/agent/react-connection/serve-local.js.map +0 -1
- package/src/ts/agent/scripts/http/chat.ts.template +0 -35
- package/src/ts/lib/eslint.d.ts +0 -14
- package/src/ts/lib/eslint.js +0 -90
- package/src/ts/lib/eslint.js.map +0 -1
- package/src/ts/lib/grit/eslint-dependency-checks-warn.grit +0 -1
- package/src/ts/rdb/files/scripts/docker-pull.ts.template +0 -15
- package/src/ts/rdb/files/scripts/docker-start.ts.template +0 -84
- package/src/ts/rdb/files/scripts/wait-for-db.ts.template +0 -55
- package/src/ts/rdb/files/src/constants.ts.template +0 -8
- package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client.ts.template +0 -123
- package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-client.ts.template +0 -128
- package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client.py.template +0 -120
- package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_client.py.template +0 -89
- /package/{bin → src/bin}/aws-nx-mcp.d.ts +0 -0
- /package/src/utils/agent-connection/files/{core-runtime-config/with-session-id.ts.template → core-strands/base/with-session-id-strands.ts.template} +0 -0
- /package/src/utils/agent-connection/files/{py-core-runtime-config/with_session_id.py.template → py-core-strands/base/with_session_id_strands.py.template} +0 -0
- /package/src/utils/files/common/scripts/src/{index.ts.template → infra/index.ts.template} +0 -0
- /package/src/utils/files/common/scripts/src/{infra-deploy.ts.template → infra/infra-deploy.ts.template} +0 -0
- /package/src/utils/files/common/scripts/src/{infra-destroy.ts.template → infra/infra-destroy.ts.template} +0 -0
- /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/credentials.ts.template +0 -0
- /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/run.ts.template +0 -0
- /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/stage-parser.ts.template +0 -0
|
@@ -22,144 +22,6 @@ datasource db {
|
|
|
22
22
|
"
|
|
23
23
|
`;
|
|
24
24
|
|
|
25
|
-
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/scripts/docker-pull.ts 1`] = `
|
|
26
|
-
"import { spawnSync } from 'child_process';
|
|
27
|
-
|
|
28
|
-
const ENGINE = 'docker';
|
|
29
|
-
const image = process.argv[2];
|
|
30
|
-
|
|
31
|
-
const inspect = spawnSync(ENGINE, ['image', 'inspect', image], {
|
|
32
|
-
stdio: 'ignore',
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
if (inspect.status !== 0) {
|
|
36
|
-
const pull = spawnSync(ENGINE, ['pull', image], { stdio: 'inherit' });
|
|
37
|
-
if (pull.status !== 0) {
|
|
38
|
-
process.exit(pull.status ?? 1);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
"
|
|
42
|
-
`;
|
|
43
|
-
|
|
44
|
-
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/scripts/docker-start.ts 1`] = `
|
|
45
|
-
"import { spawn, spawnSync } from 'child_process';
|
|
46
|
-
|
|
47
|
-
const ENGINE = 'docker';
|
|
48
|
-
|
|
49
|
-
const [containerName, image, hostPort, dbName, dbPassword] =
|
|
50
|
-
process.argv.slice(2);
|
|
51
|
-
|
|
52
|
-
const containerExists = (): boolean =>
|
|
53
|
-
spawnSync(ENGINE, ['container', 'inspect', containerName], {
|
|
54
|
-
stdio: 'ignore',
|
|
55
|
-
}).status === 0;
|
|
56
|
-
|
|
57
|
-
const isRunning = (): boolean => {
|
|
58
|
-
const result = spawnSync(
|
|
59
|
-
ENGINE,
|
|
60
|
-
['container', 'inspect', '-f', '{{.State.Running}}', containerName],
|
|
61
|
-
{ encoding: 'utf-8' },
|
|
62
|
-
);
|
|
63
|
-
return result.status === 0 && result.stdout.trim() === 'true';
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
if (containerExists()) {
|
|
67
|
-
if (!isRunning()) {
|
|
68
|
-
const start = spawnSync(ENGINE, ['start', containerName], {
|
|
69
|
-
stdio: 'inherit',
|
|
70
|
-
});
|
|
71
|
-
if (start.status !== 0) process.exit(start.status ?? 1);
|
|
72
|
-
}
|
|
73
|
-
} else {
|
|
74
|
-
const runArgs = [
|
|
75
|
-
'run',
|
|
76
|
-
'--name',
|
|
77
|
-
containerName,
|
|
78
|
-
'-e',
|
|
79
|
-
\`MYSQL_DATABASE=\${dbName}\`,
|
|
80
|
-
'-e',
|
|
81
|
-
\`MYSQL_ROOT_PASSWORD=\${dbPassword}\`,
|
|
82
|
-
'-p',
|
|
83
|
-
\`\${hostPort}:3306\`,
|
|
84
|
-
'-v',
|
|
85
|
-
\`\${containerName}-data:/var/lib/mysql\`,
|
|
86
|
-
'-d',
|
|
87
|
-
image,
|
|
88
|
-
];
|
|
89
|
-
const create = spawnSync(ENGINE, runArgs, { stdio: 'inherit' });
|
|
90
|
-
if (create.status !== 0) process.exit(create.status ?? 1);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
const logs = spawn(ENGINE, ['logs', '-f', containerName], {
|
|
94
|
-
stdio: ['ignore', 'inherit', 'inherit'],
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
let exiting = false;
|
|
98
|
-
|
|
99
|
-
const cleanup = () => {
|
|
100
|
-
if (exiting) return;
|
|
101
|
-
exiting = true;
|
|
102
|
-
spawnSync(ENGINE, ['stop', containerName], { stdio: 'ignore' });
|
|
103
|
-
logs.kill();
|
|
104
|
-
process.exit(0);
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
process.on('SIGTERM', cleanup);
|
|
108
|
-
process.on('SIGINT', cleanup);
|
|
109
|
-
process.on('SIGHUP', cleanup);
|
|
110
|
-
|
|
111
|
-
logs.on('exit', (code) => {
|
|
112
|
-
if (!exiting) process.exit(code ?? 0);
|
|
113
|
-
});
|
|
114
|
-
"
|
|
115
|
-
`;
|
|
116
|
-
|
|
117
|
-
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/scripts/wait-for-db.ts 1`] = `
|
|
118
|
-
"import { createConnection, Connection } from 'mariadb';
|
|
119
|
-
|
|
120
|
-
const noop = () => undefined;
|
|
121
|
-
|
|
122
|
-
const [portArg, dbArg, userArg, passwordArg] = process.argv.slice(2);
|
|
123
|
-
const timeoutAt = Date.now() + 60000;
|
|
124
|
-
|
|
125
|
-
while (Date.now() < timeoutAt) {
|
|
126
|
-
let conn: Connection | undefined;
|
|
127
|
-
try {
|
|
128
|
-
conn = await createConnection({
|
|
129
|
-
host: 'localhost',
|
|
130
|
-
port: parseInt(portArg),
|
|
131
|
-
user: userArg,
|
|
132
|
-
password: passwordArg,
|
|
133
|
-
database: dbArg,
|
|
134
|
-
connectTimeout: 500,
|
|
135
|
-
allowPublicKeyRetrieval: true,
|
|
136
|
-
});
|
|
137
|
-
await conn.end();
|
|
138
|
-
console.log('Database is ready.');
|
|
139
|
-
process.exit(0);
|
|
140
|
-
} catch {
|
|
141
|
-
console.log('Database is not ready.');
|
|
142
|
-
await conn?.end().catch(noop);
|
|
143
|
-
}
|
|
144
|
-
await new Promise((r) => setTimeout(r, 200));
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
throw new Error(\`Timed out waiting for mysql on port \${portArg}\`);
|
|
148
|
-
"
|
|
149
|
-
`;
|
|
150
|
-
|
|
151
|
-
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/src/constants.ts 1`] = `
|
|
152
|
-
"export const DB_PACKAGE_NAME = 'Db';
|
|
153
|
-
|
|
154
|
-
// Local development connection details (used when SERVE_LOCAL=true, see serve-local Nx target)
|
|
155
|
-
export const LOCAL_DB_PORT = 3306;
|
|
156
|
-
export const LOCAL_DB_HOST = 'localhost';
|
|
157
|
-
export const LOCAL_DB_NAME = 'database_name';
|
|
158
|
-
export const LOCAL_DB_USER = 'root';
|
|
159
|
-
export const LOCAL_DB_PASSWORD = 'password';
|
|
160
|
-
"
|
|
161
|
-
`;
|
|
162
|
-
|
|
163
25
|
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/src/create-db-user-handler.ts 1`] = `
|
|
164
26
|
"import type { CloudFormationCustomResourceEvent } from 'aws-lambda';
|
|
165
27
|
import { randomBytes } from 'node:crypto';
|
|
@@ -206,7 +68,7 @@ const ensureDatabaseUser = async (dbUser: string): Promise<void> => {
|
|
|
206
68
|
[
|
|
207
69
|
\`CREATE USER IF NOT EXISTS \${quotedUser}@\${quotedHost} IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS'\`,
|
|
208
70
|
\`ALTER USER \${quotedUser}@\${quotedHost} IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS' REQUIRE SSL\`,
|
|
209
|
-
\`GRANT
|
|
71
|
+
\`GRANT SELECT, INSERT, UPDATE, DELETE ON \${quotedDbName}.* TO \${quotedUser}@\${quotedHost}\`,
|
|
210
72
|
].join(';\\n'),
|
|
211
73
|
);
|
|
212
74
|
} finally {
|
|
@@ -237,8 +99,7 @@ export const handler = async (
|
|
|
237
99
|
`;
|
|
238
100
|
|
|
239
101
|
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/src/index.ts 1`] = `
|
|
240
|
-
"export {
|
|
241
|
-
export { getPrisma } from './prisma.js';
|
|
102
|
+
"export { getPrisma } from './prisma.js';
|
|
242
103
|
"
|
|
243
104
|
`;
|
|
244
105
|
|
|
@@ -277,26 +138,30 @@ exports[`ts#rdb generator > should add mysql prisma dependencies when engine is
|
|
|
277
138
|
"import { PrismaMariaDb } from '@prisma/adapter-mariadb';
|
|
278
139
|
import { Signer } from '@aws-sdk/rds-signer';
|
|
279
140
|
import { Prisma, PrismaClient } from '../generated/prisma/client.js';
|
|
280
|
-
import {
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
LOCAL_DB_NAME,
|
|
284
|
-
LOCAL_DB_PASSWORD,
|
|
285
|
-
LOCAL_DB_PORT,
|
|
286
|
-
LOCAL_DB_USER,
|
|
287
|
-
} from './constants.js';
|
|
141
|
+
import { readFileSync } from 'fs';
|
|
142
|
+
import { join, dirname } from 'path';
|
|
143
|
+
import { fileURLToPath } from 'url';
|
|
288
144
|
import { getDatabaseConfig } from './utils.js';
|
|
289
145
|
|
|
146
|
+
// Generated: must match runtimeConfigKey in config.json
|
|
147
|
+
const runtimeConfigKey = 'Db';
|
|
148
|
+
|
|
149
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
150
|
+
// config.json is only present in local dev (not included in the deployed bundle); guard with LOCAL_DEV check
|
|
151
|
+
const localDev = () =>
|
|
152
|
+
JSON.parse(readFileSync(join(__dirname, '../config.json'), 'utf-8')).localDev;
|
|
153
|
+
|
|
290
154
|
export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
|
|
291
155
|
log: LogOpts[] = ['warn', 'error'] as LogOpts[],
|
|
292
156
|
): Promise<PrismaClient<LogOpts>> => {
|
|
293
|
-
if (process.env.
|
|
157
|
+
if (process.env.LOCAL_DEV === 'true') {
|
|
158
|
+
const { host, port, dbName, dbUser, dbPassword } = localDev();
|
|
294
159
|
const adapter = new PrismaMariaDb({
|
|
295
|
-
host
|
|
296
|
-
port
|
|
297
|
-
database:
|
|
298
|
-
user:
|
|
299
|
-
password:
|
|
160
|
+
host,
|
|
161
|
+
port,
|
|
162
|
+
database: dbName,
|
|
163
|
+
user: dbUser,
|
|
164
|
+
password: dbPassword,
|
|
300
165
|
allowPublicKeyRetrieval: true,
|
|
301
166
|
});
|
|
302
167
|
return new PrismaClient({
|
|
@@ -306,7 +171,7 @@ export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
|
|
|
306
171
|
}
|
|
307
172
|
|
|
308
173
|
const { hostname, port, database, dbUser, region } =
|
|
309
|
-
await getDatabaseConfig(
|
|
174
|
+
await getDatabaseConfig(runtimeConfigKey);
|
|
310
175
|
const iamAuthToken = await new Signer({
|
|
311
176
|
hostname,
|
|
312
177
|
port,
|
|
@@ -431,6 +296,9 @@ const transientErrorPatterns = [
|
|
|
431
296
|
'ECONNREFUSED',
|
|
432
297
|
'ENOTFOUND',
|
|
433
298
|
'P1000', // Prisma: authentication failed
|
|
299
|
+
'P1001', // Prisma: can't reach database server
|
|
300
|
+
'P1002', // Prisma: database server reached but timed out
|
|
301
|
+
'P1010', // Prisma: user denied access (IAM auth grant not yet propagated)
|
|
434
302
|
'ER_ACCESS_DENIED_ERROR', // MySQL: access denied
|
|
435
303
|
];
|
|
436
304
|
|
|
@@ -663,6 +531,21 @@ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
|
|
|
663
531
|
* @default true
|
|
664
532
|
*/
|
|
665
533
|
readonly enableKeyRotation?: boolean;
|
|
534
|
+
|
|
535
|
+
/**
|
|
536
|
+
* Whether to export Aurora engine logs to CloudWatch Logs.
|
|
537
|
+
* See https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_LogAccess.html
|
|
538
|
+
*
|
|
539
|
+
* @default false
|
|
540
|
+
*/
|
|
541
|
+
readonly enableCloudwatchLogs?: boolean;
|
|
542
|
+
|
|
543
|
+
/**
|
|
544
|
+
* Whether to enable Performance Insights on the Aurora writer instance.
|
|
545
|
+
*
|
|
546
|
+
* @default true
|
|
547
|
+
*/
|
|
548
|
+
readonly enablePerformanceInsights?: boolean;
|
|
666
549
|
}
|
|
667
550
|
|
|
668
551
|
/**
|
|
@@ -692,6 +575,8 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
692
575
|
deletionProtection = true,
|
|
693
576
|
removalPolicy = RemovalPolicy.RETAIN,
|
|
694
577
|
enableKeyRotation = true,
|
|
578
|
+
enableCloudwatchLogs = false,
|
|
579
|
+
enablePerformanceInsights = true,
|
|
695
580
|
engine,
|
|
696
581
|
engineVersion,
|
|
697
582
|
...clusterProps
|
|
@@ -707,12 +592,24 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
707
592
|
vpc,
|
|
708
593
|
vpcSubnets,
|
|
709
594
|
engine: engine.clusterEngine(engineVersion ?? engine.defaultVersion),
|
|
710
|
-
writer:
|
|
595
|
+
writer:
|
|
596
|
+
writer ??
|
|
597
|
+
ClusterInstance.serverlessV2('writer', {
|
|
598
|
+
enablePerformanceInsights,
|
|
599
|
+
performanceInsightEncryptionKey: enablePerformanceInsights
|
|
600
|
+
? key
|
|
601
|
+
: undefined,
|
|
602
|
+
}),
|
|
711
603
|
credentials: Credentials.fromGeneratedSecret(adminUser, {
|
|
712
604
|
encryptionKey: key,
|
|
713
605
|
}),
|
|
714
606
|
iamAuthentication: true,
|
|
715
607
|
monitoringInterval: Duration.seconds(5),
|
|
608
|
+
cloudwatchLogsExports: enableCloudwatchLogs
|
|
609
|
+
? engine.type === 'mysql'
|
|
610
|
+
? ['audit', 'error', 'general', 'slowquery']
|
|
611
|
+
: ['postgresql']
|
|
612
|
+
: undefined,
|
|
716
613
|
defaultDatabaseName: databaseName,
|
|
717
614
|
storageEncrypted: true,
|
|
718
615
|
storageEncryptionKey: key,
|
|
@@ -809,32 +706,19 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
809
706
|
timeout: Duration.minutes(5),
|
|
810
707
|
tracing: Tracing.ACTIVE,
|
|
811
708
|
vpc,
|
|
812
|
-
environment:
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
DATABASE_SECRET_ARN: this.cluster.secret!.secretArn,
|
|
816
|
-
}
|
|
817
|
-
: {
|
|
818
|
-
HOSTNAME: databaseHostname,
|
|
819
|
-
DATABASE: databaseName,
|
|
820
|
-
PORT: databasePort.toString(),
|
|
821
|
-
DBUSER: this.dbUser,
|
|
822
|
-
},
|
|
709
|
+
environment: {
|
|
710
|
+
DATABASE_SECRET_ARN: this.cluster.secret!.secretArn,
|
|
711
|
+
},
|
|
823
712
|
architecture: Architecture.ARM_64,
|
|
824
713
|
});
|
|
825
714
|
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
this.grantSecretRead(migrationHandler);
|
|
829
|
-
} else {
|
|
830
|
-
this.allowDefaultPortFrom(migrationHandler);
|
|
831
|
-
this.grantConnect(migrationHandler);
|
|
832
|
-
}
|
|
715
|
+
this.cluster.connections.allowDefaultPortFrom(migrationHandler);
|
|
716
|
+
this.grantSecretRead(migrationHandler);
|
|
833
717
|
|
|
834
|
-
const
|
|
718
|
+
const migrationTrigger = new Trigger(this, 'MigrationTrigger', {
|
|
835
719
|
handler: migrationHandler,
|
|
836
720
|
});
|
|
837
|
-
|
|
721
|
+
migrationTrigger.node.addDependency(createDbUserResource);
|
|
838
722
|
|
|
839
723
|
new CfnOutput(this, 'ClusterEndpoint', {
|
|
840
724
|
value: this.cluster.clusterEndpoint.hostname,
|
|
@@ -874,17 +758,14 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
874
758
|
|
|
875
759
|
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL 2`] = `
|
|
876
760
|
"import { defineConfig } from 'prisma/config';
|
|
761
|
+
import { readFileSync } from 'fs';
|
|
877
762
|
|
|
878
763
|
const getDatabaseUrl = async () => {
|
|
879
|
-
if (process.env.
|
|
880
|
-
const {
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
LOCAL_DB_PORT,
|
|
885
|
-
LOCAL_DB_USER,
|
|
886
|
-
} = await import('./src/constants.js');
|
|
887
|
-
return \`mysql://\${LOCAL_DB_USER}:\${LOCAL_DB_PASSWORD}@\${LOCAL_DB_HOST}:\${LOCAL_DB_PORT}/\${LOCAL_DB_NAME}\`;
|
|
764
|
+
if (process.env.LOCAL_DEV === 'true') {
|
|
765
|
+
const { host, port, dbName, dbUser, dbPassword } = JSON.parse(
|
|
766
|
+
readFileSync('config.json', 'utf-8'),
|
|
767
|
+
).localDev;
|
|
768
|
+
return \`mysql://\${dbUser}:\${dbPassword}@\${host}:\${port}/\${dbName}\`;
|
|
888
769
|
}
|
|
889
770
|
return process.env.DATABASE_URL;
|
|
890
771
|
};
|
|
@@ -911,15 +792,15 @@ terraform {
|
|
|
911
792
|
required_providers {
|
|
912
793
|
aws = {
|
|
913
794
|
source = "hashicorp/aws"
|
|
914
|
-
version = "
|
|
795
|
+
version = "6.52.0"
|
|
915
796
|
}
|
|
916
797
|
null = {
|
|
917
798
|
source = "hashicorp/null"
|
|
918
|
-
version = "
|
|
799
|
+
version = "3.3.0"
|
|
919
800
|
}
|
|
920
801
|
random = {
|
|
921
802
|
source = "hashicorp/random"
|
|
922
|
-
version = "
|
|
803
|
+
version = "3.9.0"
|
|
923
804
|
}
|
|
924
805
|
}
|
|
925
806
|
}
|
|
@@ -1063,10 +944,19 @@ variable "tags" {
|
|
|
1063
944
|
default = {}
|
|
1064
945
|
}
|
|
1065
946
|
|
|
947
|
+
# Suffix appended to physical resource names so that multiple deployments
|
|
948
|
+
# (e.g. separate environments in the same account and region) don't collide.
|
|
949
|
+
resource "random_string" "suffix" {
|
|
950
|
+
length = 8
|
|
951
|
+
special = false
|
|
952
|
+
upper = false
|
|
953
|
+
}
|
|
954
|
+
|
|
1066
955
|
locals {
|
|
1067
956
|
default_port = var.engine == "aurora-mysql" ? 3306 : 5432
|
|
1068
957
|
default_engine_version = var.engine == "aurora-mysql" ? "8.0.mysql_aurora.3.12.0" : "17.7"
|
|
1069
958
|
parameter_group_family = var.engine == "aurora-mysql" ? "aurora-mysql8.0" : "aurora-postgresql\${split(".", coalesce(var.engine_version, local.default_engine_version))[0]}"
|
|
959
|
+
cluster_name = "\${var.name}-aurora-\${random_string.suffix.result}"
|
|
1070
960
|
}
|
|
1071
961
|
|
|
1072
962
|
resource "aws_rds_cluster_parameter_group" "database" {
|
|
@@ -1164,7 +1054,7 @@ resource "aws_security_group" "database" {
|
|
|
1164
1054
|
}
|
|
1165
1055
|
|
|
1166
1056
|
resource "aws_db_subnet_group" "database" {
|
|
1167
|
-
name =
|
|
1057
|
+
name = local.cluster_name
|
|
1168
1058
|
subnet_ids = var.subnet_ids
|
|
1169
1059
|
|
|
1170
1060
|
tags = merge(var.tags, {
|
|
@@ -1204,7 +1094,7 @@ resource "aws_secretsmanager_secret_version" "credentials" {
|
|
|
1204
1094
|
resource "aws_rds_cluster" "database" {
|
|
1205
1095
|
#checkov:skip=CKV2_AWS_27:Query logging can be enabled with enable_cloudwatch_logs; this module defaults to CDK-equivalent behavior unless logging is requested
|
|
1206
1096
|
#checkov:skip=CKV_AWS_139:Deletion protection is enabled but checkov is unable to detect it correctly
|
|
1207
|
-
cluster_identifier =
|
|
1097
|
+
cluster_identifier = local.cluster_name
|
|
1208
1098
|
engine = var.engine
|
|
1209
1099
|
engine_version = coalesce(var.engine_version, local.default_engine_version)
|
|
1210
1100
|
database_name = var.database_name
|
|
@@ -1218,7 +1108,7 @@ resource "aws_rds_cluster" "database" {
|
|
|
1218
1108
|
kms_key_id = aws_kms_key.database.arn
|
|
1219
1109
|
deletion_protection = var.deletion_protection
|
|
1220
1110
|
skip_final_snapshot = var.skip_final_snapshot
|
|
1221
|
-
final_snapshot_identifier = var.skip_final_snapshot ? null : "\${
|
|
1111
|
+
final_snapshot_identifier = var.skip_final_snapshot ? null : "\${local.cluster_name}-final-snapshot"
|
|
1222
1112
|
iam_database_authentication_enabled = true
|
|
1223
1113
|
monitoring_interval = 5
|
|
1224
1114
|
monitoring_role_arn = aws_iam_role.enhanced_monitoring.arn
|
|
@@ -1238,7 +1128,7 @@ resource "aws_rds_cluster" "database" {
|
|
|
1238
1128
|
resource "aws_rds_cluster_instance" "database" {
|
|
1239
1129
|
count = var.instance_count
|
|
1240
1130
|
|
|
1241
|
-
identifier = "\${
|
|
1131
|
+
identifier = "\${local.cluster_name}-\${count.index + 1}"
|
|
1242
1132
|
cluster_identifier = aws_rds_cluster.database.id
|
|
1243
1133
|
instance_class = "db.serverless"
|
|
1244
1134
|
engine = aws_rds_cluster.database.engine
|
|
@@ -1292,7 +1182,7 @@ resource "aws_vpc_security_group_ingress_rule" "rotation_to_database" {
|
|
|
1292
1182
|
resource "aws_cloudformation_stack" "credentials_rotation" {
|
|
1293
1183
|
#checkov:skip=CKV_AWS_124:SNS event notifications are not required for the credentials rotation stack
|
|
1294
1184
|
count = var.enable_credential_rotation ? 1 : 0
|
|
1295
|
-
name = "\${
|
|
1185
|
+
name = "\${local.cluster_name}-credentials-rotation"
|
|
1296
1186
|
|
|
1297
1187
|
capabilities = ["CAPABILITY_IAM", "CAPABILITY_AUTO_EXPAND"]
|
|
1298
1188
|
|
|
@@ -1306,7 +1196,7 @@ resource "aws_cloudformation_stack" "credentials_rotation" {
|
|
|
1306
1196
|
SecretId = aws_secretsmanager_secret.credentials.arn
|
|
1307
1197
|
HostedRotationLambda = {
|
|
1308
1198
|
RotationType = var.engine == "aurora-mysql" ? "MySQLSingleUser" : "PostgreSQLSingleUser"
|
|
1309
|
-
RotationLambdaName = "\${
|
|
1199
|
+
RotationLambdaName = "\${local.cluster_name}-credentials-rotation"
|
|
1310
1200
|
VpcSecurityGroupIds = aws_security_group.rotation[0].id
|
|
1311
1201
|
VpcSubnetIds = join(",", var.lambda_subnet_ids)
|
|
1312
1202
|
}
|
|
@@ -1386,7 +1276,7 @@ resource "aws_security_group" "proxy" {
|
|
|
1386
1276
|
resource "aws_db_proxy" "aurora" {
|
|
1387
1277
|
count = var.enable_rds_proxy ? 1 : 0
|
|
1388
1278
|
|
|
1389
|
-
name = "\${var.name}-proxy"
|
|
1279
|
+
name = "\${var.name}-proxy-\${random_string.suffix.result}"
|
|
1390
1280
|
default_auth_scheme = "IAM_AUTH"
|
|
1391
1281
|
engine_family = var.engine == "aurora-mysql" ? "MYSQL" : "POSTGRESQL"
|
|
1392
1282
|
role_arn = aws_iam_role.proxy[0].arn
|
|
@@ -1435,9 +1325,9 @@ resource "null_resource" "proxy_target_ready" {
|
|
|
1435
1325
|
deadline=$((start_time + 600))
|
|
1436
1326
|
while true; do
|
|
1437
1327
|
target_state=$(aws rds describe-db-proxy-targets \\
|
|
1438
|
-
--region
|
|
1439
|
-
--db-proxy-name
|
|
1440
|
-
--target-group-name
|
|
1328
|
+
--region "$AWS_REGION" \\
|
|
1329
|
+
--db-proxy-name "$DB_PROXY_NAME" \\
|
|
1330
|
+
--target-group-name "$TARGET_GROUP_NAME" \\
|
|
1441
1331
|
--query "Targets[?Type=='RDS_INSTANCE'] | [0].TargetHealth.State" \\
|
|
1442
1332
|
--output text)
|
|
1443
1333
|
|
|
@@ -1447,13 +1337,19 @@ resource "null_resource" "proxy_target_ready" {
|
|
|
1447
1337
|
|
|
1448
1338
|
current_time=$(date +%s)
|
|
1449
1339
|
if [ "$current_time" -ge "$deadline" ]; then
|
|
1450
|
-
echo "RDS Proxy target
|
|
1340
|
+
echo "RDS Proxy target $DB_CLUSTER_IDENTIFIER did not become AVAILABLE within 10 minutes. Last state: $target_state"
|
|
1451
1341
|
exit 1
|
|
1452
1342
|
fi
|
|
1453
1343
|
|
|
1454
1344
|
sleep 10
|
|
1455
1345
|
done
|
|
1456
1346
|
EOT
|
|
1347
|
+
environment = {
|
|
1348
|
+
AWS_REGION = data.aws_region.current.region
|
|
1349
|
+
DB_PROXY_NAME = self.triggers.db_proxy_name
|
|
1350
|
+
TARGET_GROUP_NAME = self.triggers.target_group_name
|
|
1351
|
+
DB_CLUSTER_IDENTIFIER = self.triggers.db_cluster_identifier
|
|
1352
|
+
}
|
|
1457
1353
|
}
|
|
1458
1354
|
|
|
1459
1355
|
depends_on = [
|
|
@@ -1532,7 +1428,7 @@ resource "aws_iam_role_policy_attachment" "backup" {
|
|
|
1532
1428
|
resource "aws_backup_vault" "database" {
|
|
1533
1429
|
count = var.enable_backup ? 1 : 0
|
|
1534
1430
|
|
|
1535
|
-
name = "\${
|
|
1431
|
+
name = "\${local.cluster_name}-backup"
|
|
1536
1432
|
kms_key_arn = aws_kms_key.database.arn
|
|
1537
1433
|
tags = var.tags
|
|
1538
1434
|
}
|
|
@@ -1540,7 +1436,7 @@ resource "aws_backup_vault" "database" {
|
|
|
1540
1436
|
resource "aws_backup_plan" "database" {
|
|
1541
1437
|
count = var.enable_backup ? 1 : 0
|
|
1542
1438
|
|
|
1543
|
-
name = "\${
|
|
1439
|
+
name = "\${local.cluster_name}-backup"
|
|
1544
1440
|
|
|
1545
1441
|
rule {
|
|
1546
1442
|
rule_name = "daily-backup"
|
|
@@ -1654,19 +1550,19 @@ exports[`ts#rdb generator > should generate terraform modules when iac is Terraf
|
|
|
1654
1550
|
required_providers {
|
|
1655
1551
|
archive = {
|
|
1656
1552
|
source = "hashicorp/archive"
|
|
1657
|
-
version = "
|
|
1553
|
+
version = "2.8.0"
|
|
1658
1554
|
}
|
|
1659
1555
|
aws = {
|
|
1660
1556
|
source = "hashicorp/aws"
|
|
1661
|
-
version = "
|
|
1557
|
+
version = "6.52.0"
|
|
1662
1558
|
}
|
|
1663
1559
|
null = {
|
|
1664
1560
|
source = "hashicorp/null"
|
|
1665
|
-
version = "
|
|
1561
|
+
version = "3.3.0"
|
|
1666
1562
|
}
|
|
1667
1563
|
random = {
|
|
1668
1564
|
source = "hashicorp/random"
|
|
1669
|
-
version = "
|
|
1565
|
+
version = "3.9.0"
|
|
1670
1566
|
}
|
|
1671
1567
|
}
|
|
1672
1568
|
}
|
|
@@ -1791,10 +1687,12 @@ resource "random_string" "suffix" {
|
|
|
1791
1687
|
}
|
|
1792
1688
|
|
|
1793
1689
|
locals {
|
|
1794
|
-
|
|
1795
|
-
|
|
1690
|
+
config = jsondecode(file("\${path.module}/../../../../../../../packages/db/config.json"))
|
|
1691
|
+
runtime_config_key = local.config.runtimeConfigKey
|
|
1692
|
+
create_db_user_bundle_path = "\${path.module}/../../../../../../../dist/packages/db/bundle/create-db-user"
|
|
1693
|
+
migration_function_name = "db-migration-\${random_string.suffix.result}"
|
|
1796
1694
|
create_db_user_function_name = "db-create-db-user-\${random_string.suffix.result}"
|
|
1797
|
-
database_runtime_user
|
|
1695
|
+
database_runtime_user = "db_\${random_string.suffix.result}"
|
|
1798
1696
|
}
|
|
1799
1697
|
|
|
1800
1698
|
module "aurora" {
|
|
@@ -1860,7 +1758,7 @@ module "add_rdb_to_runtime_config" {
|
|
|
1860
1758
|
source = "../../../core/runtime-config/entry"
|
|
1861
1759
|
|
|
1862
1760
|
namespace = "database"
|
|
1863
|
-
key =
|
|
1761
|
+
key = local.runtime_config_key
|
|
1864
1762
|
value = {
|
|
1865
1763
|
hostname = module.aurora.cluster_endpoint
|
|
1866
1764
|
port = module.aurora.cluster_port
|
|
@@ -1873,9 +1771,8 @@ module "add_rdb_to_runtime_config" {
|
|
|
1873
1771
|
|
|
1874
1772
|
resource "aws_ecr_repository" "migration_handler" {
|
|
1875
1773
|
#checkov:skip=CKV_AWS_136:AES256 encryption is sufficient for ECR repositories
|
|
1876
|
-
#checkov:skip=CKV_AWS_51:Mutable tags are intentional; the migration handler is always pushed as latest and redeployment is gated on docker_digest changes in null_resource.docker_publish
|
|
1877
1774
|
name = "db-migration-\${random_string.suffix.result}"
|
|
1878
|
-
image_tag_mutability = "
|
|
1775
|
+
image_tag_mutability = "IMMUTABLE"
|
|
1879
1776
|
force_delete = true
|
|
1880
1777
|
|
|
1881
1778
|
image_scanning_configuration {
|
|
@@ -1926,19 +1823,31 @@ data "external" "docker_digest" {
|
|
|
1926
1823
|
program = ["sh", "-c", "echo '{\\"digest\\":\\"'$(docker inspect \${var.docker_image_tag} --format '{{.Id}}')'\\"}' "]
|
|
1927
1824
|
}
|
|
1928
1825
|
|
|
1826
|
+
locals {
|
|
1827
|
+
# Content-based, immutable image tag derived from the local image digest
|
|
1828
|
+
image_tag = replace(data.external.docker_digest.result.digest, "sha256:", "")
|
|
1829
|
+
}
|
|
1830
|
+
|
|
1929
1831
|
resource "null_resource" "docker_publish" {
|
|
1930
1832
|
triggers = {
|
|
1931
1833
|
docker_digest = data.external.docker_digest.result.digest
|
|
1932
1834
|
repository_url = aws_ecr_repository.migration_handler.repository_url
|
|
1933
1835
|
docker_image_tag = var.docker_image_tag
|
|
1836
|
+
image_tag = local.image_tag
|
|
1934
1837
|
}
|
|
1935
1838
|
|
|
1936
1839
|
provisioner "local-exec" {
|
|
1937
1840
|
command = <<-EOT
|
|
1938
|
-
aws ecr get-login-password --region
|
|
1939
|
-
docker tag
|
|
1940
|
-
docker push
|
|
1841
|
+
aws ecr get-login-password --region "$AWS_REGION" | docker login --username AWS --password-stdin "$REPOSITORY_URL"
|
|
1842
|
+
docker tag "$DOCKER_IMAGE_TAG" "$REPOSITORY_URL:$IMAGE_TAG"
|
|
1843
|
+
docker push "$REPOSITORY_URL:$IMAGE_TAG"
|
|
1941
1844
|
EOT
|
|
1845
|
+
environment = {
|
|
1846
|
+
AWS_REGION = data.aws_region.current.region
|
|
1847
|
+
REPOSITORY_URL = self.triggers.repository_url
|
|
1848
|
+
DOCKER_IMAGE_TAG = self.triggers.docker_image_tag
|
|
1849
|
+
IMAGE_TAG = self.triggers.image_tag
|
|
1850
|
+
}
|
|
1942
1851
|
}
|
|
1943
1852
|
|
|
1944
1853
|
depends_on = [aws_ecr_repository_policy.migration_handler]
|
|
@@ -1987,11 +1896,16 @@ resource "aws_iam_role_policy" "migration_handler_access" {
|
|
|
1987
1896
|
{
|
|
1988
1897
|
Effect = "Allow"
|
|
1989
1898
|
Action = [
|
|
1990
|
-
"
|
|
1899
|
+
"secretsmanager:GetSecretValue"
|
|
1991
1900
|
]
|
|
1992
|
-
Resource = [
|
|
1993
|
-
|
|
1901
|
+
Resource = [module.aurora.secret_arn]
|
|
1902
|
+
},
|
|
1903
|
+
{
|
|
1904
|
+
Effect = "Allow"
|
|
1905
|
+
Action = [
|
|
1906
|
+
"kms:Decrypt"
|
|
1994
1907
|
]
|
|
1908
|
+
Resource = [module.aurora.kms_key_arn]
|
|
1995
1909
|
}
|
|
1996
1910
|
]
|
|
1997
1911
|
})
|
|
@@ -2080,7 +1994,7 @@ resource "aws_security_group" "migration_handler" {
|
|
|
2080
1994
|
|
|
2081
1995
|
resource "aws_vpc_security_group_egress_rule" "migration_handler_to_database" {
|
|
2082
1996
|
security_group_id = aws_security_group.migration_handler.id
|
|
2083
|
-
referenced_security_group_id = module.aurora.
|
|
1997
|
+
referenced_security_group_id = module.aurora.database_security_group_id
|
|
2084
1998
|
from_port = module.aurora.cluster_port
|
|
2085
1999
|
to_port = module.aurora.cluster_port
|
|
2086
2000
|
ip_protocol = "tcp"
|
|
@@ -2122,7 +2036,7 @@ resource "aws_vpc_security_group_egress_rule" "create_db_user_https" {
|
|
|
2122
2036
|
}
|
|
2123
2037
|
|
|
2124
2038
|
resource "aws_vpc_security_group_ingress_rule" "migration_handler_to_database" {
|
|
2125
|
-
security_group_id = module.aurora.
|
|
2039
|
+
security_group_id = module.aurora.database_security_group_id
|
|
2126
2040
|
referenced_security_group_id = aws_security_group.migration_handler.id
|
|
2127
2041
|
from_port = module.aurora.cluster_port
|
|
2128
2042
|
to_port = module.aurora.cluster_port
|
|
@@ -2196,10 +2110,10 @@ resource "null_resource" "create_db_user_trigger" {
|
|
|
2196
2110
|
command = <<-EOT
|
|
2197
2111
|
output_file=$(mktemp)
|
|
2198
2112
|
response=$(aws lambda invoke \\
|
|
2199
|
-
--region
|
|
2200
|
-
--function-name
|
|
2113
|
+
--region "$AWS_REGION" \\
|
|
2114
|
+
--function-name "$FUNCTION_NAME" \\
|
|
2201
2115
|
--cli-binary-format raw-in-base64-out \\
|
|
2202
|
-
--payload
|
|
2116
|
+
--payload "{\\"RequestType\\":\\"Create\\",\\"PhysicalResourceId\\":\\"db-user:$DB_USER\\"}" \\
|
|
2203
2117
|
"$output_file")
|
|
2204
2118
|
cat "$output_file"
|
|
2205
2119
|
echo "$response"
|
|
@@ -2209,6 +2123,11 @@ resource "null_resource" "create_db_user_trigger" {
|
|
|
2209
2123
|
fi
|
|
2210
2124
|
rm -f "$output_file"
|
|
2211
2125
|
EOT
|
|
2126
|
+
environment = {
|
|
2127
|
+
AWS_REGION = data.aws_region.current.region
|
|
2128
|
+
FUNCTION_NAME = self.triggers.function_name
|
|
2129
|
+
DB_USER = self.triggers.db_user
|
|
2130
|
+
}
|
|
2212
2131
|
}
|
|
2213
2132
|
|
|
2214
2133
|
depends_on = [aws_lambda_function.create_db_user, module.aurora]
|
|
@@ -2222,7 +2141,7 @@ resource "aws_lambda_function" "migration_handler" {
|
|
|
2222
2141
|
package_type = "Image"
|
|
2223
2142
|
function_name = local.migration_function_name
|
|
2224
2143
|
role = aws_iam_role.migration_handler.arn
|
|
2225
|
-
image_uri = "\${aws_ecr_repository.migration_handler.repository_url}
|
|
2144
|
+
image_uri = "\${aws_ecr_repository.migration_handler.repository_url}:\${local.image_tag}"
|
|
2226
2145
|
memory_size = 1024
|
|
2227
2146
|
timeout = 300
|
|
2228
2147
|
architectures = ["arm64"]
|
|
@@ -2238,10 +2157,7 @@ resource "aws_lambda_function" "migration_handler" {
|
|
|
2238
2157
|
|
|
2239
2158
|
environment {
|
|
2240
2159
|
variables = {
|
|
2241
|
-
|
|
2242
|
-
DATABASE = module.aurora.database_name
|
|
2243
|
-
PORT = tostring(module.aurora.cluster_port)
|
|
2244
|
-
DBUSER = local.database_runtime_user
|
|
2160
|
+
DATABASE_SECRET_ARN = module.aurora.secret_arn
|
|
2245
2161
|
}
|
|
2246
2162
|
}
|
|
2247
2163
|
|
|
@@ -2271,8 +2187,8 @@ resource "null_resource" "migration_trigger" {
|
|
|
2271
2187
|
command = <<-EOT
|
|
2272
2188
|
output_file=$(mktemp)
|
|
2273
2189
|
response=$(aws lambda invoke \\
|
|
2274
|
-
--region
|
|
2275
|
-
--function-name
|
|
2190
|
+
--region "$AWS_REGION" \\
|
|
2191
|
+
--function-name "$FUNCTION_NAME" \\
|
|
2276
2192
|
--cli-binary-format raw-in-base64-out \\
|
|
2277
2193
|
"$output_file")
|
|
2278
2194
|
cat "$output_file"
|
|
@@ -2283,6 +2199,10 @@ resource "null_resource" "migration_trigger" {
|
|
|
2283
2199
|
fi
|
|
2284
2200
|
rm -f "$output_file"
|
|
2285
2201
|
EOT
|
|
2202
|
+
environment = {
|
|
2203
|
+
AWS_REGION = data.aws_region.current.region
|
|
2204
|
+
FUNCTION_NAME = self.triggers.function_name
|
|
2205
|
+
}
|
|
2286
2206
|
}
|
|
2287
2207
|
|
|
2288
2208
|
depends_on = [
|
|
@@ -2361,15 +2281,15 @@ terraform {
|
|
|
2361
2281
|
required_providers {
|
|
2362
2282
|
aws = {
|
|
2363
2283
|
source = "hashicorp/aws"
|
|
2364
|
-
version = "
|
|
2284
|
+
version = "6.52.0"
|
|
2365
2285
|
}
|
|
2366
2286
|
null = {
|
|
2367
2287
|
source = "hashicorp/null"
|
|
2368
|
-
version = "
|
|
2288
|
+
version = "3.3.0"
|
|
2369
2289
|
}
|
|
2370
2290
|
random = {
|
|
2371
2291
|
source = "hashicorp/random"
|
|
2372
|
-
version = "
|
|
2292
|
+
version = "3.9.0"
|
|
2373
2293
|
}
|
|
2374
2294
|
}
|
|
2375
2295
|
}
|
|
@@ -2513,10 +2433,19 @@ variable "tags" {
|
|
|
2513
2433
|
default = {}
|
|
2514
2434
|
}
|
|
2515
2435
|
|
|
2436
|
+
# Suffix appended to physical resource names so that multiple deployments
|
|
2437
|
+
# (e.g. separate environments in the same account and region) don't collide.
|
|
2438
|
+
resource "random_string" "suffix" {
|
|
2439
|
+
length = 8
|
|
2440
|
+
special = false
|
|
2441
|
+
upper = false
|
|
2442
|
+
}
|
|
2443
|
+
|
|
2516
2444
|
locals {
|
|
2517
2445
|
default_port = var.engine == "aurora-mysql" ? 3306 : 5432
|
|
2518
2446
|
default_engine_version = var.engine == "aurora-mysql" ? "8.0.mysql_aurora.3.12.0" : "17.7"
|
|
2519
2447
|
parameter_group_family = var.engine == "aurora-mysql" ? "aurora-mysql8.0" : "aurora-postgresql\${split(".", coalesce(var.engine_version, local.default_engine_version))[0]}"
|
|
2448
|
+
cluster_name = "\${var.name}-aurora-\${random_string.suffix.result}"
|
|
2520
2449
|
}
|
|
2521
2450
|
|
|
2522
2451
|
resource "aws_rds_cluster_parameter_group" "database" {
|
|
@@ -2614,7 +2543,7 @@ resource "aws_security_group" "database" {
|
|
|
2614
2543
|
}
|
|
2615
2544
|
|
|
2616
2545
|
resource "aws_db_subnet_group" "database" {
|
|
2617
|
-
name =
|
|
2546
|
+
name = local.cluster_name
|
|
2618
2547
|
subnet_ids = var.subnet_ids
|
|
2619
2548
|
|
|
2620
2549
|
tags = merge(var.tags, {
|
|
@@ -2654,7 +2583,7 @@ resource "aws_secretsmanager_secret_version" "credentials" {
|
|
|
2654
2583
|
resource "aws_rds_cluster" "database" {
|
|
2655
2584
|
#checkov:skip=CKV2_AWS_27:Query logging can be enabled with enable_cloudwatch_logs; this module defaults to CDK-equivalent behavior unless logging is requested
|
|
2656
2585
|
#checkov:skip=CKV_AWS_139:Deletion protection is enabled but checkov is unable to detect it correctly
|
|
2657
|
-
cluster_identifier =
|
|
2586
|
+
cluster_identifier = local.cluster_name
|
|
2658
2587
|
engine = var.engine
|
|
2659
2588
|
engine_version = coalesce(var.engine_version, local.default_engine_version)
|
|
2660
2589
|
database_name = var.database_name
|
|
@@ -2668,7 +2597,7 @@ resource "aws_rds_cluster" "database" {
|
|
|
2668
2597
|
kms_key_id = aws_kms_key.database.arn
|
|
2669
2598
|
deletion_protection = var.deletion_protection
|
|
2670
2599
|
skip_final_snapshot = var.skip_final_snapshot
|
|
2671
|
-
final_snapshot_identifier = var.skip_final_snapshot ? null : "\${
|
|
2600
|
+
final_snapshot_identifier = var.skip_final_snapshot ? null : "\${local.cluster_name}-final-snapshot"
|
|
2672
2601
|
iam_database_authentication_enabled = true
|
|
2673
2602
|
monitoring_interval = 5
|
|
2674
2603
|
monitoring_role_arn = aws_iam_role.enhanced_monitoring.arn
|
|
@@ -2688,7 +2617,7 @@ resource "aws_rds_cluster" "database" {
|
|
|
2688
2617
|
resource "aws_rds_cluster_instance" "database" {
|
|
2689
2618
|
count = var.instance_count
|
|
2690
2619
|
|
|
2691
|
-
identifier = "\${
|
|
2620
|
+
identifier = "\${local.cluster_name}-\${count.index + 1}"
|
|
2692
2621
|
cluster_identifier = aws_rds_cluster.database.id
|
|
2693
2622
|
instance_class = "db.serverless"
|
|
2694
2623
|
engine = aws_rds_cluster.database.engine
|
|
@@ -2742,7 +2671,7 @@ resource "aws_vpc_security_group_ingress_rule" "rotation_to_database" {
|
|
|
2742
2671
|
resource "aws_cloudformation_stack" "credentials_rotation" {
|
|
2743
2672
|
#checkov:skip=CKV_AWS_124:SNS event notifications are not required for the credentials rotation stack
|
|
2744
2673
|
count = var.enable_credential_rotation ? 1 : 0
|
|
2745
|
-
name = "\${
|
|
2674
|
+
name = "\${local.cluster_name}-credentials-rotation"
|
|
2746
2675
|
|
|
2747
2676
|
capabilities = ["CAPABILITY_IAM", "CAPABILITY_AUTO_EXPAND"]
|
|
2748
2677
|
|
|
@@ -2756,7 +2685,7 @@ resource "aws_cloudformation_stack" "credentials_rotation" {
|
|
|
2756
2685
|
SecretId = aws_secretsmanager_secret.credentials.arn
|
|
2757
2686
|
HostedRotationLambda = {
|
|
2758
2687
|
RotationType = var.engine == "aurora-mysql" ? "MySQLSingleUser" : "PostgreSQLSingleUser"
|
|
2759
|
-
RotationLambdaName = "\${
|
|
2688
|
+
RotationLambdaName = "\${local.cluster_name}-credentials-rotation"
|
|
2760
2689
|
VpcSecurityGroupIds = aws_security_group.rotation[0].id
|
|
2761
2690
|
VpcSubnetIds = join(",", var.lambda_subnet_ids)
|
|
2762
2691
|
}
|
|
@@ -2836,7 +2765,7 @@ resource "aws_security_group" "proxy" {
|
|
|
2836
2765
|
resource "aws_db_proxy" "aurora" {
|
|
2837
2766
|
count = var.enable_rds_proxy ? 1 : 0
|
|
2838
2767
|
|
|
2839
|
-
name = "\${var.name}-proxy"
|
|
2768
|
+
name = "\${var.name}-proxy-\${random_string.suffix.result}"
|
|
2840
2769
|
default_auth_scheme = "IAM_AUTH"
|
|
2841
2770
|
engine_family = var.engine == "aurora-mysql" ? "MYSQL" : "POSTGRESQL"
|
|
2842
2771
|
role_arn = aws_iam_role.proxy[0].arn
|
|
@@ -2885,9 +2814,9 @@ resource "null_resource" "proxy_target_ready" {
|
|
|
2885
2814
|
deadline=$((start_time + 600))
|
|
2886
2815
|
while true; do
|
|
2887
2816
|
target_state=$(aws rds describe-db-proxy-targets \\
|
|
2888
|
-
--region
|
|
2889
|
-
--db-proxy-name
|
|
2890
|
-
--target-group-name
|
|
2817
|
+
--region "$AWS_REGION" \\
|
|
2818
|
+
--db-proxy-name "$DB_PROXY_NAME" \\
|
|
2819
|
+
--target-group-name "$TARGET_GROUP_NAME" \\
|
|
2891
2820
|
--query "Targets[?Type=='RDS_INSTANCE'] | [0].TargetHealth.State" \\
|
|
2892
2821
|
--output text)
|
|
2893
2822
|
|
|
@@ -2897,13 +2826,19 @@ resource "null_resource" "proxy_target_ready" {
|
|
|
2897
2826
|
|
|
2898
2827
|
current_time=$(date +%s)
|
|
2899
2828
|
if [ "$current_time" -ge "$deadline" ]; then
|
|
2900
|
-
echo "RDS Proxy target
|
|
2829
|
+
echo "RDS Proxy target $DB_CLUSTER_IDENTIFIER did not become AVAILABLE within 10 minutes. Last state: $target_state"
|
|
2901
2830
|
exit 1
|
|
2902
2831
|
fi
|
|
2903
2832
|
|
|
2904
2833
|
sleep 10
|
|
2905
2834
|
done
|
|
2906
2835
|
EOT
|
|
2836
|
+
environment = {
|
|
2837
|
+
AWS_REGION = data.aws_region.current.region
|
|
2838
|
+
DB_PROXY_NAME = self.triggers.db_proxy_name
|
|
2839
|
+
TARGET_GROUP_NAME = self.triggers.target_group_name
|
|
2840
|
+
DB_CLUSTER_IDENTIFIER = self.triggers.db_cluster_identifier
|
|
2841
|
+
}
|
|
2907
2842
|
}
|
|
2908
2843
|
|
|
2909
2844
|
depends_on = [
|
|
@@ -2982,7 +2917,7 @@ resource "aws_iam_role_policy_attachment" "backup" {
|
|
|
2982
2917
|
resource "aws_backup_vault" "database" {
|
|
2983
2918
|
count = var.enable_backup ? 1 : 0
|
|
2984
2919
|
|
|
2985
|
-
name = "\${
|
|
2920
|
+
name = "\${local.cluster_name}-backup"
|
|
2986
2921
|
kms_key_arn = aws_kms_key.database.arn
|
|
2987
2922
|
tags = var.tags
|
|
2988
2923
|
}
|
|
@@ -2990,7 +2925,7 @@ resource "aws_backup_vault" "database" {
|
|
|
2990
2925
|
resource "aws_backup_plan" "database" {
|
|
2991
2926
|
count = var.enable_backup ? 1 : 0
|
|
2992
2927
|
|
|
2993
|
-
name = "\${
|
|
2928
|
+
name = "\${local.cluster_name}-backup"
|
|
2994
2929
|
|
|
2995
2930
|
rule {
|
|
2996
2931
|
rule_name = "daily-backup"
|
|
@@ -3104,19 +3039,19 @@ exports[`ts#rdb generator > should generate terraform modules with MySQL engine
|
|
|
3104
3039
|
required_providers {
|
|
3105
3040
|
archive = {
|
|
3106
3041
|
source = "hashicorp/archive"
|
|
3107
|
-
version = "
|
|
3042
|
+
version = "2.8.0"
|
|
3108
3043
|
}
|
|
3109
3044
|
aws = {
|
|
3110
3045
|
source = "hashicorp/aws"
|
|
3111
|
-
version = "
|
|
3046
|
+
version = "6.52.0"
|
|
3112
3047
|
}
|
|
3113
3048
|
null = {
|
|
3114
3049
|
source = "hashicorp/null"
|
|
3115
|
-
version = "
|
|
3050
|
+
version = "3.3.0"
|
|
3116
3051
|
}
|
|
3117
3052
|
random = {
|
|
3118
3053
|
source = "hashicorp/random"
|
|
3119
|
-
version = "
|
|
3054
|
+
version = "3.9.0"
|
|
3120
3055
|
}
|
|
3121
3056
|
}
|
|
3122
3057
|
}
|
|
@@ -3241,10 +3176,12 @@ resource "random_string" "suffix" {
|
|
|
3241
3176
|
}
|
|
3242
3177
|
|
|
3243
3178
|
locals {
|
|
3244
|
-
|
|
3245
|
-
|
|
3179
|
+
config = jsondecode(file("\${path.module}/../../../../../../../packages/db/config.json"))
|
|
3180
|
+
runtime_config_key = local.config.runtimeConfigKey
|
|
3181
|
+
create_db_user_bundle_path = "\${path.module}/../../../../../../../dist/packages/db/bundle/create-db-user"
|
|
3182
|
+
migration_function_name = "db-migration-\${random_string.suffix.result}"
|
|
3246
3183
|
create_db_user_function_name = "db-create-db-user-\${random_string.suffix.result}"
|
|
3247
|
-
database_runtime_user
|
|
3184
|
+
database_runtime_user = "db_\${random_string.suffix.result}"
|
|
3248
3185
|
}
|
|
3249
3186
|
|
|
3250
3187
|
module "aurora" {
|
|
@@ -3310,7 +3247,7 @@ module "add_rdb_to_runtime_config" {
|
|
|
3310
3247
|
source = "../../../core/runtime-config/entry"
|
|
3311
3248
|
|
|
3312
3249
|
namespace = "database"
|
|
3313
|
-
key =
|
|
3250
|
+
key = local.runtime_config_key
|
|
3314
3251
|
value = {
|
|
3315
3252
|
hostname = module.aurora.cluster_endpoint
|
|
3316
3253
|
port = module.aurora.cluster_port
|
|
@@ -3323,9 +3260,8 @@ module "add_rdb_to_runtime_config" {
|
|
|
3323
3260
|
|
|
3324
3261
|
resource "aws_ecr_repository" "migration_handler" {
|
|
3325
3262
|
#checkov:skip=CKV_AWS_136:AES256 encryption is sufficient for ECR repositories
|
|
3326
|
-
#checkov:skip=CKV_AWS_51:Mutable tags are intentional; the migration handler is always pushed as latest and redeployment is gated on docker_digest changes in null_resource.docker_publish
|
|
3327
3263
|
name = "db-migration-\${random_string.suffix.result}"
|
|
3328
|
-
image_tag_mutability = "
|
|
3264
|
+
image_tag_mutability = "IMMUTABLE"
|
|
3329
3265
|
force_delete = true
|
|
3330
3266
|
|
|
3331
3267
|
image_scanning_configuration {
|
|
@@ -3376,19 +3312,31 @@ data "external" "docker_digest" {
|
|
|
3376
3312
|
program = ["sh", "-c", "echo '{\\"digest\\":\\"'$(docker inspect \${var.docker_image_tag} --format '{{.Id}}')'\\"}' "]
|
|
3377
3313
|
}
|
|
3378
3314
|
|
|
3315
|
+
locals {
|
|
3316
|
+
# Content-based, immutable image tag derived from the local image digest
|
|
3317
|
+
image_tag = replace(data.external.docker_digest.result.digest, "sha256:", "")
|
|
3318
|
+
}
|
|
3319
|
+
|
|
3379
3320
|
resource "null_resource" "docker_publish" {
|
|
3380
3321
|
triggers = {
|
|
3381
3322
|
docker_digest = data.external.docker_digest.result.digest
|
|
3382
3323
|
repository_url = aws_ecr_repository.migration_handler.repository_url
|
|
3383
3324
|
docker_image_tag = var.docker_image_tag
|
|
3325
|
+
image_tag = local.image_tag
|
|
3384
3326
|
}
|
|
3385
3327
|
|
|
3386
3328
|
provisioner "local-exec" {
|
|
3387
3329
|
command = <<-EOT
|
|
3388
|
-
aws ecr get-login-password --region
|
|
3389
|
-
docker tag
|
|
3390
|
-
docker push
|
|
3330
|
+
aws ecr get-login-password --region "$AWS_REGION" | docker login --username AWS --password-stdin "$REPOSITORY_URL"
|
|
3331
|
+
docker tag "$DOCKER_IMAGE_TAG" "$REPOSITORY_URL:$IMAGE_TAG"
|
|
3332
|
+
docker push "$REPOSITORY_URL:$IMAGE_TAG"
|
|
3391
3333
|
EOT
|
|
3334
|
+
environment = {
|
|
3335
|
+
AWS_REGION = data.aws_region.current.region
|
|
3336
|
+
REPOSITORY_URL = self.triggers.repository_url
|
|
3337
|
+
DOCKER_IMAGE_TAG = self.triggers.docker_image_tag
|
|
3338
|
+
IMAGE_TAG = self.triggers.image_tag
|
|
3339
|
+
}
|
|
3392
3340
|
}
|
|
3393
3341
|
|
|
3394
3342
|
depends_on = [aws_ecr_repository_policy.migration_handler]
|
|
@@ -3651,10 +3599,10 @@ resource "null_resource" "create_db_user_trigger" {
|
|
|
3651
3599
|
command = <<-EOT
|
|
3652
3600
|
output_file=$(mktemp)
|
|
3653
3601
|
response=$(aws lambda invoke \\
|
|
3654
|
-
--region
|
|
3655
|
-
--function-name
|
|
3602
|
+
--region "$AWS_REGION" \\
|
|
3603
|
+
--function-name "$FUNCTION_NAME" \\
|
|
3656
3604
|
--cli-binary-format raw-in-base64-out \\
|
|
3657
|
-
--payload
|
|
3605
|
+
--payload "{\\"RequestType\\":\\"Create\\",\\"PhysicalResourceId\\":\\"db-user:$DB_USER\\"}" \\
|
|
3658
3606
|
"$output_file")
|
|
3659
3607
|
cat "$output_file"
|
|
3660
3608
|
echo "$response"
|
|
@@ -3664,6 +3612,11 @@ resource "null_resource" "create_db_user_trigger" {
|
|
|
3664
3612
|
fi
|
|
3665
3613
|
rm -f "$output_file"
|
|
3666
3614
|
EOT
|
|
3615
|
+
environment = {
|
|
3616
|
+
AWS_REGION = data.aws_region.current.region
|
|
3617
|
+
FUNCTION_NAME = self.triggers.function_name
|
|
3618
|
+
DB_USER = self.triggers.db_user
|
|
3619
|
+
}
|
|
3667
3620
|
}
|
|
3668
3621
|
|
|
3669
3622
|
depends_on = [aws_lambda_function.create_db_user, module.aurora]
|
|
@@ -3677,7 +3630,7 @@ resource "aws_lambda_function" "migration_handler" {
|
|
|
3677
3630
|
package_type = "Image"
|
|
3678
3631
|
function_name = local.migration_function_name
|
|
3679
3632
|
role = aws_iam_role.migration_handler.arn
|
|
3680
|
-
image_uri = "\${aws_ecr_repository.migration_handler.repository_url}
|
|
3633
|
+
image_uri = "\${aws_ecr_repository.migration_handler.repository_url}:\${local.image_tag}"
|
|
3681
3634
|
memory_size = 1024
|
|
3682
3635
|
timeout = 300
|
|
3683
3636
|
architectures = ["arm64"]
|
|
@@ -3722,8 +3675,8 @@ resource "null_resource" "migration_trigger" {
|
|
|
3722
3675
|
command = <<-EOT
|
|
3723
3676
|
output_file=$(mktemp)
|
|
3724
3677
|
response=$(aws lambda invoke \\
|
|
3725
|
-
--region
|
|
3726
|
-
--function-name
|
|
3678
|
+
--region "$AWS_REGION" \\
|
|
3679
|
+
--function-name "$FUNCTION_NAME" \\
|
|
3727
3680
|
--cli-binary-format raw-in-base64-out \\
|
|
3728
3681
|
"$output_file")
|
|
3729
3682
|
cat "$output_file"
|
|
@@ -3734,6 +3687,10 @@ resource "null_resource" "migration_trigger" {
|
|
|
3734
3687
|
fi
|
|
3735
3688
|
rm -f "$output_file"
|
|
3736
3689
|
EOT
|
|
3690
|
+
environment = {
|
|
3691
|
+
AWS_REGION = data.aws_region.current.region
|
|
3692
|
+
FUNCTION_NAME = self.triggers.function_name
|
|
3693
|
+
}
|
|
3737
3694
|
}
|
|
3738
3695
|
|
|
3739
3696
|
depends_on = [
|
|
@@ -3824,148 +3781,6 @@ datasource db {
|
|
|
3824
3781
|
"
|
|
3825
3782
|
`;
|
|
3826
3783
|
|
|
3827
|
-
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/scripts/docker-pull.ts 1`] = `
|
|
3828
|
-
"import { spawnSync } from 'child_process';
|
|
3829
|
-
|
|
3830
|
-
const ENGINE = 'docker';
|
|
3831
|
-
const image = process.argv[2];
|
|
3832
|
-
|
|
3833
|
-
const inspect = spawnSync(ENGINE, ['image', 'inspect', image], {
|
|
3834
|
-
stdio: 'ignore',
|
|
3835
|
-
});
|
|
3836
|
-
|
|
3837
|
-
if (inspect.status !== 0) {
|
|
3838
|
-
const pull = spawnSync(ENGINE, ['pull', image], { stdio: 'inherit' });
|
|
3839
|
-
if (pull.status !== 0) {
|
|
3840
|
-
process.exit(pull.status ?? 1);
|
|
3841
|
-
}
|
|
3842
|
-
}
|
|
3843
|
-
"
|
|
3844
|
-
`;
|
|
3845
|
-
|
|
3846
|
-
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/scripts/docker-start.ts 1`] = `
|
|
3847
|
-
"import { spawn, spawnSync } from 'child_process';
|
|
3848
|
-
|
|
3849
|
-
const ENGINE = 'docker';
|
|
3850
|
-
|
|
3851
|
-
const [containerName, image, hostPort, dbName, dbUser, dbPassword] =
|
|
3852
|
-
process.argv.slice(2);
|
|
3853
|
-
|
|
3854
|
-
const containerExists = (): boolean =>
|
|
3855
|
-
spawnSync(ENGINE, ['container', 'inspect', containerName], {
|
|
3856
|
-
stdio: 'ignore',
|
|
3857
|
-
}).status === 0;
|
|
3858
|
-
|
|
3859
|
-
const isRunning = (): boolean => {
|
|
3860
|
-
const result = spawnSync(
|
|
3861
|
-
ENGINE,
|
|
3862
|
-
['container', 'inspect', '-f', '{{.State.Running}}', containerName],
|
|
3863
|
-
{ encoding: 'utf-8' },
|
|
3864
|
-
);
|
|
3865
|
-
return result.status === 0 && result.stdout.trim() === 'true';
|
|
3866
|
-
};
|
|
3867
|
-
|
|
3868
|
-
if (containerExists()) {
|
|
3869
|
-
if (!isRunning()) {
|
|
3870
|
-
const start = spawnSync(ENGINE, ['start', containerName], {
|
|
3871
|
-
stdio: 'inherit',
|
|
3872
|
-
});
|
|
3873
|
-
if (start.status !== 0) process.exit(start.status ?? 1);
|
|
3874
|
-
}
|
|
3875
|
-
} else {
|
|
3876
|
-
const runArgs = [
|
|
3877
|
-
'run',
|
|
3878
|
-
'--name',
|
|
3879
|
-
containerName,
|
|
3880
|
-
'-e',
|
|
3881
|
-
\`POSTGRES_DB=\${dbName}\`,
|
|
3882
|
-
'-e',
|
|
3883
|
-
\`POSTGRES_USER=\${dbUser}\`,
|
|
3884
|
-
'-e',
|
|
3885
|
-
\`POSTGRES_PASSWORD=\${dbPassword}\`,
|
|
3886
|
-
'-e',
|
|
3887
|
-
\`PGDATA=/var/lib/postgresql/17/docker\`,
|
|
3888
|
-
'-p',
|
|
3889
|
-
\`\${hostPort}:5432\`,
|
|
3890
|
-
'-v',
|
|
3891
|
-
\`\${containerName}-data:/var/lib/postgresql\`,
|
|
3892
|
-
'-d',
|
|
3893
|
-
image,
|
|
3894
|
-
];
|
|
3895
|
-
const create = spawnSync(ENGINE, runArgs, { stdio: 'inherit' });
|
|
3896
|
-
if (create.status !== 0) process.exit(create.status ?? 1);
|
|
3897
|
-
}
|
|
3898
|
-
|
|
3899
|
-
const logs = spawn(ENGINE, ['logs', '-f', containerName], {
|
|
3900
|
-
stdio: ['ignore', 'inherit', 'inherit'],
|
|
3901
|
-
});
|
|
3902
|
-
|
|
3903
|
-
let exiting = false;
|
|
3904
|
-
|
|
3905
|
-
const cleanup = () => {
|
|
3906
|
-
if (exiting) return;
|
|
3907
|
-
exiting = true;
|
|
3908
|
-
spawnSync(ENGINE, ['stop', containerName], { stdio: 'ignore' });
|
|
3909
|
-
logs.kill();
|
|
3910
|
-
process.exit(0);
|
|
3911
|
-
};
|
|
3912
|
-
|
|
3913
|
-
process.on('SIGTERM', cleanup);
|
|
3914
|
-
process.on('SIGINT', cleanup);
|
|
3915
|
-
process.on('SIGHUP', cleanup);
|
|
3916
|
-
|
|
3917
|
-
logs.on('exit', (code) => {
|
|
3918
|
-
if (!exiting) process.exit(code ?? 0);
|
|
3919
|
-
});
|
|
3920
|
-
"
|
|
3921
|
-
`;
|
|
3922
|
-
|
|
3923
|
-
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/scripts/wait-for-db.ts 1`] = `
|
|
3924
|
-
"import { Client } from 'pg';
|
|
3925
|
-
|
|
3926
|
-
const noop = () => undefined;
|
|
3927
|
-
|
|
3928
|
-
const [portArg, dbArg, userArg, passwordArg] = process.argv.slice(2);
|
|
3929
|
-
const timeoutAt = Date.now() + 60000;
|
|
3930
|
-
|
|
3931
|
-
while (Date.now() < timeoutAt) {
|
|
3932
|
-
const client = new Client({
|
|
3933
|
-
host: 'localhost',
|
|
3934
|
-
port: parseInt(portArg),
|
|
3935
|
-
user: userArg,
|
|
3936
|
-
password: passwordArg,
|
|
3937
|
-
database: dbArg,
|
|
3938
|
-
connectionTimeoutMillis: 500,
|
|
3939
|
-
});
|
|
3940
|
-
client.on('error', noop);
|
|
3941
|
-
try {
|
|
3942
|
-
await client.connect();
|
|
3943
|
-
await client.end();
|
|
3944
|
-
console.log('Database is ready.');
|
|
3945
|
-
process.exit(0);
|
|
3946
|
-
} catch {
|
|
3947
|
-
console.log('Database is not ready.');
|
|
3948
|
-
await client.end().catch(noop);
|
|
3949
|
-
}
|
|
3950
|
-
await new Promise((r) => setTimeout(r, 200));
|
|
3951
|
-
}
|
|
3952
|
-
|
|
3953
|
-
throw new Error(\`Timed out waiting for postgres on port \${portArg}\`);
|
|
3954
|
-
"
|
|
3955
|
-
`;
|
|
3956
|
-
|
|
3957
|
-
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/src/constants.ts 1`] = `
|
|
3958
|
-
"export const DB_PACKAGE_NAME = 'Db';
|
|
3959
|
-
|
|
3960
|
-
// Local development connection details (used when SERVE_LOCAL=true, see serve-local Nx target)
|
|
3961
|
-
export const LOCAL_DB_PORT = 5432;
|
|
3962
|
-
export const LOCAL_DB_HOST = 'localhost';
|
|
3963
|
-
export const LOCAL_DB_NAME = 'database_name';
|
|
3964
|
-
export const LOCAL_DB_USER = 'dbadmin';
|
|
3965
|
-
export const LOCAL_DB_PASSWORD = 'password';
|
|
3966
|
-
"
|
|
3967
|
-
`;
|
|
3968
|
-
|
|
3969
3784
|
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/src/create-db-user-handler.ts 1`] = `
|
|
3970
3785
|
"import type { CloudFormationCustomResourceEvent } from 'aws-lambda';
|
|
3971
3786
|
import { randomBytes } from 'node:crypto';
|
|
@@ -4015,14 +3830,12 @@ const ensureDatabaseUser = async (dbUser: string): Promise<void> => {
|
|
|
4015
3830
|
|
|
4016
3831
|
await client.query(
|
|
4017
3832
|
\`ALTER ROLE \${quotedDbUser} WITH LOGIN;
|
|
4018
|
-
GRANT
|
|
4019
|
-
GRANT USAGE
|
|
4020
|
-
GRANT
|
|
4021
|
-
GRANT
|
|
4022
|
-
|
|
4023
|
-
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT
|
|
4024
|
-
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON SEQUENCES TO \${quotedDbUser};
|
|
4025
|
-
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON FUNCTIONS TO \${quotedDbUser};
|
|
3833
|
+
GRANT CONNECT ON DATABASE \${quotedDbName} TO \${quotedDbUser};
|
|
3834
|
+
GRANT USAGE ON SCHEMA public TO \${quotedDbUser};
|
|
3835
|
+
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO \${quotedDbUser};
|
|
3836
|
+
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO \${quotedDbUser};
|
|
3837
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO \${quotedDbUser};
|
|
3838
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO \${quotedDbUser};
|
|
4026
3839
|
GRANT rds_iam TO \${quotedDbUser};\`,
|
|
4027
3840
|
);
|
|
4028
3841
|
|
|
@@ -4057,36 +3870,23 @@ export const handler = async (
|
|
|
4057
3870
|
`;
|
|
4058
3871
|
|
|
4059
3872
|
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/src/index.ts 1`] = `
|
|
4060
|
-
"export {
|
|
4061
|
-
export { getPrisma } from './prisma.js';
|
|
3873
|
+
"export { getPrisma } from './prisma.js';
|
|
4062
3874
|
"
|
|
4063
3875
|
`;
|
|
4064
3876
|
|
|
4065
3877
|
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/src/migration-handler.ts 1`] = `
|
|
4066
3878
|
"import { execFile } from 'node:child_process';
|
|
4067
3879
|
import { promisify } from 'node:util';
|
|
4068
|
-
import {
|
|
4069
|
-
import { withConnectionRetry } from './utils.js';
|
|
3880
|
+
import { getDatabaseSecret, withConnectionRetry } from './utils.js';
|
|
4070
3881
|
|
|
4071
3882
|
const buildDatabaseUrl = async (): Promise<string> => {
|
|
4072
|
-
const
|
|
4073
|
-
const port = process.env.PORT!;
|
|
4074
|
-
const database = process.env.DATABASE!;
|
|
4075
|
-
const dbUser = process.env.DBUSER!;
|
|
4076
|
-
const region = process.env.AWS_REGION!;
|
|
4077
|
-
|
|
4078
|
-
const iamAuthToken = await new Signer({
|
|
4079
|
-
hostname,
|
|
4080
|
-
port: Number(port),
|
|
4081
|
-
region,
|
|
4082
|
-
username: dbUser,
|
|
4083
|
-
}).getAuthToken();
|
|
3883
|
+
const { host, port, dbname, username, password } = await getDatabaseSecret();
|
|
4084
3884
|
|
|
4085
3885
|
return (
|
|
4086
|
-
\`postgresql://\${encodeURIComponent(
|
|
4087
|
-
\`:\${encodeURIComponent(
|
|
4088
|
-
\`@\${
|
|
4089
|
-
\`?sslaccept=strict\`
|
|
3886
|
+
\`postgresql://\${encodeURIComponent(username)}\` +
|
|
3887
|
+
\`:\${encodeURIComponent(password)}\` +
|
|
3888
|
+
\`@\${host}:\${port}/\${dbname}\` +
|
|
3889
|
+
\`?sslaccept=strict\`
|
|
4090
3890
|
);
|
|
4091
3891
|
};
|
|
4092
3892
|
|
|
@@ -4110,16 +3910,19 @@ exports[`ts#rdb generator > should generate the aurora shared construct > packag
|
|
|
4110
3910
|
import { Signer } from '@aws-sdk/rds-signer';
|
|
4111
3911
|
import { Prisma, PrismaClient } from '../generated/prisma/client.js';
|
|
4112
3912
|
import { Pool } from 'pg';
|
|
4113
|
-
import {
|
|
4114
|
-
|
|
4115
|
-
|
|
4116
|
-
LOCAL_DB_NAME,
|
|
4117
|
-
LOCAL_DB_PASSWORD,
|
|
4118
|
-
LOCAL_DB_PORT,
|
|
4119
|
-
LOCAL_DB_USER,
|
|
4120
|
-
} from './constants.js';
|
|
3913
|
+
import { readFileSync } from 'fs';
|
|
3914
|
+
import { join, dirname } from 'path';
|
|
3915
|
+
import { fileURLToPath } from 'url';
|
|
4121
3916
|
import { getDatabaseConfig } from './utils.js';
|
|
4122
3917
|
|
|
3918
|
+
// Generated: must match runtimeConfigKey in config.json
|
|
3919
|
+
const runtimeConfigKey = 'Db';
|
|
3920
|
+
|
|
3921
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
3922
|
+
// config.json is only present in local dev (not included in the deployed bundle); guard with LOCAL_DEV check
|
|
3923
|
+
const localDev = () =>
|
|
3924
|
+
JSON.parse(readFileSync(join(__dirname, '../config.json'), 'utf-8')).localDev;
|
|
3925
|
+
|
|
4123
3926
|
let prismaClient: PrismaClient<Prisma.LogLevel> | undefined;
|
|
4124
3927
|
|
|
4125
3928
|
export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
|
|
@@ -4127,14 +3930,15 @@ export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
|
|
|
4127
3930
|
): Promise<PrismaClient<LogOpts>> => {
|
|
4128
3931
|
if (prismaClient) return prismaClient;
|
|
4129
3932
|
|
|
4130
|
-
if (process.env.
|
|
3933
|
+
if (process.env.LOCAL_DEV === 'true') {
|
|
3934
|
+
const { host, port, dbName, dbUser, dbPassword } = localDev();
|
|
4131
3935
|
const adapter = new PrismaPg(
|
|
4132
3936
|
new Pool({
|
|
4133
|
-
host
|
|
4134
|
-
port
|
|
4135
|
-
database:
|
|
4136
|
-
user:
|
|
4137
|
-
password:
|
|
3937
|
+
host,
|
|
3938
|
+
port,
|
|
3939
|
+
database: dbName,
|
|
3940
|
+
user: dbUser,
|
|
3941
|
+
password: dbPassword,
|
|
4138
3942
|
allowExitOnIdle: true,
|
|
4139
3943
|
}),
|
|
4140
3944
|
);
|
|
@@ -4146,7 +3950,7 @@ export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
|
|
|
4146
3950
|
}
|
|
4147
3951
|
|
|
4148
3952
|
const { hostname, port, database, dbUser, region } =
|
|
4149
|
-
await getDatabaseConfig(
|
|
3953
|
+
await getDatabaseConfig(runtimeConfigKey);
|
|
4150
3954
|
const adapter = new PrismaPg(
|
|
4151
3955
|
new Pool({
|
|
4152
3956
|
host: hostname,
|
|
@@ -4276,6 +4080,9 @@ const transientErrorPatterns = [
|
|
|
4276
4080
|
'ECONNREFUSED',
|
|
4277
4081
|
'ENOTFOUND',
|
|
4278
4082
|
'P1000', // Prisma: authentication failed
|
|
4083
|
+
'P1001', // Prisma: can't reach database server
|
|
4084
|
+
'P1002', // Prisma: database server reached but timed out
|
|
4085
|
+
'P1010', // Prisma: user denied access (IAM auth grant not yet propagated)
|
|
4279
4086
|
'ER_ACCESS_DENIED_ERROR', // MySQL: access denied
|
|
4280
4087
|
];
|
|
4281
4088
|
|
|
@@ -4508,6 +4315,21 @@ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
|
|
|
4508
4315
|
* @default true
|
|
4509
4316
|
*/
|
|
4510
4317
|
readonly enableKeyRotation?: boolean;
|
|
4318
|
+
|
|
4319
|
+
/**
|
|
4320
|
+
* Whether to export Aurora engine logs to CloudWatch Logs.
|
|
4321
|
+
* See https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_LogAccess.html
|
|
4322
|
+
*
|
|
4323
|
+
* @default false
|
|
4324
|
+
*/
|
|
4325
|
+
readonly enableCloudwatchLogs?: boolean;
|
|
4326
|
+
|
|
4327
|
+
/**
|
|
4328
|
+
* Whether to enable Performance Insights on the Aurora writer instance.
|
|
4329
|
+
*
|
|
4330
|
+
* @default true
|
|
4331
|
+
*/
|
|
4332
|
+
readonly enablePerformanceInsights?: boolean;
|
|
4511
4333
|
}
|
|
4512
4334
|
|
|
4513
4335
|
/**
|
|
@@ -4537,6 +4359,8 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
4537
4359
|
deletionProtection = true,
|
|
4538
4360
|
removalPolicy = RemovalPolicy.RETAIN,
|
|
4539
4361
|
enableKeyRotation = true,
|
|
4362
|
+
enableCloudwatchLogs = false,
|
|
4363
|
+
enablePerformanceInsights = true,
|
|
4540
4364
|
engine,
|
|
4541
4365
|
engineVersion,
|
|
4542
4366
|
...clusterProps
|
|
@@ -4552,12 +4376,24 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
4552
4376
|
vpc,
|
|
4553
4377
|
vpcSubnets,
|
|
4554
4378
|
engine: engine.clusterEngine(engineVersion ?? engine.defaultVersion),
|
|
4555
|
-
writer:
|
|
4379
|
+
writer:
|
|
4380
|
+
writer ??
|
|
4381
|
+
ClusterInstance.serverlessV2('writer', {
|
|
4382
|
+
enablePerformanceInsights,
|
|
4383
|
+
performanceInsightEncryptionKey: enablePerformanceInsights
|
|
4384
|
+
? key
|
|
4385
|
+
: undefined,
|
|
4386
|
+
}),
|
|
4556
4387
|
credentials: Credentials.fromGeneratedSecret(adminUser, {
|
|
4557
4388
|
encryptionKey: key,
|
|
4558
4389
|
}),
|
|
4559
4390
|
iamAuthentication: true,
|
|
4560
4391
|
monitoringInterval: Duration.seconds(5),
|
|
4392
|
+
cloudwatchLogsExports: enableCloudwatchLogs
|
|
4393
|
+
? engine.type === 'mysql'
|
|
4394
|
+
? ['audit', 'error', 'general', 'slowquery']
|
|
4395
|
+
: ['postgresql']
|
|
4396
|
+
: undefined,
|
|
4561
4397
|
defaultDatabaseName: databaseName,
|
|
4562
4398
|
storageEncrypted: true,
|
|
4563
4399
|
storageEncryptionKey: key,
|
|
@@ -4654,32 +4490,19 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
4654
4490
|
timeout: Duration.minutes(5),
|
|
4655
4491
|
tracing: Tracing.ACTIVE,
|
|
4656
4492
|
vpc,
|
|
4657
|
-
environment:
|
|
4658
|
-
|
|
4659
|
-
|
|
4660
|
-
DATABASE_SECRET_ARN: this.cluster.secret!.secretArn,
|
|
4661
|
-
}
|
|
4662
|
-
: {
|
|
4663
|
-
HOSTNAME: databaseHostname,
|
|
4664
|
-
DATABASE: databaseName,
|
|
4665
|
-
PORT: databasePort.toString(),
|
|
4666
|
-
DBUSER: this.dbUser,
|
|
4667
|
-
},
|
|
4493
|
+
environment: {
|
|
4494
|
+
DATABASE_SECRET_ARN: this.cluster.secret!.secretArn,
|
|
4495
|
+
},
|
|
4668
4496
|
architecture: Architecture.ARM_64,
|
|
4669
4497
|
});
|
|
4670
4498
|
|
|
4671
|
-
|
|
4672
|
-
|
|
4673
|
-
this.grantSecretRead(migrationHandler);
|
|
4674
|
-
} else {
|
|
4675
|
-
this.allowDefaultPortFrom(migrationHandler);
|
|
4676
|
-
this.grantConnect(migrationHandler);
|
|
4677
|
-
}
|
|
4499
|
+
this.cluster.connections.allowDefaultPortFrom(migrationHandler);
|
|
4500
|
+
this.grantSecretRead(migrationHandler);
|
|
4678
4501
|
|
|
4679
|
-
const
|
|
4502
|
+
const migrationTrigger = new Trigger(this, 'MigrationTrigger', {
|
|
4680
4503
|
handler: migrationHandler,
|
|
4681
4504
|
});
|
|
4682
|
-
|
|
4505
|
+
migrationTrigger.node.addDependency(createDbUserResource);
|
|
4683
4506
|
|
|
4684
4507
|
new CfnOutput(this, 'ClusterEndpoint', {
|
|
4685
4508
|
value: this.cluster.clusterEndpoint.hostname,
|
|
@@ -4720,8 +4543,8 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
4720
4543
|
exports[`ts#rdb generator > should generate the aurora shared construct 2`] = `
|
|
4721
4544
|
"import * as path from 'path';
|
|
4722
4545
|
import * as url from 'url';
|
|
4546
|
+
import { readFileSync } from 'fs';
|
|
4723
4547
|
import { Construct } from 'constructs';
|
|
4724
|
-
import { DB_PACKAGE_NAME } from ':proj/db';
|
|
4725
4548
|
import {
|
|
4726
4549
|
AuroraDatabase,
|
|
4727
4550
|
AuroraDatabaseEngines,
|
|
@@ -4729,6 +4552,16 @@ import {
|
|
|
4729
4552
|
} from '../../core/rdb/aurora.js';
|
|
4730
4553
|
import { findWorkspaceRoot } from '../../core/workspace.js';
|
|
4731
4554
|
|
|
4555
|
+
const { runtimeConfigKey } = JSON.parse(
|
|
4556
|
+
readFileSync(
|
|
4557
|
+
path.join(
|
|
4558
|
+
findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
|
|
4559
|
+
'packages/db/config.json',
|
|
4560
|
+
),
|
|
4561
|
+
'utf-8',
|
|
4562
|
+
),
|
|
4563
|
+
) as { runtimeConfigKey: string };
|
|
4564
|
+
|
|
4732
4565
|
export type DbProps = Omit<
|
|
4733
4566
|
AuroraDatabaseProps,
|
|
4734
4567
|
| 'databaseName'
|
|
@@ -4748,7 +4581,7 @@ export class Db extends AuroraDatabase {
|
|
|
4748
4581
|
...props,
|
|
4749
4582
|
databaseName: 'database_name',
|
|
4750
4583
|
adminUser: 'databaseUser',
|
|
4751
|
-
runtimeConfigKey
|
|
4584
|
+
runtimeConfigKey,
|
|
4752
4585
|
migrationBundleDir: path.join(
|
|
4753
4586
|
findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
|
|
4754
4587
|
'dist/packages/db/bundle/migration',
|
|
@@ -4766,17 +4599,14 @@ export class Db extends AuroraDatabase {
|
|
|
4766
4599
|
|
|
4767
4600
|
exports[`ts#rdb generator > should generate the aurora shared construct 3`] = `
|
|
4768
4601
|
"import { defineConfig } from 'prisma/config';
|
|
4602
|
+
import { readFileSync } from 'fs';
|
|
4769
4603
|
|
|
4770
4604
|
const getDatabaseUrl = async () => {
|
|
4771
|
-
if (process.env.
|
|
4772
|
-
const {
|
|
4773
|
-
|
|
4774
|
-
|
|
4775
|
-
|
|
4776
|
-
LOCAL_DB_PORT,
|
|
4777
|
-
LOCAL_DB_USER,
|
|
4778
|
-
} = await import('./src/constants.js');
|
|
4779
|
-
return \`postgresql://\${LOCAL_DB_USER}:\${LOCAL_DB_PASSWORD}@\${LOCAL_DB_HOST}:\${LOCAL_DB_PORT}/\${LOCAL_DB_NAME}\`;
|
|
4605
|
+
if (process.env.LOCAL_DEV === 'true') {
|
|
4606
|
+
const { host, port, dbName, dbUser, dbPassword } = JSON.parse(
|
|
4607
|
+
readFileSync('config.json', 'utf-8'),
|
|
4608
|
+
).localDev;
|
|
4609
|
+
return \`postgresql://\${dbUser}:\${dbPassword}@\${host}:\${port}/\${dbName}\`;
|
|
4780
4610
|
}
|
|
4781
4611
|
return process.env.DATABASE_URL;
|
|
4782
4612
|
};
|