@aws/nx-plugin 0.79.0 → 0.80.0

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 (30) hide show
  1. package/LICENSE-THIRD-PARTY +69 -11
  2. package/package.json +27 -27
  3. package/src/infra/app/__snapshots__/generator.spec.ts.snap +32 -8
  4. package/src/preset/__snapshots__/generator.spec.ts.snap +2 -2
  5. package/src/py/fast-api/__snapshots__/generator.spec.ts.snap +298 -57
  6. package/src/py/fast-api/files/app/__name__/init.py.template +61 -16
  7. package/src/py/fast-api/files/app/__name__/main.py.template +6 -3
  8. package/src/py/fast-api/files/app/run.sh.template +2 -0
  9. package/src/py/fast-api/generator.js +10 -2
  10. package/src/py/fast-api/generator.js.map +1 -1
  11. package/src/py/project/generator.js +9 -17
  12. package/src/py/project/generator.js.map +1 -1
  13. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +23 -1
  14. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +15 -0
  15. package/src/ts/lib/__snapshots__/generator.spec.ts.snap +42 -14
  16. package/src/ts/lib/eslint.js +15 -13
  17. package/src/ts/lib/eslint.js.map +1 -1
  18. package/src/ts/lib/generator.js +0 -17
  19. package/src/ts/lib/generator.js.map +1 -1
  20. package/src/ts/lib/vitest.js +6 -2
  21. package/src/ts/lib/vitest.js.map +1 -1
  22. package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +1 -1
  23. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +82 -58
  24. package/src/utils/api-constructs/files/cdk/app/apis/http/__apiNameKebabCase__.ts.template +28 -2
  25. package/src/utils/api-constructs/files/cdk/app/apis/rest/__apiNameKebabCase__.ts.template +30 -4
  26. package/src/utils/api-constructs/files/terraform/app/apis/http/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +44 -2
  27. package/src/utils/api-constructs/files/terraform/app/apis/rest/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +62 -2
  28. package/src/utils/versions.d.ts +4 -5
  29. package/src/utils/versions.js +3 -4
  30. package/src/utils/versions.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/ts/lib/generator.ts"],"names":[],"mappings":";;;;AAAA;;;GAGG;AACH,uCAYoB;AAEpB,+BAA0C;AAC1C,qDAA0D;AAC1D,yDAAwD;AACxD,6CAAgD;AAChD,+CAA0D;AAC1D,+CAAoD;AACpD,uCAIwB;AACxB,iDAAsE;AACtE,yCAA0C;AAC1C,2CAA6D;AAEhD,QAAA,qBAAqB,GAChC,IAAA,qBAAgB,EAAC,UAAU,CAAC,CAAC;AAa/B;;GAEG;AACI,MAAM,eAAe,GAAG,CAC7B,IAAU,EACV,MAAgC,EAClB,EAAE;IAChB,MAAM,KAAK,GAAG,IAAA,6BAAiB,EAAC,IAAI,CAAC,CAAC;IACtC,MAAM,cAAc,GAAG,IAAA,mBAAW,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,kBAAkB,GAAG,GAAG,KAAK,GAAG,cAAc,EAAE,CAAC;IACvD,yDAAyD;IACzD,MAAM,GAAG,GAAG,IAAA,0BAAiB,EAC3B,MAAM,CAAC,SAAS,IAAI,GAAG,EACvB,MAAM,CAAC,YAAY,IAAI,cAAc,CACtC,CAAC;IACF,OAAO,EAAE,GAAG,EAAE,kBAAkB,EAAE,CAAC;AACrC,CAAC,CAAC;AAbW,QAAA,eAAe,mBAa1B;AAEF;;GAEG;AACI,MAAM,kBAAkB,GAAG,CAChC,IAAU,EACV,MAAgC,EACJ,EAAE;IAC9B,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG,IAAA,uBAAe,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAClE,MAAM,IAAA,qBAAgB,EAAC,IAAI,kCACtB,MAAM,KACT,IAAI,EAAE,kBAAkB,EACxB,SAAS,EAAE,GAAG,EACd,eAAe,EAAE,IAAI,EACrB,OAAO,EAAE,KAAK,EACd,MAAM,EAAE,QAAQ,EAChB,cAAc,EAAE,QAAQ,IACxB,CAAC;IAEH,iEAAiE;IACjE,+EAA+E;IAC/E,+EAA+E;IAC/E,iFAAiF;IACjF,0CAA0C;IAC1C,MAAM,gBAAgB,GAAG,IAAA,0BAAiB,EAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAClE,MAAM,iBAAiB,GAAG,IAAA,0BAAiB,EAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IACpE,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,sFAAsF;IACtF,MAAM,gBAAgB,GAAG,IAAA,0BAAiB,EAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACrE,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAChC,CAAC;IAED,0CAA0C;IAC1C,IAAI,CAAC,MAAM,CAAC,IAAA,0BAAiB,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3C,IAAA,sBAAa,EACX,IAAI,EACJ,IAAA,0BAAiB,EAAC,SAAS,EAAE,OAAO,CAAC,EACrC,IAAA,0BAAiB,EAAC,GAAG,CAAC,EACtB;QACE,kBAAkB;QAClB,SAAS,EAAE,IAAA,iCAAwB,GAAE,CAAC,IAAI;KAC3C,EACD;QACE,iBAAiB,EAAE,0BAAiB,CAAC,YAAY;KAClD,CACF,CAAC;IACF,IAAA,qCAAkB,EAAC,IAAI,EAAE;QACvB,GAAG;QACH,kBAAkB;KACnB,CAAC,CAAC;IAEH,MAAM,oBAAoB,GAAG,IAAA,iCAAwB,EACnD,IAAI,EACJ,kBAAkB,CACnB,CAAC;IACF,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC;IAE7C,OAAO,CAAC,SAAS,CAAC,GAAG;QACnB,QAAQ,EAAE,iBAAiB;QAC3B,OAAO,EAAE,CAAC,wCAAwC,CAAC;QACnD,OAAO,EAAE;YACP,OAAO,EAAE,+BAA+B;YACxC,GAAG,EAAE,eAAe;SACrB;KACF,CAAC;IACF,OAAO,CAAC,OAAO,CAAC,GAAG;QACjB,SAAS,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;KACvC,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,GAAG;QAChB,QAAQ,EAAE,iBAAiB;QAC3B,OAAO,EAAE,CAAC,4BAA4B,CAAC;QACvC,OAAO,EAAE;YACP,gBAAgB,EAAE,wCAAwC;SAC3D;KACF,CAAC;IACF,oBAAoB,CAAC,OAAO,GAAG,IAAA,uBAAc,EAAC,OAAO,CAAC,CAAC;IAEvD,IAAA,mCAA0B,EAAC,IAAI,EAAE,kBAAkB,EAAE,oBAAoB,CAAC,CAAC;IAE3E,IAAA,yBAAoB,EAAC,IAAI,EAAE,kBAAkB,EAAE,6BAAqB,CAAC,CAAC;IAEtE,IAAA,mBAAU,EAAC,IAAI,EAAE,SAAS,EAAE,CAAC,MAA2B,EAAE,EAAE;;QAC1D,MAAM,CAAC,WAAW,mCACb,MAAM,CAAC,WAAW,KACrB,OAAO,EAAE;gBACP,GAAG,CAAC,MAAA,MAAA,MAAM,CAAC,WAAW,0CAAE,OAAO,mCAAI,EAAE,CAAC,CAAC,MAAM,CAC3C,CAAC,KAAK,EAAE,EAAE,CACR,OAAO,KAAK,KAAK,QAAQ;oBACzB,CAAC,CAAC,2BAA2B,IAAI,KAAK,CAAC;oBACvC,CAAC,CAAC,KAAK,CAAC,yBAAyB,KAAK,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CACpE;gBACD;oBACE,yBAAyB,EAAE,MAAM;oBACjC,UAAU,EAAE,IAAI;iBACjB;aACF,GACF,CAAC;QAEF,MAAM,CAAC,cAAc,mCAChB,MAAM,CAAC,cAAc,KACxB,OAAO,gCACL,KAAK,EAAE,IAAI,IACR,MAAA,MAAM,CAAC,cAAc,0CAAE,OAAO,KACjC,MAAM,EAAE;oBACN,GAAG,CAAC,MAAA,MAAA,MAAA,MAAM,CAAC,cAAc,0CAAE,OAAO,0CAAE,MAAM,mCAAI,EAAE,CAAC,CAAC,MAAM,CACtD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CACvB;oBACD,SAAS;iBACV,KAEH,KAAK,gCACH,KAAK,EAAE,IAAI,IACR,MAAA,MAAM,CAAC,cAAc,0CAAE,KAAK,KAC/B,MAAM,EAAE;oBACN,GAAG,CAAC,MAAA,MAAA,MAAA,MAAM,CAAC,cAAc,0CAAE,KAAK,0CAAE,MAAM,mCAAI,EAAE,CAAC,CAAC,MAAM,CACpD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CACvB;oBACD,SAAS;iBACV,KAEH,IAAI,kCACC,MAAA,MAAM,CAAC,cAAc,0CAAE,IAAI,KAC9B,MAAM,EAAE;oBACN,GAAG,CAAC,MAAA,MAAA,MAAA,MAAM,CAAC,cAAc,0CAAE,IAAI,0CAAE,MAAM,mCAAI,EAAE,CAAC,CAAC,MAAM,CACnD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CACvB;oBACD,SAAS;iBACV,MAEJ,CAAC;QAEF,8EAA8E;QAC9E,MAAM,CAAC,OAAO,GAAG;YACf;gBACE,MAAM,EAAE,mBAAmB;gBAC3B,OAAO,EAAE;oBACP,SAAS,EAAE;wBACT,UAAU,EAAE,WAAW;qBACxB;oBACD,KAAK,EAAE;wBACL,UAAU,EAAE,SAAS;wBACrB,UAAU,EAAE,mBAAmB;wBAC/B,aAAa,EAAE,YAAY;wBAC3B,aAAa,EAAE,YAAY;qBAC5B;iBACF;aACF;YACD,GAAG,CAAC,MAAA,MAAM,CAAC,OAAO,mCAAI,EAAE,CAAC,CAAC,MAAM,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,mBAAmB,CACjE;SACF,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,0DAA0D;IAC1D,IAAA,aAAO,EACL,IAAI,EACJ,IAAA,0BAAiB,EAAC,GAAG,EAAE,mBAAmB,CAAC,EAC3C,wMAAwM,EACxM,CAAC,IAA4B,EAAE,EAAE;QAC/B,OAAO,oBAAO,CAAC,4BAA4B,CAAC;YAC1C,oBAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC;YACnC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;SAC1B,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEF,MAAM,IAAA,yCAA+B,EAAC,IAAI,EAAE,CAAC,6BAAqB,CAAC,CAAC,CAAC;IAErE,MAAM,IAAA,6BAAoB,EAAC,IAAI,CAAC,CAAC;IAEjC,OAAO,GAAG,EAAE;QACV,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACxB,IAAA,4BAAmB,EAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAA,CAAC;AAnLW,QAAA,kBAAkB,sBAmL7B;AACF,kBAAe,0BAAkB,CAAC"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/ts/lib/generator.ts"],"names":[],"mappings":"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"}
