@aws/nx-plugin 1.0.5 → 1.0.6

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.
Files changed (34) hide show
  1. package/LICENSE-THIRD-PARTY +68 -90
  2. package/migrations.json +6 -6
  3. package/package.json +6 -6
  4. package/src/agentcore-gateway/__snapshots__/generator.spec.ts.snap +1 -1
  5. package/src/infra/app/__snapshots__/generator.spec.ts.snap +3 -3
  6. package/src/migrations/v1.0.5/0001-api-custom-domain-runtime-config/migration.js.map +1 -0
  7. package/src/preset/__snapshots__/generator.spec.ts.snap +2 -2
  8. package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +6 -6
  9. package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +8 -8
  10. package/src/py/agent/__snapshots__/generator.protocols.spec.ts.snap +4 -4
  11. package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +2 -2
  12. package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +12 -12
  13. package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +2 -2
  14. package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +4 -4
  15. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +2 -2
  16. package/src/smithy/project/__snapshots__/generator.spec.ts.snap +5 -5
  17. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +8 -8
  18. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +12 -12
  19. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +4 -4
  20. package/src/ts/dcr-proxy/__snapshots__/generator.spec.ts.snap +1 -1
  21. package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +2 -2
  22. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +2 -2
  23. package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +2 -2
  24. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +6 -6
  25. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +21 -21
  26. package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +2 -2
  27. package/src/utils/docker.d.ts +1 -1
  28. package/src/utils/versions.d.ts +56 -56
  29. package/src/utils/versions.js +55 -55
  30. package/src/utils/versions.js.map +1 -1
  31. package/src/migrations/latest/api-custom-domain-runtime-config/migration.js.map +0 -1
  32. /package/src/migrations/{latest/api-custom-domain-runtime-config → v1.0.5/0001-api-custom-domain-runtime-config}/metadata.json +0 -0
  33. /package/src/migrations/{latest/api-custom-domain-runtime-config → v1.0.5/0001-api-custom-domain-runtime-config}/migration.d.ts +0 -0
  34. /package/src/migrations/{latest/api-custom-domain-runtime-config → v1.0.5/0001-api-custom-domain-runtime-config}/migration.js +0 -0
@@ -108,7 +108,7 @@ THE SOFTWARE.
108
108
 
109
109
  ---
110
110
 
111
- The following software may be included in this product: @astral-sh/ruff-wasm-nodejs (0.16.9)
111
+ The following software may be included in this product: @astral-sh/ruff-wasm-nodejs (0.16.10)
112
112
  This software contains the following license and notice below:
113
113
 
114
114
  MIT License
@@ -3898,7 +3898,7 @@ SOFTWARE.
3898
3898
 
3899
3899
  ---
3900
3900
 
3901
- The following software may be included in this product: @modelcontextprotocol/sdk (1.30.1)
3901
+ The following software may be included in this product: @modelcontextprotocol/sdk (1.32.0)
3902
3902
  This software contains the following license and notice below:
3903
3903
 
3904
3904
  MIT License
@@ -4247,7 +4247,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
4247
4247
 
4248
4248
  ---
4249
4249
 
4250
- The following software may be included in this product: @nxlv/python (23.1.1)
4250
+ The following software may be included in this product: @nxlv/python (23.2.1)
4251
4251
  This software contains the following license and notice below:
4252
4252
 
4253
4253
  MIT License
@@ -16088,7 +16088,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
16088
16088
 
16089
16089
  ---
16090
16090
 
16091
- The following software may be included in this product: vite (8.3.1)
16091
+ The following software may be included in this product: vite (8.3.2)
16092
16092
  This software contains the following license and notice below:
16093
16093
 
16094
16094
  # Vite core license
@@ -16767,35 +16767,6 @@ Repository: https://github.com/expressjs/cors
16767
16767
 
16768
16768
  ---------------------------------------
16769
16769
 
16770
- ## cross-spawn
16771
- License: MIT
16772
- By: André Cruz
16773
- Repository: https://github.com/moxystudio/node-cross-spawn
16774
-
16775
- > The MIT License (MIT)
16776
- >
16777
- > Copyright (c) 2018 Made With MOXY Lda <hello@moxy.studio>
16778
- >
16779
- > Permission is hereby granted, free of charge, to any person obtaining a copy
16780
- > of this software and associated documentation files (the "Software"), to deal
16781
- > in the Software without restriction, including without limitation the rights
16782
- > to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16783
- > copies of the Software, and to permit persons to whom the Software is
16784
- > furnished to do so, subject to the following conditions:
16785
- >
16786
- > The above copyright notice and this permission notice shall be included in
16787
- > all copies or substantial portions of the Software.
16788
- >
16789
- > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16790
- > IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16791
- > FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16792
- > AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16793
- > LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
16794
- > OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
16795
- > THE SOFTWARE.
16796
-
16797
- ---------------------------------------
16798
-
16799
16770
  ## cssesc
16800
16771
  License: MIT
16801
16772
  By: Mathias Bynens
@@ -17319,29 +17290,6 @@ Repository: https://github.com/Rich-Harris/is-reference
17319
17290
 
17320
17291
  ---------------------------------------
17321
17292
 
17322
- ## isexe, which
17323
- License: ISC
17324
- By: Isaac Z. Schlueter
17325
- Repositories: https://github.com/isaacs/isexe, https://github.com/isaacs/node-which
17326
-
17327
- > The ISC License
17328
- >
17329
- > Copyright (c) Isaac Z. Schlueter and Contributors
17330
- >
17331
- > Permission to use, copy, modify, and/or distribute this software for any
17332
- > purpose with or without fee is hereby granted, provided that the above
17333
- > copyright notice and this permission notice appear in all copies.
17334
- >
17335
- > THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
17336
- > WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
17337
- > MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
17338
- > ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
17339
- > WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17340
- > ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
17341
- > IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17342
-
17343
- ---------------------------------------
17344
-
17345
17293
  ## js-tokens
17346
17294
  License: MIT
17347
17295
  By: Simon Lydell
@@ -17762,23 +17710,6 @@ Repository: https://github.com/pillarjs/parseurl
17762
17710
 
17763
17711
  ---------------------------------------
17764
17712
 
17765
- ## path-key, shebang-regex
17766
- License: MIT
17767
- By: Sindre Sorhus
17768
- Repositories: https://github.com/sindresorhus/path-key, https://github.com/sindresorhus/shebang-regex
17769
-
17770
- > MIT License
17771
- >
17772
- > Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
17773
- >
17774
- > Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
17775
- >
17776
- > The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
17777
- >
17778
- > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
17779
-
17780
- ---------------------------------------
17781
-
17782
17713
  ## periscopic
17783
17714
  License: MIT
17784
17715
  Repository: https://github.com/Rich-Harris/periscopic
@@ -18089,23 +18020,6 @@ Repositories: https://github.com/lukeed/resolve.exports, https://github.com/luke
18089
18020
 
18090
18021
  ---------------------------------------
18091
18022
 
18092
- ## shebang-command
18093
- License: MIT
18094
- By: Kevin Mårtensson
18095
- Repository: https://github.com/kevva/shebang-command
18096
-
18097
- > MIT License
18098
- >
18099
- > Copyright (c) Kevin Mårtensson <kevinmartensson@gmail.com> (github.com/kevva)
18100
- >
18101
- > Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
18102
- >
18103
- > The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
18104
- >
18105
- > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
18106
-
18107
- ---------------------------------------
18108
-
18109
18023
  ## shell-quote
18110
18024
  License: MIT
18111
18025
  By: James Halliday
@@ -18211,6 +18125,35 @@ Repository: https://github.com/antfu/strip-literal
18211
18125
 
18212
18126
  ---------------------------------------
18213
18127
 
18128
+ ## tinyexec
18129
+ License: MIT
18130
+ By: James Garbutt
18131
+ Repository: https://github.com/tinylibs/tinyexec
18132
+
18133
+ > MIT License
18134
+ >
18135
+ > Copyright (c) 2024 Tinylibs
18136
+ >
18137
+ > Permission is hereby granted, free of charge, to any person obtaining a copy
18138
+ > of this software and associated documentation files (the "Software"), to deal
18139
+ > in the Software without restriction, including without limitation the rights
18140
+ > to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18141
+ > copies of the Software, and to permit persons to whom the Software is
18142
+ > furnished to do so, subject to the following conditions:
18143
+ >
18144
+ > The above copyright notice and this permission notice shall be included in all
18145
+ > copies or substantial portions of the Software.
18146
+ >
18147
+ > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18148
+ > IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18149
+ > FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18150
+ > AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18151
+ > LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18152
+ > OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
18153
+ > SOFTWARE.
18154
+
18155
+ ---------------------------------------
18156
+
18214
18157
  ## to-regex-range