@@ -12,8 +12,12 @@ const typescript_1 = tslib_1.__importStar(require("typescript"));
12
12
  const ast_1 = require("../../utils/ast");
13
13
  const configureVitest = (tree, options) => {
14
14
  var _a;
15
- const configPath = (0, path_1.join)(options.dir, 'vite.config.mts');
16
- if (tree.exists(configPath)) {
15
+ // Find vitest.config.mts or vite.config.mts
16
+ const configPath = [
17
+ (0, path_1.join)(options.dir, 'vitest.config.mts'),
18
+ (0, path_1.join)(options.dir, 'vite.config.mts'),
19
+ ].find((config) => tree.exists(config));
20
+ if (configPath) {
17
21
  (0, ast_1.replaceIfExists)(tree, configPath, 'CallExpression:has(Identifier[name="defineConfig"]) PropertyAssignment:has(Identifier[name="test"]) ObjectLiteralExpression', (node) => {
18
22
  // Check if passWithNoTests already exists
19
23
  const hasPassWithNoTests = node.properties.some((p) => typescript_1.default.isPropertyAssignment(p) &&
@@ -1 +1 @@
1
- {"version":3,"file":"vitest.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/ts/lib/vitest.ts"],"names":[],"mappings":";;;;AAAA;;;GAGG;AACH,uCAA4D;AAC5D,+BAA4B;AAC5B,iEAAkE;AAElE,yCAAkD;AAE3C,MAAM,eAAe,GAAG,CAC7B,IAAU,EACV,OAAgC,EAChC,EAAE;;IACF,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IAExD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,IAAA,qBAAe,EACb,IAAI,EACJ,UAAU,EACV,6HAA6H,EAC7H,CAAC,IAA6B,EAAE,EAAE;YAChC,0CAA0C;YAC1C,MAAM,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAC7C,CAAC,CAAC,EAAE,EAAE,CACJ,oBAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAC1B,oBAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;gBACvB,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,iBAAiB,CACpC,CAAC;YACF,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,OAAO,oBAAO,CAAC,6BAA6B,CAAC;oBAC3C,GAAG,IAAI,CAAC,UAAU;oBAClB,oBAAO,CAAC,wBAAwB,CAC9B,iBAAiB,EACjB,oBAAO,CAAC,UAAU,EAAE,CACrB;iBACF,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CACF,CAAC;QAEF,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,IAAI,CAAC,CAAC;QAChC,IAAA,qBAAY,EAAC,IAAI,kCACZ,MAAM,KACT,cAAc,kCACT,CAAC,MAAA,MAAM,CAAC,cAAc,mCAAI,EAAE,CAAC,KAChC,iBAAiB,kBACf,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,EAClC,cAAc,EAAE;wBACd,iBAAiB,EAAE;4BACjB,IAAI,EAAE,UAAU;yBACjB;qBACF,IACE,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,QAG/C,CAAC;IACL,CAAC;AACH,CAAC,CAAC;AAlDW,QAAA,eAAe,mBAkD1B"}
1
+ {"version":3,"file":"vitest.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/ts/lib/vitest.ts"],"names":[],"mappings":";;;;AAAA;;;GAGG;AACH,uCAA4D;AAC5D,+BAA4B;AAC5B,iEAAkE;AAElE,yCAAkD;AAE3C,MAAM,eAAe,GAAG,CAC7B,IAAU,EACV,OAAgC,EAChC,EAAE;;IACF,4CAA4C;IAC5C,MAAM,UAAU,GAAG;QACjB,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,CAAC;QACtC,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC;KACrC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAExC,IAAI,UAAU,EAAE,CAAC;QACf,IAAA,qBAAe,EACb,IAAI,EACJ,UAAU,EACV,6HAA6H,EAC7H,CAAC,IAA6B,EAAE,EAAE;YAChC,0CAA0C;YAC1C,MAAM,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAC7C,CAAC,CAAC,EAAE,EAAE,CACJ,oBAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAC1B,oBAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;gBACvB,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,iBAAiB,CACpC,CAAC;YACF,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,OAAO,oBAAO,CAAC,6BAA6B,CAAC;oBAC3C,GAAG,IAAI,CAAC,UAAU;oBAClB,oBAAO,CAAC,wBAAwB,CAC9B,iBAAiB,EACjB,oBAAO,CAAC,UAAU,EAAE,CACrB;iBACF,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CACF,CAAC;QAEF,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,IAAI,CAAC,CAAC;QAChC,IAAA,qBAAY,EAAC,IAAI,kCACZ,MAAM,KACT,cAAc,kCACT,CAAC,MAAA,MAAM,CAAC,cAAc,mCAAI,EAAE,CAAC,KAChC,iBAAiB,kBACf,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,EAClC,cAAc,EAAE;wBACd,iBAAiB,EAAE;4BACjB,IAAI,EAAE,UAAU;yBACjB;qBACF,IACE,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,QAG/C,CAAC;IACL,CAAC;AACH,CAAC,CAAC;AAtDW,QAAA,eAAe,mBAsD1B"}
@@ -248,7 +248,7 @@ export const registerCreateWorkspaceCommandTool = (server: McpServer) => {
248
248
  text: \`Run the following command to create a workspace:
249
249
 
250
250
  \\\`\\\`\\\`bash
251
- npx create-nx-workspace@22.5.1 \${workspaceName} --pm=\${packageManager} --preset=@aws/nx-plugin --ci=skip --aiAgents
251
+ npx create-nx-workspace@22.5.3 \${workspaceName} --pm=\${packageManager} --preset=@aws/nx-plugin --ci=skip --aiAgents
252
252
  \\\`\\\`\\\`
253
253
 
254
254
  This will create a new workspace within the \${workspaceName} directory.
@@ -961,17 +961,10 @@ exports[`react-website generator > Tanstack router integration > should generate
961
961
  "cache": true,
962
962
  "inputs": [
963
963
  "default",
964
- "{workspaceRoot}/eslint.config.mjs",
965
- "{projectRoot}/eslint.config.mjs"
966
- ],
967
- "configurations": {
968
- "fix": {
969
- "fix": true
970
- },
971
- "skip-lint": {
972
- "force": true
973
- }
974
- }
964
+ "{workspaceRoot}/.eslintrc.json",
965
+ "{workspaceRoot}/.eslintignore",
966
+ "{workspaceRoot}/eslint.config.mjs"
967
+ ]
975
968
  },
976
969
  "@nx/vite:build": {
977
970
  "cache": true,
@@ -1014,6 +1007,11 @@ exports[`react-website generator > Tanstack router integration > should generate
1014
1007
  }
1015
1008
  },
1016
1009
  "namedInputs": {
1010
+ "eslint": [
1011
+ "default",
1012
+ "{workspaceRoot}/eslint.config.mjs",
1013
+ "{projectRoot}/eslint.config.mjs"
1014
+ ],
1017
1015
  "default": [
1018
1016
  {
1019
1017
  "dependentTasksOutputFiles": "**/*",
@@ -1056,13 +1054,13 @@ exports[`react-website generator > Tanstack router integration > should generate
1056
1054
  },
1057
1055
  "devDependencies": {
1058
1056
  "@eslint/js": "^9.8.0",
1059
- "@nx/eslint": "22.5.1",
1060
- "@nx/eslint-plugin": "22.5.1",
1061
- "@nx/js": "22.5.1",
1062
- "@nx/react": "22.5.1",
1063
- "@nx/vite": "22.5.1",
1064
- "@nx/vitest": "22.5.1",
1065
- "@nx/web": "22.5.1",
1057
+ "@nx/eslint": "22.5.3",
1058
+ "@nx/eslint-plugin": "22.5.3",
1059
+ "@nx/js": "22.5.3",
1060
+ "@nx/react": "22.5.3",
1061
+ "@nx/vite": "22.5.3",
1062
+ "@nx/vitest": "22.5.3",
1063
+ "@nx/web": "22.5.3",
1066
1064
  "@swc-node/register": "~1.11.1",
1067
1065
  "@swc/cli": "~0.8.0",
1068
1066
  "@swc/core": "~1.15.5",
@@ -1183,7 +1181,17 @@ exports[`react-website generator > Tanstack router integration > should generate
1183
1181
  }
1184
1182
  },
1185
1183
  "lint": {
1186
- "executor": "@nx/eslint:lint"
1184
+ "executor": "@nx/eslint:lint",
1185
+ "cache": true,
1186
+ "inputs": ["eslint"],
1187
+ "configurations": {
1188
+ "fix": {
1189
+ "fix": true
1190
+ },
1191
+ "skip-lint": {
1192
+ "force": true
1193
+ }
1194
+ }
1187
1195
  },
1188
1196
  "test": {
1189
1197
  "executor": "@nx/vitest:test",
@@ -1683,18 +1691,12 @@ exports[`react-website generator > Tanstack router integration > should generate
1683
1691
  "
1684
1692
  `;
1685
1693
 
1686
- exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > packages/common/constructs/vite.config.mts 1`] = `
1687
- "/// <reference types='vitest' />
1688
- import { defineConfig } from 'vite';
1694
+ exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > packages/common/constructs/vitest.config.mts 1`] = `
1695
+ "import { defineConfig } from 'vitest/config';
1689
1696
 
1690
1697
  export default defineConfig(() => ({
1691
- root: import.meta.dirname,
1698
+ root: __dirname,
1692
1699
  cacheDir: '../../../node_modules/.vite/packages/common/constructs',
1693
- plugins: [],
1694
- // Uncomment this if you are using workers.
1695
- // worker: {
1696
- // plugins: [],
1697
- // },
1698
1700
  test: {
1699
1701
  name: '@proj/common-constructs',
1700
1702
  watch: false,
@@ -1851,7 +1853,17 @@ exports[`react-website generator > Tanstack router integration > should generate
1851
1853
  }
1852
1854
  },
1853
1855
  "lint": {
1854
- "executor": "@nx/eslint:lint"
1856
+ "executor": "@nx/eslint:lint",
1857
+ "cache": true,
1858
+ "inputs": ["eslint"],
1859
+ "configurations": {
1860
+ "fix": {
1861
+ "fix": true
1862
+ },
1863
+ "skip-lint": {
1864
+ "force": true
1865
+ }
1866
+ }
1855
1867
  },
1856
1868
  "load:runtime-config": {
1857
1869
  "executor": "nx:run-commands",
@@ -2376,17 +2388,10 @@ exports[`react-website generator > Tanstack router integration > should generate
2376
2388
  "cache": true,
2377
2389
  "inputs": [
2378
2390
  "default",
2379
- "{workspaceRoot}/eslint.config.mjs",
2380
- "{projectRoot}/eslint.config.mjs"
2381
- ],
2382
- "configurations": {
2383
- "fix": {
2384
- "fix": true
2385
- },
2386
- "skip-lint": {
2387
- "force": true
2388
- }
2389
- }
2391
+ "{workspaceRoot}/.eslintrc.json",
2392
+ "{workspaceRoot}/.eslintignore",
2393
+ "{workspaceRoot}/eslint.config.mjs"
2394
+ ]
2390
2395
  },
2391
2396
  "@nx/vite:build": {
2392
2397
  "cache": true,
@@ -2429,6 +2434,11 @@ exports[`react-website generator > Tanstack router integration > should generate
2429
2434
  }
2430
2435
  },
2431
2436
  "namedInputs": {
2437
+ "eslint": [
2438
+ "default",
2439
+ "{workspaceRoot}/eslint.config.mjs",
2440
+ "{projectRoot}/eslint.config.mjs"
2441
+ ],
2432
2442
  "default": [
2433
2443
  {
2434
2444
  "dependentTasksOutputFiles": "**/*",
@@ -2472,13 +2482,13 @@ exports[`react-website generator > Tanstack router integration > should generate
2472
2482
  },
2473
2483
  "devDependencies": {
2474
2484
  "@eslint/js": "^9.8.0",
2475
- "@nx/eslint": "22.5.1",
2476
- "@nx/eslint-plugin": "22.5.1",
2477
- "@nx/js": "22.5.1",
2478
- "@nx/react": "22.5.1",
2479
- "@nx/vite": "22.5.1",
2480
- "@nx/vitest": "22.5.1",
2481
- "@nx/web": "22.5.1",
2485
+ "@nx/eslint": "22.5.3",
2486
+ "@nx/eslint-plugin": "22.5.3",
2487
+ "@nx/js": "22.5.3",
2488
+ "@nx/react": "22.5.3",
2489
+ "@nx/vite": "22.5.3",
2490
+ "@nx/vitest": "22.5.3",
2491
+ "@nx/web": "22.5.3",
2482
2492
  "@swc-node/register": "~1.11.1",
2483
2493
  "@swc/cli": "~0.8.0",
2484
2494
  "@swc/core": "~1.15.5",
@@ -2603,7 +2613,17 @@ exports[`react-website generator > Tanstack router integration > should generate
2603
2613
  }
2604
2614
  },
2605
2615
  "lint": {
2606
- "executor": "@nx/eslint:lint"
2616
+ "executor": "@nx/eslint:lint",
2617
+ "cache": true,
2618
+ "inputs": ["eslint"],
2619
+ "configurations": {
2620
+ "fix": {
2621
+ "fix": true
2622
+ },
2623
+ "skip-lint": {
2624
+ "force": true
2625
+ }
2626
+ }
2607
2627
  },
2608
2628
  "test": {
2609
2629
  "executor": "@nx/vitest:test",
@@ -3103,18 +3123,12 @@ exports[`react-website generator > Tanstack router integration > should generate
3103
3123
  "
3104
3124
  `;
3105
3125
 
3106
- exports[`react-website generator > Tanstack router integration > should generate website with router correctly > packages/common/constructs/vite.config.mts 1`] = `
3107
- "/// <reference types='vitest' />
3108
- import { defineConfig } from 'vite';
3126
+ exports[`react-website generator > Tanstack router integration > should generate website with router correctly > packages/common/constructs/vitest.config.mts 1`] = `
3127
+ "import { defineConfig } from 'vitest/config';
3109
3128
 
3110
3129
  export default defineConfig(() => ({
3111
- root: import.meta.dirname,
3130
+ root: __dirname,
3112
3131
  cacheDir: '../../../node_modules/.vite/packages/common/constructs',
3113
- plugins: [],
3114
- // Uncomment this if you are using workers.
3115
- // worker: {
3116
- // plugins: [],
3117
- // },
3118
3132
  test: {
3119
3133
  name: '@proj/common-constructs',
3120
3134
  watch: false,
@@ -3271,7 +3285,17 @@ exports[`react-website generator > Tanstack router integration > should generate
3271
3285
  }
3272
3286
  },
3273
3287
  "lint": {
3274
- "executor": "@nx/eslint:lint"
3288
+ "executor": "@nx/eslint:lint",
3289
+ "cache": true,
3290
+ "inputs": ["eslint"],
3291
+ "configurations": {
3292
+ "fix": {
3293
+ "fix": true
3294
+ },
3295
+ "skip-lint": {
3296
+ "force": true
3297
+ }
3298
+ }
3275
3299
  },
3276
3300
  "load:runtime-config": {
3277
3301
  "executor": "nx:run-commands",
@@ -7,8 +7,12 @@ import {
7
7
  Function,
8
8
  FunctionProps,
9
9
  Tracing,
10
+ <%_ if (backend.type === 'fastapi') { _%>
11
+ LayerVersion,
12
+ SnapStartConf,
13
+ <%_ } _%>
10
14
  } from 'aws-cdk-lib/aws-lambda';
11
- import { Duration } from 'aws-cdk-lib';
15
+ import { Duration<%_ if (backend.type === 'fastapi') { _%>, Stack<%_ } _%> } from 'aws-cdk-lib';
12
16
  import {
13
17
  CorsHttpMethod,
14
18
  CfnApi,
@@ -109,7 +113,7 @@ export class <%= apiNameClassName %><
109
113
  ),
110
114
  <%_ } else if (backend.type === 'fastapi') { _%>
111
115
  runtime: Runtime.PYTHON_3_12,
112
- handler: '<%= backend.moduleName %>.main.handler',
116
+ handler: 'run.sh',
113
117
  code: Code.fromAsset(
114
118
  url.fileURLToPath(
115
119
  new URL(
@@ -121,15 +125,37 @@ export class <%= apiNameClassName %><
121
125
  <%_ } _%>
122
126
  timeout: Duration.seconds(30),
123
127
  tracing: Tracing.ACTIVE,
128
+ <%_ if (backend.type === 'fastapi') { _%>
129
+ snapStart: SnapStartConf.ON_PUBLISHED_VERSIONS,
130
+ <%_ } _%>
124
131
  environment: {
125
132
  AWS_CONNECTION_REUSE_ENABLED: '1',
133
+ <%_ if (backend.type === 'fastapi') { _%>
134
+ PORT: '8000',
135
+ AWS_LWA_INVOKE_MODE: 'buffered',
136
+ AWS_LAMBDA_EXEC_WRAPPER: '/opt/bootstrap',
137
+ <%_ } _%>
126
138
  },
127
139
  } satisfies FunctionProps,
128
140
  buildDefaultIntegration: (op, props: FunctionProps) => {
129
141
  const handler = new Function(scope, `<%= apiNameClassName %>${op}Handler`, props);
142
+ <%_ if (backend.type === 'fastapi') { _%>
143
+ const stack = Stack.of(scope);
144
+ handler.addLayers(
145
+ LayerVersion.fromLayerVersionArn(
146
+ scope,
147
+ `<%= apiNameClassName %>${op}LWALayer`,
148
+ `arn:aws:lambda:${stack.region}:753240598075:layer:LambdaAdapterLayerX86:24`,
149
+ ),
150
+ );
151
+ <%_ } _%>
130
152
  return {
131
153
  handler,
154
+ <%_ if (backend.type === 'fastapi') { _%>
155
+ integration: new HttpLambdaIntegration(`<%= apiNameClassName %>${op}Integration`, handler.currentVersion),
156
+ <%_ } else { _%>
132
157
  integration: new HttpLambdaIntegration(`<%= apiNameClassName %>${op}Integration`, handler),
158
+ <%_ } _%>
133
159
  };
134
160
  },
135
161
  });
@@ -7,19 +7,23 @@ import {
7
7
  Function,
8
8
  FunctionProps,
9
9
  Tracing,
10
+ <%_ if (backend.type === 'fastapi') { _%>
11
+ LayerVersion,
12
+ SnapStartConf,
13
+ <%_ } _%>
10
14
  } from 'aws-cdk-lib/aws-lambda';
11
15
  import {
12
16
  AuthorizationType,
13
17
  Cors,
14
18
  LambdaIntegration,
15
- <%_ if (backend.type === 'trpc') { _%>
19
+ <%_ if (['trpc', 'fastapi'].includes(backend.type)) { _%>
16
20
  ResponseTransferMode,
17
21
  <%_ } _%>
18
22
  <%_ if (auth === 'Cognito') { _%>
19
23
  CognitoUserPoolsAuthorizer,
20
24
  <%_ } _%>
21
25
  } from 'aws-cdk-lib/aws-apigateway';
22
- import { Duration } from 'aws-cdk-lib';
26
+ import { Duration<%_ if (backend.type === 'fastapi') { _%>, Stack<%_ } _%> } from 'aws-cdk-lib';
23
27
  import {
24
28
  PolicyDocument,
25
29
  PolicyStatement,
@@ -109,7 +113,7 @@ export class <%= apiNameClassName %><
109
113
  ),
110
114
  <%_ } else if (backend.type === 'fastapi') { _%>
111
115
  runtime: Runtime.PYTHON_3_12,
112
- handler: '<%= backend.moduleName %>.main.handler',
116
+ handler: 'run.sh',
113
117
  code: Code.fromAsset(
114
118
  url.fileURLToPath(
115
119
  new URL(
@@ -121,15 +125,37 @@ export class <%= apiNameClassName %><
121
125
  <%_ } _%>
122
126
  timeout: Duration.seconds(30),
123
127
  tracing: Tracing.ACTIVE,
128
+ <%_ if (backend.type === 'fastapi') { _%>
129
+ snapStart: SnapStartConf.ON_PUBLISHED_VERSIONS,
130
+ <%_ } _%>
124
131
  environment: {
125
132
  AWS_CONNECTION_REUSE_ENABLED: '1',
133
+ <%_ if (backend.type === 'fastapi') { _%>
134
+ PORT: '8000',
135
+ AWS_LWA_INVOKE_MODE: 'response_stream',
136
+ AWS_LAMBDA_EXEC_WRAPPER: '/opt/bootstrap',
137
+ <%_ } _%>
126
138
  },
127
139
  } satisfies FunctionProps,
128
140
  buildDefaultIntegration: (op, props: FunctionProps) => {
129
141
  const handler = new Function(scope, `<%= apiNameClassName %>${op}Handler`, props);
142
+ <%_ if (backend.type === 'fastapi') { _%>
143
+ const stack = Stack.of(scope);
144
+ handler.addLayers(
145
+ LayerVersion.fromLayerVersionArn(
146
+ scope,
147
+ `<%= apiNameClassName %>${op}LWALayer`,
148
+ `arn:aws:lambda:${stack.region}:753240598075:layer:LambdaAdapterLayerX86:24`,
149
+ ),
150
+ );
151
+ <%_ } _%>
130
152
  return {
131
153
  handler,
132
- <%_ if (backend.type === 'trpc') { _%>
154
+ <%_ if (backend.type === 'fastapi') { _%>
155
+ integration: new LambdaIntegration(handler.currentVersion, {
156
+ responseTransferMode: ResponseTransferMode.STREAM,
157
+ }),
158
+ <%_ } else if (backend.type === 'trpc') { _%>
133
159
  integration: new LambdaIntegration(handler, {
134
160
  responseTransferMode: ResponseTransferMode.STREAM,
135
161
  }),
@@ -132,11 +132,15 @@ resource "aws_lambda_function" "api_lambda" {
132
132
  handler = "index.handler"
133
133
  runtime = "nodejs22.x"
134
134
  <%_ } else if (backend.type === 'fastapi') { _%>
135
- handler = "<%= backend.moduleName %>.main.handler"
135
+ handler = "run.sh"
136
136
  runtime = "python3.12"
137
+ layers = ["arn:aws:lambda:${data.aws_region.current.name}:753240598075:layer:LambdaAdapterLayerX86:24"]
137
138
  <%_ } _%>
138
139
  timeout = 30
139
140
  memory_size = 128
141
+ <%_ if (backend.type === 'fastapi') { _%>
142
+ publish = true
143
+ <%_ } _%>
140
144
 
141
145
  source_code_hash = data.archive_file.lambda_zip.output_base64sha256
142
146
 
@@ -145,9 +149,21 @@ resource "aws_lambda_function" "api_lambda" {
145
149
  mode = "Active"
146
150
  }
147
151
 
152
+ <%_ if (backend.type === 'fastapi') { _%>
153
+ # Enable SnapStart for faster cold starts
154
+ snap_start {
155
+ apply_on = "PublishedVersions"
156
+ }
157
+ <%_ } _%>
158
+
148
159
  environment {
149
160
  variables = merge({
150
161
  AWS_CONNECTION_REUSE_ENABLED = "1"
162
+ <%_ if (backend.type === 'fastapi') { _%>
163
+ PORT = "8000"
164
+ AWS_LWA_INVOKE_MODE = "buffered"
165
+ AWS_LAMBDA_EXEC_WRAPPER = "/opt/bootstrap"
166
+ <%_ } _%>
151
167
  }, var.env)
152
168
  }
153
169
 
@@ -207,6 +223,17 @@ resource "aws_cloudwatch_log_group" "lambda_logs" {
207
223
  tags = var.tags
208
224
  }
209
225
 
226
+ <%_ if (backend.type === 'fastapi') { _%>
227
+ # Lambda alias pointing to the latest published version for SnapStart
228
+ resource "aws_lambda_alias" "live" {
229
+ name = "live"
230
+ function_name = aws_lambda_function.api_lambda.function_name
231
+ function_version = aws_lambda_function.api_lambda.version
232
+
233
+ depends_on = [aws_lambda_function.api_lambda]
234
+ }
235
+ <%_ } _%>
236
+
210
237
  <%_ if (auth === 'Cognito') { _%>
211
238
  # Cognito User Pool Authorizer
212
239
  resource "aws_apigatewayv2_authorizer" "cognito_authorizer" {
@@ -226,12 +253,20 @@ resource "aws_apigatewayv2_authorizer" "cognito_authorizer" {
226
253
  resource "aws_apigatewayv2_integration" "lambda_integration" {
227
254
  api_id = module.http_api.api_id
228
255
  integration_type = "AWS_PROXY"
256
+ <%_ if (backend.type === 'fastapi') { _%>
257
+ integration_uri = aws_lambda_alias.live.invoke_arn
258
+ <%_ } else { _%>
229
259
  integration_uri = aws_lambda_function.api_lambda.invoke_arn
260
+ <%_ } _%>
230
261
 
231
262
  payload_format_version = "2.0"
232
263
  timeout_milliseconds = 30000
233
264
 
265
+ <%_ if (backend.type === 'fastapi') { _%>
266
+ depends_on = [aws_lambda_alias.live]
267
+ <%_ } else { _%>
234
268
  depends_on = [aws_lambda_function.api_lambda]
269
+ <%_ } _%>
235
270
  }
236
271
 
237
272
  # Route for proxy integration (catches all requests)
@@ -268,15 +303,22 @@ module "add_url_to_runtime_config" {
268
303
  depends_on = [module.http_api]
269
304
  }
270
305
 
271
- # Lambda permission for API Gateway to invoke the function
306
+ # Lambda permission for API Gateway to invoke the function<% if (backend.type === 'fastapi') { %> via alias<% } %>
272
307
  resource "aws_lambda_permission" "api_gateway_invoke" {
273
308
  statement_id = "AllowExecutionFromAPIGateway"
274
309
  action = "lambda:InvokeFunction"
275
310
  function_name = aws_lambda_function.api_lambda.function_name
311
+ <%_ if (backend.type === 'fastapi') { _%>
312
+ qualifier = aws_lambda_alias.live.name
313
+ <%_ } _%>
276
314
  principal = "apigateway.amazonaws.com"
277
315
  source_arn = "${module.http_api.api_execution_arn}/*/*"
278
316
 
317
+ <%_ if (backend.type === 'fastapi') { _%>
318
+ depends_on = [module.http_api, aws_lambda_alias.live]
319
+ <%_ } else { _%>
279
320
  depends_on = [module.http_api, aws_lambda_function.api_lambda]
321
+ <%_ } _%>
280
322
  }
281
323
 
282
324
  # Outputs
@@ -110,11 +110,15 @@ resource "aws_lambda_function" "api_lambda" {
110
110
  handler = "index.handler"
111
111
  runtime = "nodejs22.x"
112
112
  <%_ } else if (backend.type === 'fastapi') { _%>
113
- handler = "<%= backend.moduleName %>.main.handler"
113
+ handler = "run.sh"
114
114
  runtime = "python3.12"
115
+ layers = ["arn:aws:lambda:${data.aws_region.current.name}:753240598075:layer:LambdaAdapterLayerX86:24"]
115
116
  <%_ } _%>
116
117
  timeout = 30
117
118
  memory_size = 128
119
+ <%_ if (backend.type === 'fastapi') { _%>
120
+ publish = true
121
+ <%_ } _%>
118
122
 
119
123
  source_code_hash = data.archive_file.lambda_zip.output_base64sha256
120
124
 
@@ -123,9 +127,21 @@ resource "aws_lambda_function" "api_lambda" {
123
127
  mode = "Active"
124
128
  }
125
129
 
130
+ <%_ if (backend.type === 'fastapi') { _%>
131
+ # Enable SnapStart for faster cold starts
132
+ snap_start {
133
+ apply_on = "PublishedVersions"
134
+ }
135
+ <%_ } _%>
136
+
126
137
  environment {
127
138
  variables = merge({
128
139
  AWS_CONNECTION_REUSE_ENABLED = "1"
140
+ <%_ if (backend.type === 'fastapi') { _%>
141
+ PORT = "8000"
142
+ AWS_LWA_INVOKE_MODE = "response_stream"
143
+ AWS_LAMBDA_EXEC_WRAPPER = "/opt/bootstrap"
144
+ <%_ } _%>
129
145
  }, var.env)
130
146
  }
131
147
 
@@ -185,6 +201,17 @@ resource "aws_cloudwatch_log_group" "lambda_logs" {
185
201
  tags = var.tags
186
202
  }
187
203
 
204
+ <%_ if (backend.type === 'fastapi') { _%>
205
+ # Lambda alias pointing to the latest published version for SnapStart
206
+ resource "aws_lambda_alias" "live" {
207
+ name = "live"
208
+ function_name = aws_lambda_function.api_lambda.function_name
209
+ function_version = aws_lambda_function.api_lambda.version
210
+
211
+ depends_on = [aws_lambda_function.api_lambda]
212
+ }
213
+ <%_ } _%>
214
+
188
215
  <%_ if (auth === 'Cognito') { _%>
189
216
  # Cognito User Pool Authorizer
190
217
  resource "aws_api_gateway_authorizer" "cognito_authorizer" {
@@ -211,14 +238,22 @@ resource "aws_api_gateway_integration" "lambda_integration" {
211
238
 
212
239
  integration_http_method = "POST"
213
240
  type = "AWS_PROXY"
214
- <%_ if (backend.type === 'trpc') { _%>
241
+ <%_ if (backend.type === 'fastapi') { _%>
242
+ # Use the response streaming invocation path with the alias ARN for SnapStart
243
+ uri = "arn:aws:apigateway:${data.aws_region.current.name}:lambda:path/2021-11-15/functions/${aws_lambda_alias.live.arn}/response-streaming-invocations"
244
+ response_transfer_mode = "STREAM"
245
+ <%_ } else if (backend.type === 'trpc') { _%>
215
246
  uri = aws_lambda_function.api_lambda.response_streaming_invoke_arn
216
247
  response_transfer_mode = "STREAM"
217
248
  <%_ } else { _%>
218
249
  uri = aws_lambda_function.api_lambda.invoke_arn
219
250
  <%_ } _%>
220
251
 
252
+ <%_ if (backend.type === 'fastapi') { _%>
253
+ depends_on = [aws_lambda_alias.live]
254
+ <%_ } else { _%>
221
255
  depends_on = [aws_lambda_function.api_lambda]
256
+ <%_ } _%>
222
257
  }
223
258
 
224
259
  # Method for proxy integration
@@ -379,16 +414,41 @@ resource "aws_api_gateway_rest_api_policy" "api_policy" {
379
414
  })
380
415
  }
381
416
 
417
+ <%_ if (backend.type === 'fastapi') { _%>
418
+ # Lambda permission for API Gateway to invoke the function via alias
419
+ <%_ } else { _%>
382
420
  # Lambda permission for API Gateway to invoke the function
421
+ <%_ } _%>
383
422
  resource "aws_lambda_permission" "api_gateway_invoke" {
384
423
  statement_id = "AllowExecutionFromAPIGateway"
385
424
  action = "lambda:InvokeFunction"
386
425
  function_name = aws_lambda_function.api_lambda.function_name
426
+ <%_ if (backend.type === 'fastapi') { _%>
427
+ qualifier = aws_lambda_alias.live.name
428
+ <%_ } _%>
387
429
  principal = "apigateway.amazonaws.com"
388
430
  source_arn = "${module.rest_api.api_execution_arn}/*/*"
389
431
 
432
+ <%_ if (backend.type === 'fastapi') { _%>
433
+ depends_on = [module.rest_api, aws_lambda_alias.live]
434
+ <%_ } else { _%>
390
435
  depends_on = [module.rest_api, aws_lambda_function.api_lambda]
436
+ <%_ } _%>
437
+ }
438
+
439
+ <%_ if (backend.type === 'fastapi') { _%>
440
+ # Lambda permission for API Gateway to invoke with response streaming via alias
441
+ resource "aws_lambda_permission" "api_gateway_invoke_streaming" {
442
+ statement_id = "AllowStreamingFromAPIGateway"
443
+ action = "lambda:InvokeFunctionWithResponseStream"
444
+ function_name = aws_lambda_function.api_lambda.function_name
445
+ qualifier = aws_lambda_alias.live.name
446
+ principal = "apigateway.amazonaws.com"
447
+ source_arn = "${module.rest_api.api_execution_arn}/*/*"
448
+
449
+ depends_on = [module.rest_api, aws_lambda_alias.live]
391
450
  }
451
+ <%_ } _%>
392
452
 
393
453
  # Add API url to runtime config
394
454
  module "add_url_to_runtime_config" {