18215
18158
  License: MIT
18216
18159
  By: Jon Schlinkert, Rouven Weßling
@@ -27569,6 +27512,41 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27569
27512
 
27570
27513
  ---
27571
27514
 
27515
+ The following software may be included in this product: qs (6.16.0)
27516
+ This software contains the following license and notice below:
27517
+
27518
+ BSD 3-Clause License
27519
+
27520
+ Copyright (c) 2014, Nathan LaFreniere and other [contributors](https://github.com/ljharb/qs/graphs/contributors)
27521
+ All rights reserved.
27522
+
27523
+ Redistribution and use in source and binary forms, with or without
27524
+ modification, are permitted provided that the following conditions are met:
27525
+
27526
+ 1. Redistributions of source code must retain the above copyright notice, this
27527
+ list of conditions and the following disclaimer.
27528
+
27529
+ 2. Redistributions in binary form must reproduce the above copyright notice,
27530
+ this list of conditions and the following disclaimer in the documentation
27531
+ and/or other materials provided with the distribution.
27532
+
27533
+ 3. Neither the name of the copyright holder nor the names of its
27534
+ contributors may be used to endorse or promote products derived from
27535
+ this software without specific prior written permission.
27536
+
27537
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27538
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27539
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27540
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
27541
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27542
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27543
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27544
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27545
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27546
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27547
+
27548
+ ---
27549
+
27572
27550
  The following software may be included in this product: smol-toml (1.6.1)
27573
27551
  This software contains the following license and notice below:
27574
27552
 
package/migrations.json CHANGED
@@ -2,11 +2,6 @@
2
2
  "$schema": "http://json-schema.org/schema",
3
3
  "name": "@aws/nx-plugin",
4
4
  "generators": {
5
- "latest-api-custom-domain-runtime-config": {
6
- "version": "1.0.5",
7
- "description": "Publish a configured custom domain as the API URL in runtime config for vended REST/HTTP API constructs and Terraform modules, and add custom domain inputs to the Terraform API modules",
8
- "implementation": "./src/migrations/latest/api-custom-domain-runtime-config/migration"
9
- },
10
5
  "v1.0.0-rc.50-0001-modernize-function-props-cast": {
11
6
  "version": "1.0.0-rc.50",
12
7
  "description": "Replace the legacy angle-bracket FunctionProps type assertion with the modern as syntax in generated API constructs",
@@ -382,8 +377,13 @@
382
377
  "description": "Add the terraform-init target to Terraform projects so the shared provider plugin cache has a single writer",
383
378
  "implementation": "./src/migrations/v1.0.3/0001-terraform-init-target/migration"
384
379
  },
385
- "sync-vended-versions": {
380
+ "v1.0.5-0001-api-custom-domain-runtime-config": {
386
381
  "version": "1.0.5",
382
+ "description": "Publish a configured custom domain as the API URL in runtime config for vended REST/HTTP API constructs and Terraform modules, and add custom domain inputs to the Terraform API modules",
383
+ "implementation": "./src/migrations/v1.0.5/0001-api-custom-domain-runtime-config/migration"
384
+ },
385
+ "sync-vended-versions": {
386
+ "version": "1.0.6",
387
387
  "description": "Sync vended dependency versions and the tracked plugin version to those vended by this release",
388
388
  "implementation": "./src/utils/version-upgrade-migration/migration"
389
389
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws/nx-plugin",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/awslabs/nx-plugin-for-aws.git",
@@ -40,17 +40,17 @@
40
40
  },
41
41
  "dependencies": {
42
42
  "@apidevtools/swagger-parser": "12.1.0",
43
- "@astral-sh/ruff-wasm-nodejs": "0.16.9",
43
+ "@astral-sh/ruff-wasm-nodejs": "0.16.10",
44
44
  "@biomejs/js-api": "6.0.0",
45
- "@biomejs/wasm-nodejs": "2.5.14",
45
+ "@biomejs/wasm-nodejs": "2.5.15",
46
46
  "@getgrit/gritql": "0.0.3",
47
47
  "@iarna/toml": "2.2.5",
48
- "@modelcontextprotocol/sdk": "1.30.1",
48
+ "@modelcontextprotocol/sdk": "1.32.0",
49
49
  "@nx/devkit": "23.2.1",
50
50
  "@nx/js": "23.2.1",
51
51
  "@nx/react": "23.2.1",
52
52
  "@nx/vite": "23.2.1",
53
- "@nxlv/python": "23.1.1",
53
+ "@nxlv/python": "23.2.1",
54
54
  "@phenomnomnominal/tsquery": "6.2.0",
55
55
  "@types/estree": "1.0.9",
56
56
  "@types/js-yaml": "4.0.9",
@@ -79,7 +79,7 @@
79
79
  "typescript": "6.0.3",
80
80
  "unified": "11.0.5",
81
81
  "unist-util-visit": "5.1.0",
82
- "vite": "8.3.1",
82
+ "vite": "8.3.2",
83
83
  "vitest": "4.1.11",
84
84
  "zod": "4.6.5"
85
85
  },
@@ -7,7 +7,7 @@ exports[`agentcore-gateway generator > protocol: http > omits protocol_type from
7
7
  required_providers {
8
8
  aws = {
9
9
  source = "hashicorp/aws"
10
- version = "6.66.0"
10
+ version = "6.67.0"
11
11
  }
12
12
  time = {
13
13
  source = "hashicorp/time"
@@ -50,7 +50,7 @@ exports[`infra generator > should configure Checkov target correctly > checkov-t
50
50
  "default",
51
51
  ],
52
52
  "options": {
53
- "command": "uvx --from checkov==3.3.20 checkov --config-file {projectRoot}/checkov.yml --directory dist/{projectRoot}/cdk.out --framework cloudformation",
53
+ "command": "uvx --from checkov==3.3.22 checkov --config-file {projectRoot}/checkov.yml --directory dist/{projectRoot}/cdk.out --framework cloudformation",
54
54
  },
55
55
  "outputs": [
56
56
  "{workspaceRoot}/dist/{projectRoot}/checkov",
@@ -150,7 +150,7 @@ exports[`infra generator > should configure project.json with correct targets >
150
150
  "default",
151
151
  ],
152
152
  "options": {
153
- "command": "uvx --from checkov==3.3.20 checkov --config-file {projectRoot}/checkov.yml --directory dist/{projectRoot}/cdk.out --framework cloudformation",
153
+ "command": "uvx --from checkov==3.3.22 checkov --config-file {projectRoot}/checkov.yml --directory dist/{projectRoot}/cdk.out --framework cloudformation",
154
154
  },
155
155
  "outputs": [
156
156
  "{workspaceRoot}/dist/{projectRoot}/checkov",
@@ -762,7 +762,7 @@ exports[`infra generator > should handle custom project names correctly > custom
762
762
  "default",
763
763
  ],
764
764
  "options": {
765
- "command": "uvx --from checkov==3.3.20 checkov --config-file {projectRoot}/checkov.yml --directory dist/{projectRoot}/cdk.out --framework cloudformation",
765
+ "command": "uvx --from checkov==3.3.22 checkov --config-file {projectRoot}/checkov.yml --directory dist/{projectRoot}/cdk.out --framework cloudformation",
766
766
  },
767
767
  "outputs": [
768
768
  "{workspaceRoot}/dist/{projectRoot}/checkov",
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/migrations/v1.0.5/0001-api-custom-domain-runtime-config/migration.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n joinPathFragments,\n type MigrationReturnObject,\n type Tree,\n} from '@nx/devkit';\nimport {\n addDestructuredImport,\n applyGritQL,\n GRIT_INSERT_PLACEHOLDER,\n insertViaGritQL,\n matchGritQL,\n} from '../../../utils/ast.js';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\nimport {\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n SHARED_TERRAFORM_DIR,\n} from '../../../utils/shared-constructs-constants.js';\n\n/**\n * Publish an API's custom domain, when one is configured, as its URL in runtime\n * config, so clients call it rather than the generated execute-api endpoint.\n *\n * - The vended CDK `RestApi` publishes `https://<domainName>/[<basePath>/]` when\n * `domainName` is set.\n * - The vended CDK `HttpApi` forwards `defaultDomainMapping` to the stage it\n * creates (previously rejected by CDK, since the construct disables the\n * default stage) and publishes the mapping's domain URL.\n * - Each vended Terraform API app module (`app/apis/<name>/<name>.tf`) gains\n * `custom_domain_name` / `acm_certificate_arn` variables, the domain and\n * mapping resources, an `api_url` local published in runtime config, and\n * outputs for the URL and DNS record targets.\n *\n * These files are generated with `KeepExisting`, so an upgraded workspace keeps\n * the old shape until this runs. Diverged files are left untouched and\n * reported via `nextSteps`.\n */\n\nconst CONSTRUCTS_API_DIR = `${PACKAGES_DIR}/${SHARED_CONSTRUCTS_DIR}/src/core/api`;\nconst REST_API_CONSTRUCT = `${CONSTRUCTS_API_DIR}/rest-api.ts`;\nconst HTTP_API_CONSTRUCT = `${CONSTRUCTS_API_DIR}/http-api.ts`;\nconst TERRAFORM_APIS_DIR = `${PACKAGES_DIR}/${SHARED_TERRAFORM_DIR}/src/app/apis`;\n\nconst hcl = (pattern: string) => `language hcl\\n${pattern}`;\n\n/** Whether the pattern matches any `.tf` file in the Terraform module directory. */\nconst matchesInModule = async (\n tree: Tree,\n moduleDir: string,\n pattern: string,\n) => {\n for (const child of tree.children(moduleDir)) {\n const path = joinPathFragments(moduleDir, child);\n if (\n child.endsWith('.tf') &&\n tree.isFile(path) &&\n (await matchGritQL(tree, path, pattern))\n ) {\n return true;\n }\n }\n return false;\n};\n\n/** Whether every pattern matches the file. */\nconst matchesAll = async (tree: Tree, file: string, patterns: string[]) => {\n for (const pattern of patterns) {\n if (!(await matchGritQL(tree, file, pattern))) {\n return false;\n }\n }\n return true;\n};\n\nconst REST_RUNTIME_CONFIG_URL = `domainName\n ? \\`https://\\${domainName.domainName}/\\${domainName.basePath ? \\`\\${domainName.basePath}/\\` : ''}\\`\n : this.api.url!`;\n\nconst REST_DOMAIN_OUTPUTS = `// Target for the custom domain's DNS record\n if (domainName) {\n new CfnOutput(this, \\`\\${apiName}DomainNameAlias\\`, {\n value: this.api.domainName!.domainNameAliasDomainName,\n description:\n 'Domain name of the API Gateway endpoint (regional or edge) to point a CNAME record at for the custom domain, with any DNS provider',\n });\n new CfnOutput(this, \\`\\${apiName}DomainNameAliasHostedZoneId\\`, {\n value: this.api.domainName!.domainNameAliasHostedZoneId,\n description:\n 'Hosted zone ID of that domain name, needed only for a Route 53 alias record',\n });\n }`;\n\nconst HTTP_DOMAIN_OUTPUTS = `// Target for the custom domain's DNS record\n if (defaultDomainMapping) {\n new CfnOutput(this, \\`\\${apiName}DomainNameAlias\\`, {\n value: defaultDomainMapping.domainName.regionalDomainName,\n description:\n 'Regional domain name to point a CNAME record at for the custom domain, with any DNS provider',\n });\n new CfnOutput(this, \\`\\${apiName}DomainNameAliasHostedZoneId\\`, {\n value: defaultDomainMapping.domainName.regionalHostedZoneId,\n description:\n 'Hosted zone ID of the regional domain name, needed only for a Route 53 alias record',\n });\n }`;\n\nconst HTTP_DOMAIN_MAPPING_PROP = `/**\n * Custom domain mapped to the API's default stage\n */\n readonly defaultDomainMapping?: DomainMappingOptions & {\n readonly domainName: IDomainName;\n }`;\n\n/** Matches a DNS record output this migration adds. */\nconst DOMAIN_ALIAS_OUTPUT =\n '`new CfnOutput(this, $id, $_)` where { $id <: r\".*DomainNameAlias.*\" }';\n\n/** Rewrite inserting {@link GRIT_INSERT_PLACEHOLDER} after the runtime config registration. */\nconst AFTER_RUNTIME_CONFIG = `\\`$call;\\` as $statement where {\n $call <: \\`rc.set('connection', 'apis', $_)\\`,\n $statement => \\`$call;\\n\\n ${GRIT_INSERT_PLACEHOLDER}\\`\n}`;\n\nconst migrateRestApiConstruct = async (tree: Tree, nextSteps: string[]) => {\n const file = REST_API_CONSTRUCT;\n if (!tree.exists(file)) {\n return;\n }\n\n if (await matchGritQL(tree, file, '`[apiName]: domainName ? $_ : $_`')) {\n return; // Already migrated.\n }\n\n const shape = [\n '`{ $params }: RestApiProps<$_, $_>` where { $params <: contains `...props`, $params <: not contains `domainName` }',\n \"`new _RestApi(this, 'Api', { $props })` where { $props <: contains `...props`, $props <: not contains `domainName` }\",\n \"`rc.set('connection', 'apis', { $entries })` where { $entries <: contains `[apiName]: this.api.url!` }\",\n ];\n if (\n !(await matchesAll(tree, file, shape)) ||\n (await matchGritQL(tree, file, DOMAIN_ALIAS_OUTPUT))\n ) {\n nextSteps.push(\n `${file}: has diverged from the generated shape - left untouched. To publish a configured custom domain to clients, destructure \\`domainName\\` from the constructor props and pass it to the CDK RestApi, register \\`https://\\${domainName.domainName}/\\` (plus any \\`basePath\\`) under \\`[apiName]\\` in the \\`rc.set('connection', 'apis', ...)\\` call when it is set instead of \\`this.api.url\\`, and output \\`this.api.domainName.domainNameAliasDomainName\\` / \\`domainNameAliasHostedZoneId\\` for the DNS record.`,\n );\n return;\n }\n\n // Taken out of `props` and passed explicitly, so it is in scope below.\n await applyGritQL(\n tree,\n file,\n '`{ $params }: RestApiProps<$_, $_>` where { $params <: contains `...props` as $rest, $rest => `domainName,\\n ...props` }',\n );\n await applyGritQL(\n tree,\n file,\n \"`new _RestApi(this, 'Api', { $props })` where { $props <: contains `...props` as $spread, $spread => `...props,\\n domainName` }\",\n );\n await insertViaGritQL(\n tree,\n file,\n \"`rc.set('connection', 'apis', { $entries })` where { $entries <: contains `[apiName]: this.api.url!` as $url, $url => `[apiName]: __GRIT_INSERT_PLACEHOLDER__` }\",\n REST_RUNTIME_CONFIG_URL,\n );\n await insertViaGritQL(tree, file, AFTER_RUNTIME_CONFIG, REST_DOMAIN_OUTPUTS);\n // Listed first, as the generator vends it.\n const imported = await applyGritQL(\n tree,\n file,\n \"`import { $names } from 'aws-cdk-lib'` where { $names <: not contains `CfnOutput` } => `import { CfnOutput, $names } from 'aws-cdk-lib'`\",\n );\n if (!imported) {\n await addDestructuredImport(tree, file, ['CfnOutput'], 'aws-cdk-lib');\n }\n};\n\nconst HTTP_API_URL_FIELD = `/** The URL clients call: the custom domain's if one is mapped, otherwise the stage's */\n private readonly apiUrl: string`;\n\nconst HTTP_API_URL_ASSIGNMENT = `this.apiUrl = defaultDomainMapping\n ? this.defaultStage.domainUrl\n : this.defaultStage.url!;`;\n\n/** Matches the vended `url` getter, returning the stage URL. */\nconst HTTP_URL_GETTER =\n 'method_definition(name=$name, body=$body) where { $name <: `url`, $body <: contains `return this.defaultStage.url` }';\n\nconst migrateHttpApiConstruct = async (tree: Tree, nextSteps: string[]) => {\n const file = HTTP_API_CONSTRUCT;\n if (!tree.exists(file)) {\n return;\n }\n\n if (await matchGritQL(tree, file, '`[apiName]: this.apiUrl`')) {\n return; // Already migrated.\n }\n\n const shape = [\n 'interface_declaration(name=$name, body=$body) as $interface where { $name <: `HttpApiProps`, $interface <: contains extends_type_clause() as $extends, $extends <: contains `_HttpApiProps`, $extends <: not contains `Omit`, $body <: contains `readonly throttle?: ThrottleSettings`, $body <: not contains `defaultDomainMapping` }',\n \"`import { $names } from 'aws-cdk-lib/aws-apigatewayv2'` where { $names <: contains `HttpApi as _HttpApi`, $names <: contains `HttpStage`, $names <: not contains `DomainMappingOptions`, $names <: not contains `IDomainName` }\",\n '`public readonly defaultStage: HttpStage`',\n '`{ $params }: HttpApiProps<$_, $_>` where { $params <: contains `...props`, $params <: not contains `defaultDomainMapping` }',\n \"`this.defaultStage = new HttpStage(this, 'DefaultStage', { $props })` where { $props <: contains `httpApi: this.api`, $props <: not contains `domainMapping` }\",\n '`new CfnOutput(this, $_, { $props })` where { $props <: contains `value: this.defaultStage.url!` }',\n \"`rc.set('connection', 'apis', { $entries })` where { $entries <: contains `[apiName]: this.defaultStage.url!` }\",\n HTTP_URL_GETTER,\n ];\n if (\n !(await matchesAll(tree, file, shape)) ||\n (await matchGritQL(tree, file, DOMAIN_ALIAS_OUTPUT)) ||\n (await matchGritQL(tree, file, '`this.apiUrl`'))\n ) {\n nextSteps.push(\n `${file}: has diverged from the generated shape - left untouched. To support a custom domain, destructure \\`defaultDomainMapping\\` from the constructor props (so it is not passed to the CDK HttpApi, which rejects it when the default stage is disabled) and pass it as \\`domainMapping\\` to the \\`DefaultStage\\` HttpStage; use \\`this.defaultStage.domainUrl\\` instead of \\`this.defaultStage.url\\` when it is set, for the \\`<apiName>Url\\` output, runtime config and the \\`url\\` getter; and output \\`defaultDomainMapping.domainName.regionalDomainName\\` / \\`regionalHostedZoneId\\` for the DNS record.`,\n );\n return;\n }\n\n // Typed as a domain exposing its regional attributes, for the DNS outputs.\n await insertViaGritQL(\n tree,\n file,\n 'interface_declaration(name=$name, body=$body) where { $name <: `HttpApiProps`, $body <: contains `readonly throttle?: ThrottleSettings` as $throttle, $throttle => `readonly throttle?: ThrottleSettings;\\n __GRIT_INSERT_PLACEHOLDER__` }',\n HTTP_DOMAIN_MAPPING_PROP,\n );\n // Only the `_HttpApiProps` base is replaced, keeping any others.\n await applyGritQL(\n tree,\n file,\n \"interface_declaration(name=$name) as $interface where { $name <: `HttpApiProps`, $interface <: contains extends_type_clause() as $extends, $extends <: contains `_HttpApiProps` as $base, $base => `Omit<_HttpApiProps, 'defaultDomainMapping'>` }\",\n );\n // Inserted in sorted position, as the generator vends them.\n await applyGritQL(\n tree,\n file,\n \"`import { $names } from 'aws-cdk-lib/aws-apigatewayv2'` where { $names <: contains `HttpApi as _HttpApi` as $httpApi, $httpApi => `DomainMappingOptions,\\n HttpApi as _HttpApi` }\",\n );\n await applyGritQL(\n tree,\n file,\n \"`import { $names } from 'aws-cdk-lib/aws-apigatewayv2'` where { $names <: contains `HttpStage` as $stage, $stage => `HttpStage,\\n IDomainName` }\",\n );\n await insertViaGritQL(\n tree,\n file,\n '`public readonly defaultStage: HttpStage` as $field => `public readonly defaultStage: HttpStage;\\n\\n __GRIT_INSERT_PLACEHOLDER__`',\n HTTP_API_URL_FIELD,\n );\n // Taken out of `props` so it isn't passed to the CDK HttpApi.\n await applyGritQL(\n tree,\n file,\n '`{ $params }: HttpApiProps<$_, $_>` where { $params <: contains `...props` as $rest, $rest => `defaultDomainMapping,\\n ...props` }',\n );\n await applyGritQL(\n tree,\n file,\n \"`new HttpStage(this, 'DefaultStage', { $props })` where { $props <: contains `httpApi: this.api` as $httpApi, $httpApi => `httpApi: this.api,\\n domainMapping: defaultDomainMapping` }\",\n );\n // Computed once, for the stack output, runtime config and the `url` getter.\n await insertViaGritQL(\n tree,\n file,\n `expression_statement() as $statement where {\n $statement <: contains \\`this.defaultStage = new HttpStage($_, $_, $_)\\` as $assignment,\n $statement => \\`$assignment;\\n ${GRIT_INSERT_PLACEHOLDER}\\`\n}`,\n HTTP_API_URL_ASSIGNMENT,\n );\n await applyGritQL(\n tree,\n file,\n '`new CfnOutput(this, $_, { $props })` where { $props <: contains `value: this.defaultStage.url!` as $value, $value => `value: this.apiUrl` }',\n );\n await applyGritQL(\n tree,\n file,\n \"`rc.set('connection', 'apis', { $entries })` where { $entries <: contains `[apiName]: this.defaultStage.url!` as $url, $url => `[apiName]: this.apiUrl` }\",\n );\n await applyGritQL(\n tree,\n file,\n 'method_definition(name=$name, body=$body) where { $name <: `url`, $body <: contains `return this.defaultStage.url` as $return, $return => `return this.apiUrl` }',\n );\n await insertViaGritQL(tree, file, AFTER_RUNTIME_CONFIG, HTTP_DOMAIN_OUTPUTS);\n};\n\nconst TERRAFORM_VARIABLES = `# Custom domain configuration\nvariable \"custom_domain_name\" {\n description = \"Custom domain name for the API. Requires acm_certificate_arn.\"\n type = string\n default = null\n}\n\nvariable \"acm_certificate_arn\" {\n description = \"ARN of an ACM certificate (in the API's region) for the custom domain name.\"\n type = string\n default = null\n}`;\n\n/** The differences between the REST and HTTP Terraform app modules. */\ninterface TerraformApi {\n kind: 'REST' | 'HTTP';\n /** A block only this kind of app module declares. */\n identifyingBlock: string;\n /** Matches exactly the runtime config `value` the app module was generated with. */\n runtimeConfigUrl: string;\n /** Types of the custom domain and mapping resources this migration adds. */\n domainResourceTypes: [string, string];\n domainResources: string;\n /** The `api_url` local, published in runtime config. */\n apiUrlLocal: string;\n outputs: string;\n}\n\nconst REST_TERRAFORM: TerraformApi = {\n kind: 'REST',\n identifyingBlock: '`resource \"aws_api_gateway_stage\" \"api_stage\" { $_ }`',\n runtimeConfigUrl:\n '$v <: r\"\\\\\"\\\\$\\\\{aws_api_gateway_stage\\\\.api_stage\\\\.invoke_url\\\\}/\\\\\"\"',\n domainResourceTypes: [\n 'aws_api_gateway_domain_name',\n 'aws_api_gateway_base_path_mapping',\n ],\n domainResources: `# Custom domain for the API, served without the stage path prefix\nresource \"aws_api_gateway_domain_name\" \"custom_domain\" {\n count = var.custom_domain_name == null ? 0 : 1\n\n domain_name = var.custom_domain_name\n regional_certificate_arn = var.acm_certificate_arn\n security_policy = \"TLS_1_2\"\n\n endpoint_configuration {\n types = [\"REGIONAL\"]\n }\n\n tags = var.tags\n\n lifecycle {\n precondition {\n condition = var.acm_certificate_arn != null\n error_message = \"acm_certificate_arn is required when custom_domain_name is set.\"\n }\n }\n}\n\nresource \"aws_api_gateway_base_path_mapping\" \"custom_domain\" {\n count = var.custom_domain_name == null ? 0 : 1\n\n api_id = module.rest_api.api_id\n stage_name = aws_api_gateway_stage.api_stage.stage_name\n domain_name = aws_api_gateway_domain_name.custom_domain[0].domain_name\n}`,\n apiUrlLocal: `locals {\n api_url = var.custom_domain_name == null ? \"\\${aws_api_gateway_stage.api_stage.invoke_url}/\" : \"https://\\${var.custom_domain_name}/\"\n}`,\n outputs: `output \"api_url\" {\n description = \"URL clients should call: the custom domain if configured, otherwise the stage invoke URL\"\n value = local.api_url\n}\n\noutput \"custom_domain_target_domain_name\" {\n description = \"Target domain name to point a DNS alias or CNAME record at for the custom domain\"\n value = var.custom_domain_name == null ? null : aws_api_gateway_domain_name.custom_domain[0].regional_domain_name\n}\n\noutput \"custom_domain_hosted_zone_id\" {\n description = \"Hosted zone ID to use for a Route 53 alias record for the custom domain\"\n value = var.custom_domain_name == null ? null : aws_api_gateway_domain_name.custom_domain[0].regional_zone_id\n}`,\n};\n\nconst HTTP_TERRAFORM: TerraformApi = {\n kind: 'HTTP',\n identifyingBlock: '`module \"http_api\" { $_ }`',\n runtimeConfigUrl: '$v <: `module.http_api.stage_invoke_url`',\n domainResourceTypes: [\n 'aws_apigatewayv2_domain_name',\n 'aws_apigatewayv2_api_mapping',\n ],\n domainResources: `# Custom domain for the API\nresource \"aws_apigatewayv2_domain_name\" \"custom_domain\" {\n count = var.custom_domain_name == null ? 0 : 1\n\n domain_name = var.custom_domain_name\n\n domain_name_configuration {\n certificate_arn = var.acm_certificate_arn\n endpoint_type = \"REGIONAL\"\n security_policy = \"TLS_1_2\"\n }\n\n tags = var.tags\n\n lifecycle {\n precondition {\n condition = var.acm_certificate_arn != null\n error_message = \"acm_certificate_arn is required when custom_domain_name is set.\"\n }\n }\n}\n\nresource \"aws_apigatewayv2_api_mapping\" \"custom_domain\" {\n count = var.custom_domain_name == null ? 0 : 1\n\n api_id = module.http_api.api_id\n stage = module.http_api.stage_id\n domain_name = aws_apigatewayv2_domain_name.custom_domain[0].domain_name\n}`,\n apiUrlLocal: `locals {\n api_url = var.custom_domain_name == null ? module.http_api.stage_invoke_url : \"https://\\${var.custom_domain_name}/\"\n}`,\n outputs: `output \"api_url\" {\n description = \"URL clients should call: the custom domain if configured, otherwise the stage invoke URL\"\n value = local.api_url\n}\n\noutput \"custom_domain_target_domain_name\" {\n description = \"Target domain name to point a DNS alias or CNAME record at for the custom domain\"\n value = var.custom_domain_name == null ? null : aws_apigatewayv2_domain_name.custom_domain[0].domain_name_configuration[0].target_domain_name\n}\n\noutput \"custom_domain_hosted_zone_id\" {\n description = \"Hosted zone ID to use for a Route 53 alias record for the custom domain\"\n value = var.custom_domain_name == null ? null : aws_apigatewayv2_domain_name.custom_domain[0].domain_name_configuration[0].hosted_zone_id\n}`,\n};\n\nconst RUNTIME_CONFIG_MODULE = '`module \"add_url_to_runtime_config\" { $body }`';\n\n/** The `locals` block every vended API app module declares its IAM policy statements in. */\nconst POLICY_LOCALS =\n '`locals { $body }` where { $body <: contains `lambda_policy_statements = $_` }';\n\n/** Rewrite matching the block's text back unchanged, then the placeholder after it. */\nconst appendAfterBlock = (header: string) =>\n hcl(\n `\\`${header} { $body }\\` => \\`${header} {\\n $body\\n}\\n\\n${GRIT_INSERT_PLACEHOLDER}\\``,\n );\n\nconst migrateTerraformApi = async (\n tree: Tree,\n moduleDir: string,\n file: string,\n nextSteps: string[],\n) => {\n const api = (await matchGritQL(\n tree,\n file,\n hcl(REST_TERRAFORM.identifyingBlock),\n ))\n ? REST_TERRAFORM\n : (await matchGritQL(tree, file, hcl(HTTP_TERRAFORM.identifyingBlock)))\n ? HTTP_TERRAFORM\n : undefined;\n if (!api) {\n return; // Not a vended API app module.\n }\n\n // Everything this migration declares, so a re-run recognises its own output\n // and nothing it inserts collides with an existing declaration. Terraform\n // merges every `.tf` file in the module directory, so all are checked.\n const [domainType, mappingType] = api.domainResourceTypes;\n const declarations = [\n '`variable \"custom_domain_name\" { $_ }`',\n '`variable \"acm_certificate_arn\" { $_ }`',\n `\\`resource \"${domainType}\" \"custom_domain\" { $_ }\\``,\n `\\`resource \"${mappingType}\" \"custom_domain\" { $_ }\\``,\n '`locals { $body }` where { $body <: contains `api_url = $_` }',\n '`output \"api_url\" { $_ }`',\n '`output \"custom_domain_target_domain_name\" { $_ }`',\n '`output \"custom_domain_hosted_zone_id\" { $_ }`',\n ];\n let declared = 0;\n for (const declaration of declarations) {\n if (await matchesInModule(tree, moduleDir, hcl(declaration))) {\n declared++;\n }\n }\n const publishesApiUrl = await matchGritQL(\n tree,\n file,\n hcl(\n `${RUNTIME_CONFIG_MODULE} where { $body <: contains \\`value = { $_ = local.api_url }\\` }`,\n ),\n );\n if (declared === declarations.length && publishesApiUrl) {\n return; // Already migrated.\n }\n if (declared > 0 || publishesApiUrl) {\n nextSteps.push(\n `${file}: this module (${moduleDir}) already declares some of the custom domain configuration this migration adds (custom_domain_name / acm_certificate_arn variables, the custom_domain resources, local.api_url, or the api_url / custom_domain_* outputs) - left untouched. Make sure the add_url_to_runtime_config module publishes the custom domain URL when one is configured, instead of the stage invoke URL (see the ${api.kind} API app module the plugin now generates).`,\n );\n return;\n }\n\n const runtimeConfigValue = `${RUNTIME_CONFIG_MODULE} where { $body <: contains \\`value = { $_ = $v }\\`, ${api.runtimeConfigUrl} }`;\n const shape = [\n hcl('`variable \"tags\" { $_ }`'),\n hcl(runtimeConfigValue),\n hcl(POLICY_LOCALS),\n hcl('`output \"stage_invoke_url\" { $_ }`'),\n ];\n if (!(await matchesAll(tree, file, shape))) {\n nextSteps.push(\n `${file}: has diverged from the generated shape - left untouched. To support a custom domain for this ${api.kind} API, add custom_domain_name and acm_certificate_arn variables, the custom domain and mapping resources, and publish the custom domain URL in the add_url_to_runtime_config module when it is set (see the ${api.kind} API app module the plugin now generates).`,\n );\n return;\n }\n\n await insertViaGritQL(\n tree,\n file,\n appendAfterBlock('variable \"tags\"'),\n TERRAFORM_VARIABLES,\n );\n // Only the URL expression is rewritten, preserving `terraform fmt` alignment.\n await applyGritQL(\n tree,\n file,\n hcl(\n `${RUNTIME_CONFIG_MODULE} where { $body <: contains \\`value = { $_ = $v }\\`, ${api.runtimeConfigUrl}, $v => \\`local.api_url\\` }`,\n ),\n );\n // Alongside the module's other locals.\n await insertViaGritQL(\n tree,\n file,\n hcl(\n `${POLICY_LOCALS} => \\`locals {\\n $body\\n}\\n\\n${GRIT_INSERT_PLACEHOLDER}\\``,\n ),\n api.apiUrlLocal,\n );\n await insertViaGritQL(\n tree,\n file,\n appendAfterBlock('module \"add_url_to_runtime_config\"'),\n api.domainResources,\n );\n await insertViaGritQL(\n tree,\n file,\n appendAfterBlock('output \"stage_invoke_url\"'),\n api.outputs,\n );\n};\n\nexport default async function migration(\n tree: Tree,\n): Promise<MigrationReturnObject> {\n const nextSteps: string[] = [];\n\n await migrateRestApiConstruct(tree, nextSteps);\n await migrateHttpApiConstruct(tree, nextSteps);\n\n if (tree.exists(TERRAFORM_APIS_DIR)) {\n for (const dirName of tree.children(TERRAFORM_APIS_DIR)) {\n const moduleDir = joinPathFragments(TERRAFORM_APIS_DIR, dirName);\n const file = joinPathFragments(moduleDir, `${dirName}.tf`);\n if (tree.exists(file)) {\n await migrateTerraformApi(tree, moduleDir, file, nextSteps);\n }\n }\n }\n\n await formatFilesInSubtree(tree);\n\n return { nextSteps };\n}\n"],"names":["joinPathFragments","addDestructuredImport","applyGritQL","GRIT_INSERT_PLACEHOLDER","insertViaGritQL","matchGritQL","formatFilesInSubtree","PACKAGES_DIR","SHARED_CONSTRUCTS_DIR","SHARED_TERRAFORM_DIR","CONSTRUCTS_API_DIR","REST_API_CONSTRUCT","HTTP_API_CONSTRUCT","TERRAFORM_APIS_DIR","hcl","pattern","matchesInModule","tree","moduleDir","child","children","path","endsWith","isFile","matchesAll","file","patterns","REST_RUNTIME_CONFIG_URL","REST_DOMAIN_OUTPUTS","HTTP_DOMAIN_OUTPUTS","HTTP_DOMAIN_MAPPING_PROP","DOMAIN_ALIAS_OUTPUT","AFTER_RUNTIME_CONFIG","migrateRestApiConstruct","nextSteps","exists","shape","push","imported","HTTP_API_URL_FIELD","HTTP_API_URL_ASSIGNMENT","HTTP_URL_GETTER","migrateHttpApiConstruct","TERRAFORM_VARIABLES","REST_TERRAFORM","kind","identifyingBlock","runtimeConfigUrl","domainResourceTypes","domainResources","apiUrlLocal","outputs","HTTP_TERRAFORM","RUNTIME_CONFIG_MODULE","POLICY_LOCALS","appendAfterBlock","header","migrateTerraformApi","api","undefined","domainType","mappingType","declarations","declared","declaration","publishesApiUrl","length","runtimeConfigValue","migration","dirName"],"mappings":"AAAA;;;CAGC,GACD,SACEA,iBAAiB,QAGZ,aAAa;AACpB,SACEC,qBAAqB,EACrBC,WAAW,EACXC,uBAAuB,EACvBC,eAAe,EACfC,WAAW,QACN,wBAAwB;AAC/B,SAASC,oBAAoB,QAAQ,2BAA2B;AAChE,SACEC,YAAY,EACZC,qBAAqB,EACrBC,oBAAoB,QACf,gDAAgD;AAEvD;;;;;;;;;;;;;;;;;CAiBC,GAED,MAAMC,qBAAqB,GAAGH,aAAa,CAAC,EAAEC,sBAAsB,aAAa,CAAC;AAClF,MAAMG,qBAAqB,GAAGD,mBAAmB,YAAY,CAAC;AAC9D,MAAME,qBAAqB,GAAGF,mBAAmB,YAAY,CAAC;AAC9D,MAAMG,qBAAqB,GAAGN,aAAa,CAAC,EAAEE,qBAAqB,aAAa,CAAC;AAEjF,MAAMK,MAAM,CAACC,UAAoB,CAAC,cAAc,EAAEA,SAAS;AAE3D,kFAAkF,GAClF,MAAMC,kBAAkB,OACtBC,MACAC,WACAH;IAEA,KAAK,MAAMI,SAASF,KAAKG,QAAQ,CAACF,WAAY;QAC5C,MAAMG,OAAOrB,kBAAkBkB,WAAWC;QAC1C,IACEA,MAAMG,QAAQ,CAAC,UACfL,KAAKM,MAAM,CAACF,SACX,MAAMhB,YAAYY,MAAMI,MAAMN,UAC/B;YACA,OAAO;QACT;IACF;IACA,OAAO;AACT;AAEA,4CAA4C,GAC5C,MAAMS,aAAa,OAAOP,MAAYQ,MAAcC;IAClD,KAAK,MAAMX,WAAWW,SAAU;QAC9B,IAAI,CAAE,MAAMrB,YAAYY,MAAMQ,MAAMV,UAAW;YAC7C,OAAO;QACT;IACF;IACA,OAAO;AACT;AAEA,MAAMY,0BAA0B,CAAC;;uBAEV,CAAC;AAExB,MAAMC,sBAAsB,CAAC;;;;;;;;;;;;KAYxB,CAAC;AAEN,MAAMC,sBAAsB,CAAC;;;;;;;;;;;;KAYxB,CAAC;AAEN,MAAMC,2BAA2B,CAAC;;;;;GAK/B,CAAC;AAEJ,qDAAqD,GACrD,MAAMC,sBACJ;AAEF,6FAA6F,GAC7F,MAAMC,uBAAuB,CAAC;;gCAEE,EAAE7B,wBAAwB;CACzD,CAAC;AAEF,MAAM8B,0BAA0B,OAAOhB,MAAYiB;IACjD,MAAMT,OAAOd;IACb,IAAI,CAACM,KAAKkB,MAAM,CAACV,OAAO;QACtB;IACF;IAEA,IAAI,MAAMpB,YAAYY,MAAMQ,MAAM,sCAAsC;QACtE,QAAQ,oBAAoB;IAC9B;IAEA,MAAMW,QAAQ;QACZ;QACA;QACA;KACD;IACD,IACE,CAAE,MAAMZ,WAAWP,MAAMQ,MAAMW,UAC9B,MAAM/B,YAAYY,MAAMQ,MAAMM,sBAC/B;QACAG,UAAUG,IAAI,CACZ,GAAGZ,KAAK,8eAA8e,CAAC;QAEzf;IACF;IAEA,uEAAuE;IACvE,MAAMvB,YACJe,MACAQ,MACA;IAEF,MAAMvB,YACJe,MACAQ,MACA;IAEF,MAAMrB,gBACJa,MACAQ,MACA,oKACAE;IAEF,MAAMvB,gBAAgBa,MAAMQ,MAAMO,sBAAsBJ;IACxD,2CAA2C;IAC3C,MAAMU,WAAW,MAAMpC,YACrBe,MACAQ,MACA;IAEF,IAAI,CAACa,UAAU;QACb,MAAMrC,sBAAsBgB,MAAMQ,MAAM;YAAC;SAAY,EAAE;IACzD;AACF;AAEA,MAAMc,qBAAqB,CAAC;iCACK,CAAC;AAElC,MAAMC,0BAA0B,CAAC;;+BAEF,CAAC;AAEhC,8DAA8D,GAC9D,MAAMC,kBACJ;AAEF,MAAMC,0BAA0B,OAAOzB,MAAYiB;IACjD,MAAMT,OAAOb;IACb,IAAI,CAACK,KAAKkB,MAAM,CAACV,OAAO;QACtB;IACF;IAEA,IAAI,MAAMpB,YAAYY,MAAMQ,MAAM,6BAA6B;QAC7D,QAAQ,oBAAoB;IAC9B;IAEA,MAAMW,QAAQ;QACZ;QACA;QACA;QACA;QACA;QACA;QACA;QACAK;KACD;IACD,IACE,CAAE,MAAMjB,WAAWP,MAAMQ,MAAMW,UAC9B,MAAM/B,YAAYY,MAAMQ,MAAMM,wBAC9B,MAAM1B,YAAYY,MAAMQ,MAAM,kBAC/B;QACAS,UAAUG,IAAI,CACZ,GAAGZ,KAAK,ykBAAykB,CAAC;QAEplB;IACF;IAEA,2EAA2E;IAC3E,MAAMrB,gBACJa,MACAQ,MACA,+OACAK;IAEF,iEAAiE;IACjE,MAAM5B,YACJe,MACAQ,MACA;IAEF,4DAA4D;IAC5D,MAAMvB,YACJe,MACAQ,MACA;IAEF,MAAMvB,YACJe,MACAQ,MACA;IAEF,MAAMrB,gBACJa,MACAQ,MACA,sIACAc;IAEF,8DAA8D;IAC9D,MAAMrC,YACJe,MACAQ,MACA;IAEF,MAAMvB,YACJe,MACAQ,MACA;IAEF,4EAA4E;IAC5E,MAAMrB,gBACJa,MACAQ,MACA,CAAC;;oCAE+B,EAAEtB,wBAAwB;CAC7D,CAAC,EACEqC;IAEF,MAAMtC,YACJe,MACAQ,MACA;IAEF,MAAMvB,YACJe,MACAQ,MACA;IAEF,MAAMvB,YACJe,MACAQ,MACA;IAEF,MAAMrB,gBAAgBa,MAAMQ,MAAMO,sBAAsBH;AAC1D;AAEA,MAAMc,sBAAsB,CAAC;;;;;;;;;;;CAW5B,CAAC;AAiBF,MAAMC,iBAA+B;IACnCC,MAAM;IACNC,kBAAkB;IAClBC,kBACE;IACFC,qBAAqB;QACnB;QACA;KACD;IACDC,iBAAiB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BnB,CAAC;IACAC,aAAa,CAAC;;CAEf,CAAC;IACAC,SAAS,CAAC;;;;;;;;;;;;;CAaX,CAAC;AACF;AAEA,MAAMC,iBAA+B;IACnCP,MAAM;IACNC,kBAAkB;IAClBC,kBAAkB;IAClBC,qBAAqB;QACnB;QACA;KACD;IACDC,iBAAiB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BnB,CAAC;IACAC,aAAa,CAAC;;CAEf,CAAC;IACAC,SAAS,CAAC;;;;;;;;;;;;;CAaX,CAAC;AACF;AAEA,MAAME,wBAAwB;AAE9B,0FAA0F,GAC1F,MAAMC,gBACJ;AAEF,qFAAqF,GACrF,MAAMC,mBAAmB,CAACC,SACxB1C,IACE,CAAC,EAAE,EAAE0C,OAAO,kBAAkB,EAAEA,OAAO,kBAAkB,EAAErD,wBAAwB,EAAE,CAAC;AAG1F,MAAMsD,sBAAsB,OAC1BxC,MACAC,WACAO,MACAS;IAEA,MAAMwB,MAAM,AAAC,MAAMrD,YACjBY,MACAQ,MACAX,IAAI8B,eAAeE,gBAAgB,KAEjCF,iBACA,AAAC,MAAMvC,YAAYY,MAAMQ,MAAMX,IAAIsC,eAAeN,gBAAgB,KAChEM,iBACAO;IACN,IAAI,CAACD,KAAK;QACR,QAAQ,+BAA+B;IACzC;IAEA,4EAA4E;IAC5E,0EAA0E;IAC1E,uEAAuE;IACvE,MAAM,CAACE,YAAYC,YAAY,GAAGH,IAAIV,mBAAmB;IACzD,MAAMc,eAAe;QACnB;QACA;QACA,CAAC,YAAY,EAAEF,WAAW,0BAA0B,CAAC;QACrD,CAAC,YAAY,EAAEC,YAAY,0BAA0B,CAAC;QACtD;QACA;QACA;QACA;KACD;IACD,IAAIE,WAAW;IACf,KAAK,MAAMC,eAAeF,aAAc;QACtC,IAAI,MAAM9C,gBAAgBC,MAAMC,WAAWJ,IAAIkD,eAAe;YAC5DD;QACF;IACF;IACA,MAAME,kBAAkB,MAAM5D,YAC5BY,MACAQ,MACAX,IACE,GAAGuC,sBAAsB,+DAA+D,CAAC;IAG7F,IAAIU,aAAaD,aAAaI,MAAM,IAAID,iBAAiB;QACvD,QAAQ,oBAAoB;IAC9B;IACA,IAAIF,WAAW,KAAKE,iBAAiB;QACnC/B,UAAUG,IAAI,CACZ,GAAGZ,KAAK,eAAe,EAAEP,UAAU,4XAA4X,EAAEwC,IAAIb,IAAI,CAAC,0CAA0C,CAAC;QAEvd;IACF;IAEA,MAAMsB,qBAAqB,GAAGd,sBAAsB,oDAAoD,EAAEK,IAAIX,gBAAgB,CAAC,EAAE,CAAC;IAClI,MAAMX,QAAQ;QACZtB,IAAI;QACJA,IAAIqD;QACJrD,IAAIwC;QACJxC,IAAI;KACL;IACD,IAAI,CAAE,MAAMU,WAAWP,MAAMQ,MAAMW,QAAS;QAC1CF,UAAUG,IAAI,CACZ,GAAGZ,KAAK,8FAA8F,EAAEiC,IAAIb,IAAI,CAAC,2MAA2M,EAAEa,IAAIb,IAAI,CAAC,0CAA0C,CAAC;QAEpX;IACF;IAEA,MAAMzC,gBACJa,MACAQ,MACA8B,iBAAiB,oBACjBZ;IAEF,8EAA8E;IAC9E,MAAMzC,YACJe,MACAQ,MACAX,IACE,GAAGuC,sBAAsB,oDAAoD,EAAEK,IAAIX,gBAAgB,CAAC,2BAA2B,CAAC;IAGpI,uCAAuC;IACvC,MAAM3C,gBACJa,MACAQ,MACAX,IACE,GAAGwC,cAAc,8BAA8B,EAAEnD,wBAAwB,EAAE,CAAC,GAE9EuD,IAAIR,WAAW;IAEjB,MAAM9C,gBACJa,MACAQ,MACA8B,iBAAiB,uCACjBG,IAAIT,eAAe;IAErB,MAAM7C,gBACJa,MACAQ,MACA8B,iBAAiB,8BACjBG,IAAIP,OAAO;AAEf;AAEA,eAAe,eAAeiB,UAC5BnD,IAAU;IAEV,MAAMiB,YAAsB,EAAE;IAE9B,MAAMD,wBAAwBhB,MAAMiB;IACpC,MAAMQ,wBAAwBzB,MAAMiB;IAEpC,IAAIjB,KAAKkB,MAAM,CAACtB,qBAAqB;QACnC,KAAK,MAAMwD,WAAWpD,KAAKG,QAAQ,CAACP,oBAAqB;YACvD,MAAMK,YAAYlB,kBAAkBa,oBAAoBwD;YACxD,MAAM5C,OAAOzB,kBAAkBkB,WAAW,GAAGmD,QAAQ,GAAG,CAAC;YACzD,IAAIpD,KAAKkB,MAAM,CAACV,OAAO;gBACrB,MAAMgC,oBAAoBxC,MAAMC,WAAWO,MAAMS;YACnD;QACF;IACF;IAEA,MAAM5B,qBAAqBW;IAE3B,OAAO;QAAEiB;IAAU;AACrB"}
@@ -253,7 +253,7 @@ export default {
253
253
 
254
254
  exports[`preset generator > should run successfully > biome.json 1`] = `
255
255
  "{
256
- "$schema": "https://biomejs.dev/schemas/2.5.14/schema.json",
256
+ "$schema": "https://biomejs.dev/schemas/2.5.15/schema.json",
257
257
  "root": true,
258
258
  "formatter": {
259
259
  "enabled": true,
@@ -422,7 +422,7 @@ catalog:
422
422
  '@nx/js': 23.2.1
423
423
  '@nx/workspace': 23.2.1
424
424
  typescript: ~6.0.3
425
- '@biomejs/biome': 2.5.14
425
+ '@biomejs/biome': 2.5.15
426
426
  '@aws/nx-plugin': ^0.0.0
427
427
  '@aws/nx-plugin-mcp': ^0.0.0
428
428
  "
@@ -764,18 +764,18 @@ version = "0.1.0"
764
764
  dependencies = [
765
765
  "proj-agent-connection",
766
766
  "aws-lambda-powertools==3.35.0",
767
- "aws-opentelemetry-distro==0.20.0",
768
- "bedrock-agentcore==1.23.1",
769
- "boto3==1.43.103",
770
- "fastapi==0.141.1",
767
+ "aws-opentelemetry-distro==0.21.0",
768
+ "bedrock-agentcore==1.24.0",
769
+ "boto3==1.43.108",
770
+ "fastapi==0.142.2",
771
771
  "mcp==1.28.1",
772
- "strands-agents==1.57.1",
772
+ "strands-agents==1.57.2",
773
773
  "strands-agents-tools==0.8.9",
774
774
  "uvicorn==0.54.0"
775
775
  ]
776
776
 
777
777
  [dependency-groups]
778
- dev = [ "fastapi[standard]==0.141.1" ]
778
+ dev = [ "fastapi[standard]==0.142.2" ]
779
779
 
780
780
  [tool.uv]
781
781
  dev-dependencies = [ ]
@@ -702,23 +702,23 @@ version = "0.1.0"
702
702
  dependencies = [
703
703
  "proj-agent-connection",
704
704
  "aws-lambda-powertools==3.35.0",
705
- "aws-opentelemetry-distro==0.20.0",
706
- "bedrock-agentcore==1.23.1",
707
- "boto3==1.43.103",
708
- "fastapi==0.141.1",
705
+ "aws-opentelemetry-distro==0.21.0",
706
+ "bedrock-agentcore==1.24.0",
707
+ "boto3==1.43.108",
708
+ "fastapi==0.142.2",
709
709
  "mcp==1.28.1",
710
- "langchain==1.4.2",
711
- "langchain-aws==1.7.9",
710
+ "langchain==1.4.3",
711
+ "langchain-aws==1.8.0",
712
712
  "langgraph==1.2.12",
713
713
  "langgraph-checkpoint-sqlite==3.1.1",
714
714
  "aiosqlite==0.22.1",
715
715
  "ag-ui-protocol==0.1.22",
716
- "ag-ui-langgraph==0.0.45",
716
+ "ag-ui-langgraph==0.0.46",
717
717
  "uvicorn==0.54.0"
718
718
  ]
719
719
 
720
720
  [dependency-groups]
721
- dev = [ "fastapi[standard]==0.141.1" ]
721
+ dev = [ "fastapi[standard]==0.142.2" ]
722
722
 
723
723
  [tool.uv]
724
724
  dev-dependencies = [ ]
@@ -5,7 +5,7 @@ exports[`py#agent generator > should create DynamoDB checkpoint table and S3 off
5
5
  required_providers {
6
6
  aws = {
7
7
  source = "hashicorp/aws"
8
- version = "6.66.0"
8
+ version = "6.67.0"
9
9
  }
10
10
  random = {
11
11
  source = "hashicorp/random"
@@ -381,7 +381,7 @@ exports[`py#agent generator > should match snapshot for Terraform generated file
381
381
  required_providers {
382
382
  aws = {
383
383
  source = "hashicorp/aws"
384
- version = "6.66.0"
384
+ version = "6.67.0"
385
385
  }
386
386
  random = {
387
387
  source = "hashicorp/random"
@@ -704,7 +704,7 @@ exports[`py#agent generator > should match snapshot for Terraform generated file
704
704
  required_providers {
705
705
  aws = {
706
706
  source = "hashicorp/aws"
707
- version = "6.66.0"
707
+ version = "6.67.0"
708
708
  }
709
709
  null = {
710
710
  source = "hashicorp/null"
@@ -1063,7 +1063,7 @@ resource "null_resource" "runtime_ready" {
1063
1063
 
1064
1064
  provisioner "local-exec" {
1065
1065
  command = <<-EOT
1066
- uv run --with boto3==1.43.103 python -c "
1066
+ uv run --with boto3==1.43.108 python -c "
1067
1067
  import boto3
1068
1068
  import json
1069
1069
  import os
@@ -35,7 +35,7 @@ exports[`py#dynamodb generator > should generate terraform modules when iac is t
35
35
  required_providers {
36
36
  aws = {
37
37
  source = "hashicorp/aws"
38
- version = "6.66.0"
38
+ version = "6.67.0"
39
39
  }
40
40
  }
41
41
  }
@@ -232,7 +232,7 @@ exports[`py#dynamodb generator > should generate terraform modules when iac is t
232
232
  required_providers {
233
233
  aws = {
234
234
  source = "hashicorp/aws"
235
- version = "6.66.0"
235
+ version = "6.67.0"
236
236
  }
237
237
  random = {
238
238
  source = "hashicorp/random"
@@ -11,7 +11,7 @@ terraform {
11
11
  required_providers {
12
12
  aws = {
13
13
  source = "hashicorp/aws"
14
- version = "6.66.0"
14
+ version = "6.67.0"
15
15
  }
16
16
  }
17
17
  }
@@ -262,7 +262,7 @@ output "api_log_group_arn" {
262
262
  }
263
263
  aws = {
264
264
  source = "hashicorp/aws"
265
- version = "6.66.0"
265
+ version = "6.67.0"
266
266
  }
267
267
  random = {
268
268
  source = "hashicorp/random"
@@ -908,7 +908,7 @@ terraform {
908
908
  required_providers {
909
909
  aws = {
910
910
  source = "hashicorp/aws"
911
- version = "6.66.0"
911
+ version = "6.67.0"
912
912
  }
913
913
  }
914
914
  }
@@ -1159,7 +1159,7 @@ output "api_log_group_arn" {
1159
1159
  }
1160
1160
  aws = {
1161
1161
  source = "hashicorp/aws"
1162
- version = "6.66.0"
1162
+ version = "6.67.0"
1163
1163
  }
1164
1164
  random = {
1165
1165
  source = "hashicorp/random"
@@ -1878,7 +1878,7 @@ terraform {
1878
1878
  required_providers {
1879
1879
  aws = {
1880
1880
  source = "hashicorp/aws"
1881
- version = "6.66.0"
1881
+ version = "6.67.0"
1882
1882
  }
1883
1883
  }
1884
1884
  }
@@ -2129,7 +2129,7 @@ output "api_log_group_arn" {
2129
2129
  }
2130
2130
  aws = {
2131
2131
  source = "hashicorp/aws"
2132
- version = "6.66.0"
2132
+ version = "6.67.0"
2133
2133
  }
2134
2134
  random = {
2135
2135
  source = "hashicorp/random"
@@ -2752,7 +2752,7 @@ terraform {
2752
2752
  required_providers {
2753
2753
  aws = {
2754
2754
  source = "hashicorp/aws"
2755
- version = "6.66.0"
2755
+ version = "6.67.0"
2756
2756
  }
2757
2757
  random = {
2758
2758
  source = "hashicorp/random"
@@ -3065,7 +3065,7 @@ output "waf_web_acl_arn" {
3065
3065
  }
3066
3066
  aws = {
3067
3067
  source = "hashicorp/aws"
3068
- version = "6.66.0"
3068
+ version = "6.67.0"
3069
3069
  }
3070
3070
  random = {
3071
3071
  source = "hashicorp/random"
@@ -4162,7 +4162,7 @@ terraform {
4162
4162
  required_providers {
4163
4163
  aws = {
4164
4164
  source = "hashicorp/aws"
4165
- version = "6.66.0"
4165
+ version = "6.67.0"
4166
4166
  }
4167
4167
  random = {
4168
4168
  source = "hashicorp/random"
@@ -4475,7 +4475,7 @@ output "waf_web_acl_arn" {
4475
4475
  }
4476
4476
  aws = {
4477
4477
  source = "hashicorp/aws"
4478
- version = "6.66.0"
4478
+ version = "6.67.0"
4479
4479
  }
4480
4480
  random = {
4481
4481
  source = "hashicorp/random"
@@ -5561,7 +5561,7 @@ terraform {
5561
5561
  required_providers {
5562
5562
  aws = {
5563
5563
  source = "hashicorp/aws"
5564
- version = "6.66.0"
5564
+ version = "6.67.0"
5565
5565
  }
5566
5566
  random = {
5567
5567
  source = "hashicorp/random"
@@ -5874,7 +5874,7 @@ output "waf_web_acl_arn" {
5874
5874
  }
5875
5875
  aws = {
5876
5876
  source = "hashicorp/aws"
5877
- version = "6.66.0"
5877
+ version = "6.67.0"
5878
5878
  }
5879
5879
  random = {
5880
5880
  source = "hashicorp/random"