@aws/nx-plugin 0.5.1 → 0.7.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 (69) hide show
  1. package/LICENSE-THIRD-PARTY +157 -0
  2. package/generators.json +26 -10
  3. package/package.json +3 -1
  4. package/src/api-connection/README.md +0 -0
  5. package/src/api-connection/generator.d.ts +20 -0
  6. package/src/api-connection/generator.js +101 -0
  7. package/src/api-connection/generator.js.map +1 -0
  8. package/src/api-connection/schema.d.ts +10 -0
  9. package/src/api-connection/schema.json +32 -0
  10. package/src/cloudscape-website/app/README.md +3 -3
  11. package/src/cloudscape-website/app/__snapshots__/generator.spec.ts.snap +4 -2
  12. package/src/cloudscape-website/app/files/common/constructs/src/app/static-websites/__websiteNameKebabCase__.ts.template +1 -1
  13. package/src/cloudscape-website/app/generator.js +25 -10
  14. package/src/cloudscape-website/app/generator.js.map +1 -1
  15. package/src/cloudscape-website/cognito-auth/README.md +4 -4
  16. package/src/infra/app/README.md +3 -3
  17. package/src/infra/app/__snapshots__/generator.spec.ts.snap +24 -41
  18. package/src/infra/app/generator.js +2 -1
  19. package/src/infra/app/generator.js.map +1 -1
  20. package/src/py/fast-api/files/app/__name__/main.py.template +9 -0
  21. package/src/py/fast-api/files/app/tests/test_main.py +7 -0
  22. package/src/py/fast-api/files/common/constructs/src/app/http-apis/__apiNameKebabCase__.ts.template +22 -0
  23. package/src/py/fast-api/generator.d.ts +11 -0
  24. package/src/py/fast-api/generator.js +120 -0
  25. package/src/py/fast-api/generator.js.map +1 -0
  26. package/src/py/fast-api/schema.d.ts +9 -0
  27. package/src/py/fast-api/schema.json +22 -0
  28. package/src/py/project/generator.d.ts +31 -0
  29. package/src/py/project/generator.js +103 -0
  30. package/src/py/project/generator.js.map +1 -0
  31. package/src/py/project/schema.d.ts +11 -0
  32. package/src/py/project/schema.json +32 -0
  33. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +50 -44
  34. package/src/trpc/backend/files/common/constructs/src/app/{trpc-apis → http-apis}/__apiNameKebabCase__.ts.template +7 -3
  35. package/src/trpc/backend/generator.js +30 -23
  36. package/src/trpc/backend/generator.js.map +1 -1
  37. package/src/trpc/backend/schema.json +1 -1
  38. package/src/trpc/react/__snapshots__/generator.spec.ts.snap +1 -1
  39. package/src/trpc/react/files/src/hooks/useSigV4.tsx.template +1 -1
  40. package/src/trpc/react/generator.js +1 -40
  41. package/src/trpc/react/generator.js.map +1 -1
  42. package/src/trpc/react/schema.json +1 -1
  43. package/src/ts/lib/__snapshots__/generator.spec.ts.snap +12 -33
  44. package/src/ts/lib/eslint.js +28 -0
  45. package/src/ts/lib/eslint.js.map +1 -1
  46. package/src/ts/lib/generator.js +20 -12
  47. package/src/ts/lib/generator.js.map +1 -1
  48. package/src/ts/lib/ts-project-utils.js +2 -2
  49. package/src/ts/lib/ts-project-utils.js.map +1 -1
  50. package/src/utils/ast.d.ts +4 -0
  51. package/src/utils/ast.js +10 -1
  52. package/src/utils/ast.js.map +1 -1
  53. package/src/{trpc/backend/files/common/constructs/src/core/trpc-api.ts.template → utils/files/http-api/common/constructs/src/core/http-api.ts.template} +20 -18
  54. package/src/utils/http-api.d.ts +6 -0
  55. package/src/utils/http-api.js +61 -0
  56. package/src/utils/http-api.js.map +1 -0
  57. package/src/utils/names.d.ts +1 -0
  58. package/src/utils/names.js +4 -1
  59. package/src/utils/names.js.map +1 -1
  60. package/src/utils/npm-scope.js +2 -2
  61. package/src/utils/npm-scope.js.map +1 -1
  62. package/src/utils/nx.d.ts +8 -0
  63. package/src/utils/nx.js +11 -0
  64. package/src/utils/nx.js.map +1 -0
  65. package/src/utils/shared-constructs.js +1 -1
  66. package/src/utils/shared-constructs.js.map +1 -1
  67. package/src/utils/versions.d.ts +5 -2
  68. package/src/utils/versions.js +4 -1
  69. package/src/utils/versions.js.map +1 -1
@@ -39,7 +39,7 @@ Then add authentication:
39
39
 
40
40
  1. Open the NX Console in VSCode
41
41
  2. Click on "Generate"
42
- 3. Search for "cloudscape-website#cognito-auth"
42
+ 3. Search for "ts#cloudscape-website#cognito-auth"
43
43
  4. Fill in the required parameters:
44
44
  - project: Your existing Cloudscape application name
45
45
  - allowSignup: Whether to enable self-signup (optional)
@@ -50,19 +50,19 @@ Then add authentication:
50
50
  Add authentication to your existing Cloudscape application:
51
51
 
52
52
  ```bash
53
- nx g @aws/nx-plugin:cloudscape-website#cognito-auth --project=my-cloudscape-app --cognito-domain=<your-domain-prefix>
53
+ nx g @aws/nx-plugin:ts#cloudscape-website#cognito-auth --project=my-cloudscape-app --cognito-domain=<your-domain-prefix>
54
54
  ```
55
55
 
56
56
  Enable self-signup:
57
57
 
58
58
  ```bash
59
- nx g @aws/nx-plugin:cloudscape-website#cognito-auth --project=my-cloudscape-app --allowSignup=true --cognito-domain=<your-domain-prefix>
59
+ nx g @aws/nx-plugin:ts#cloudscape-website#cognito-auth --project=my-cloudscape-app --allowSignup=true --cognito-domain=<your-domain-prefix>
60
60
  ```
61
61
 
62
62
  You can also perform a dry-run to see what files would be generated without actually creating them:
63
63
 
64
64
  ```bash
65
- nx g @aws/nx-plugin:cloudscape-website#cognito-auth --project=my-cloudscape-app --cognito-domain=<your-domain-prefix> --dry-run
65
+ nx g @aws/nx-plugin:ts#cloudscape-website#cognito-auth --project=my-cloudscape-app --cognito-domain=<your-domain-prefix> --dry-run
66
66
  ```
67
67
 
68
68
  All methods will add Cognito authentication to your existing Cloudscape website application with all the necessary components and infrastructure code.
@@ -21,7 +21,7 @@ Then generate your application:
21
21
 
22
22
  1. Open the NX Console in VSCode
23
23
  2. Click on "Generate"
24
- 3. Search for "infra#app"
24
+ 3. Search for "ts#infra"
25
25
  4. Fill in the required parameters in the form
26
26
  5. Click "Run"
27
27
 
@@ -30,13 +30,13 @@ Then generate your application:
30
30
  Generate the application:
31
31
 
32
32
  ```bash
33
- nx g @aws/nx-plugin:infra#app my-infra --directory=apps/infrastructure
33
+ nx g @aws/nx-plugin:ts#infra my-infra --directory=apps/infrastructure
34
34
  ```
35
35
 
36
36
  You can also perform a dry-run to see what files would be generated without actually creating them:
37
37
 
38
38
  ```bash
39
- nx g @aws/nx-plugin:infra#app my-infra --directory=apps/infrastructure --dry-run
39
+ nx g @aws/nx-plugin:ts#infra my-infra --directory=apps/infrastructure --dry-run
40
40
  ```
41
41
 
42
42
  ## Input Parameters
@@ -6,7 +6,7 @@ exports[`infra generator > should add required dependencies to package.json > de
6
6
  "aws-cdk": "^2.166.0",
7
7
  "aws-cdk-lib": "^2.166.0",
8
8
  "constructs": "^10.4.2",
9
- "esbuild": "^0.24.0",
9
+ "esbuild": "^0.25.0",
10
10
  "source-map-support": "^0.5.21",
11
11
  }
12
12
  `;
@@ -22,6 +22,7 @@ exports[`infra generator > should add required dependencies to package.json > de
22
22
  "@swc-node/register": "~1.9.1",
23
23
  "@swc/core": "~1.5.7",
24
24
  "@swc/helpers": "~0.5.11",
25
+ "@types/node": "^22.13.1",
25
26
  "@vitest/coverage-v8": "^1.0.4",
26
27
  "@vitest/ui": "^1.3.1",
27
28
  "eslint": "^9.8.0",
@@ -45,7 +46,7 @@ exports[`infra generator > should add required dependencies to package.json > pa
45
46
  "aws-cdk": "^2.166.0",
46
47
  "aws-cdk-lib": "^2.166.0",
47
48
  "constructs": "^10.4.2",
48
- "esbuild": "^0.24.0",
49
+ "esbuild": "^0.25.0",
49
50
  "source-map-support": "^0.5.21",
50
51
  },
51
52
  "devDependencies": {
@@ -58,6 +59,7 @@ exports[`infra generator > should add required dependencies to package.json > pa
58
59
  "@swc-node/register": "~1.9.1",
59
60
  "@swc/core": "~1.5.7",
60
61
  "@swc/helpers": "~0.5.11",
62
+ "@types/node": "^22.13.1",
61
63
  "@vitest/coverage-v8": "^1.0.4",
62
64
  "@vitest/ui": "^1.3.1",
63
65
  "eslint": "^9.8.0",
@@ -120,17 +122,13 @@ exports[`infra generator > should configure project.json with correct targets >
120
122
  ],
121
123
  },
122
124
  "compile": {
123
- "executor": "@nx/js:tsc",
125
+ "executor": "nx:run-commands",
124
126
  "options": {
125
- "assets": [
126
- "packages/test/*.md",
127
- ],
128
- "main": "packages/test/src/main.ts",
129
- "outputPath": "dist/packages/test",
130
- "tsConfig": "packages/test/tsconfig.json",
127
+ "command": "tsc --build tsconfig.lib.json",
128
+ "cwd": "{projectRoot}",
131
129
  },
132
130
  "outputs": [
133
- "{options.outputPath}",
131
+ "{workspaceRoot}/dist/packages/test/tsc",
134
132
  ],
135
133
  },
136
134
  "deploy": {
@@ -140,9 +138,6 @@ exports[`infra generator > should configure project.json with correct targets >
140
138
  "cwd": "packages/test",
141
139
  },
142
140
  },
143
- "lint": {
144
- "executor": "@nx/eslint:lint",
145
- },
146
141
  "synth": {
147
142
  "cache": true,
148
143
  "dependsOn": [
@@ -462,23 +457,18 @@ exports[`infra generator > should generate files with correct content > project-
462
457
  "dependsOn": ["lint", "compile", "test", "synth"]
463
458
  },
464
459
  "compile": {
465
- "executor": "@nx/js:tsc",
466
- "outputs": ["{options.outputPath}"],
460
+ "executor": "nx:run-commands",
461
+ "outputs": ["{workspaceRoot}/dist/packages/test/tsc"],
467
462
  "options": {
468
- "outputPath": "dist/packages/test",
469
- "main": "packages/test/src/main.ts",
470
- "tsConfig": "packages/test/tsconfig.json",
471
- "assets": ["packages/test/*.md"]
463
+ "command": "tsc --build tsconfig.lib.json",
464
+ "cwd": "{projectRoot}"
472
465
  }
473
466
  },
474
- "lint": {
475
- "executor": "@nx/eslint:lint"
476
- },
477
- "test": {
478
- "executor": "@nx/vite:test",
479
- "outputs": ["{options.reportsDirectory}"],
467
+ "deploy": {
468
+ "executor": "nx:run-commands",
480
469
  "options": {
481
- "reportsDirectory": "../../coverage/packages/test"
470
+ "cwd": "packages/test",
471
+ "command": "cdk deploy --require-approval=never --app ../../dist/packages/test/cdk.out"
482
472
  }
483
473
  },
484
474
  "synth": {
@@ -491,11 +481,11 @@ exports[`infra generator > should generate files with correct content > project-
491
481
  "command": "cdk synth"
492
482
  }
493
483
  },
494
- "deploy": {
495
- "executor": "nx:run-commands",
484
+ "test": {
485
+ "executor": "@nx/vite:test",
486
+ "outputs": ["{options.reportsDirectory}"],
496
487
  "options": {
497
- "cwd": "packages/test",
498
- "command": "cdk deploy --require-approval=never --app ../../dist/packages/test/cdk.out"
488
+ "reportsDirectory": "../../coverage/packages/test"
499
489
  }
500
490
  }
501
491
  }
@@ -766,17 +756,13 @@ exports[`infra generator > should handle custom project names correctly > custom
766
756
  ],
767
757
  },
768
758
  "compile": {
769
- "executor": "@nx/js:tsc",
759
+ "executor": "nx:run-commands",
770
760
  "options": {
771
- "assets": [
772
- "packages/custom-infra/*.md",
773
- ],
774
- "main": "packages/custom-infra/src/main.ts",
775
- "outputPath": "dist/packages/custom-infra",
776
- "tsConfig": "packages/custom-infra/tsconfig.json",
761
+ "command": "tsc --build tsconfig.lib.json",
762
+ "cwd": "{projectRoot}",
777
763
  },
778
764
  "outputs": [
779
- "{options.outputPath}",
765
+ "{workspaceRoot}/dist/packages/custom-infra/tsc",
780
766
  ],
781
767
  },
782
768
  "deploy": {
@@ -786,9 +772,6 @@ exports[`infra generator > should handle custom project names correctly > custom
786
772
  "cwd": "packages/custom-infra",
787
773
  },
788
774
  },
789
- "lint": {
790
- "executor": "@nx/eslint:lint",
791
- },
792
775
  "synth": {
793
776
  "cache": true,
794
777
  "dependsOn": [
@@ -14,6 +14,7 @@ const shared_constructs_1 = require("../../utils/shared-constructs");
14
14
  const ast_1 = require("../../utils/ast");
15
15
  const path_1 = tslib_1.__importDefault(require("path"));
16
16
  const format_1 = require("../../utils/format");
17
+ const nx_1 = require("../../utils/nx");
17
18
  function infraGenerator(tree, schema) {
18
19
  return tslib_1.__awaiter(this, void 0, void 0, function* () {
19
20
  const lib = (0, generator_1.getTsLibDetails)(tree, schema);
@@ -46,7 +47,6 @@ function infraGenerator(tree, schema) {
46
47
  ...((_a = config.targets.build.dependsOn) !== null && _a !== void 0 ? _a : []),
47
48
  'synth',
48
49
  ];
49
- config.targets.compile.options.main = (0, devkit_1.joinPathFragments)(libraryRoot, 'src', 'main.ts');
50
50
  config.targets.synth = {
51
51
  cache: true,
52
52
  executor: 'nx:run-commands',
@@ -64,6 +64,7 @@ function infraGenerator(tree, schema) {
64
64
  command: `cdk deploy --require-approval=never --app ${synthDirFromProject}`,
65
65
  },
66
66
  };
67
+ config.targets = (0, nx_1.sortProjectTargets)(config.targets);
67
68
  return config;
68
69
  });
69
70
  (0, ast_1.addStarExport)(tree, (0, devkit_1.joinPathFragments)(shared_constructs_1.PACKAGES_DIR, shared_constructs_1.SHARED_CONSTRUCTS_DIR, 'src', 'core', 'index.ts'), './cfn-guard.js');
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/infra/app/generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/infra/app/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ from fastapi import FastAPI
2
+ from mangum import Mangum
3
+
4
+ app = FastAPI()
5
+ handler = Mangum(app)
6
+
7
+ @app.get("/")
8
+ def read_root():
9
+ return {"Hello": "World"}
@@ -0,0 +1,7 @@
1
+ #
2
+ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ # SPDX-License-Identifier: Apache-2.0
4
+ #
5
+
6
+ def test_main():
7
+ pass
@@ -0,0 +1,22 @@
1
+ import { Construct } from 'constructs';
2
+ import * as url from 'url';
3
+ import { HttpApi } from '../../core/http-api.js';
4
+ import { HttpIamAuthorizer } from 'aws-cdk-lib/aws-apigatewayv2-authorizers';
5
+ import { Runtime } from 'aws-cdk-lib/aws-lambda';
6
+
7
+ export class <%= apiNameClassName %> extends HttpApi {
8
+ constructor(scope: Construct, id: string) {
9
+ super(scope, id, {
10
+ defaultAuthorizer: new HttpIamAuthorizer(),
11
+ apiName: '<%= apiNameClassName %>',
12
+ runtime: Runtime.PYTHON_3_12,
13
+ handler: '<%= apiNameSnakeCase %>.main.handler',
14
+ handlerFilePath: url.fileURLToPath(
15
+ new URL(
16
+ '../../../../../../dist/<%= dir %>/bundle',
17
+ import.meta.url
18
+ )
19
+ )
20
+ });
21
+ }
22
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { GeneratorCallback, Tree } from '@nx/devkit';
6
+ import { FastApiProjectGeneratorSchema } from './schema';
7
+ /**
8
+ * Generates a Python FastAPI project
9
+ */
10
+ export declare const fastApiProjectGenerator: (tree: Tree, schema: FastApiProjectGeneratorSchema) => Promise<GeneratorCallback>;
11
+ export default fastApiProjectGenerator;
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fastApiProjectGenerator = void 0;
4
+ const tslib_1 = require("tslib");
5
+ /**
6
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
7
+ * SPDX-License-Identifier: Apache-2.0
8
+ */
9
+ const devkit_1 = require("@nx/devkit");
10
+ const provider_1 = require("@nxlv/python/src/provider/uv/provider");
11
+ const logger_1 = require("@nxlv/python/src/executors/utils/logger");
12
+ const generator_1 = tslib_1.__importStar(require("../project/generator"));
13
+ const toml_1 = require("@iarna/toml");
14
+ const shared_constructs_1 = require("../../utils/shared-constructs");
15
+ const names_1 = require("../../utils/names");
16
+ const ast_1 = require("../../utils/ast");
17
+ const format_1 = require("../../utils/format");
18
+ const http_api_1 = require("../../utils/http-api");
19
+ const nx_1 = require("../../utils/nx");
20
+ /**
21
+ * Generates a Python FastAPI project
22
+ */
23
+ const fastApiProjectGenerator = (tree, schema) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
24
+ var _a, _b;
25
+ yield (0, shared_constructs_1.sharedConstructsGenerator)(tree);
26
+ const { dir, normalizedName, normalizedModuleName, fullyQualifiedName } = (0, generator_1.getPyProjectDetails)(tree, {
27
+ name: schema.name,
28
+ directory: schema.directory,
29
+ });
30
+ const apiNameSnakeCase = (0, names_1.toSnakeCase)(schema.name);
31
+ const apiNameKebabCase = (0, names_1.toKebabCase)(schema.name);
32
+ const apiNameClassName = (0, names_1.toClassName)(schema.name);
33
+ const enhancedOptions = Object.assign(Object.assign({}, schema), { dir,
34
+ apiNameClassName,
35
+ apiNameKebabCase,
36
+ apiNameSnakeCase });
37
+ yield (0, generator_1.default)(tree, {
38
+ name: normalizedName,
39
+ directory: schema.directory,
40
+ moduleName: normalizedModuleName,
41
+ projectType: 'application',
42
+ });
43
+ const projectConfig = (0, devkit_1.readProjectConfiguration)(tree, fullyQualifiedName);
44
+ projectConfig.targets.bundle = {
45
+ cache: true,
46
+ executor: 'nx:run-commands',
47
+ outputs: [`{workspaceRoot}/dist/${dir}/bundle`],
48
+ options: {
49
+ commands: [
50
+ `uv export --frozen --no-dev --no-editable --project ${normalizedName} -o dist/${dir}/bundle/requirements.txt`,
51
+ `uv pip install --no-installer-metadata --no-compile-bytecode --python-platform x86_64-manylinux2014 --python \`uv python pin\` --target dist/${dir}/bundle -r dist/${dir}/bundle/requirements.txt`
52
+ ],
53
+ parallel: false,
54
+ },
55
+ dependsOn: ['compile'],
56
+ };
57
+ projectConfig.targets.build.dependsOn = [
58
+ ...((_a = projectConfig.targets.build.dependsOn) !== null && _a !== void 0 ? _a : []),
59
+ 'bundle',
60
+ ];
61
+ projectConfig.targets.serve = {
62
+ executor: '@nxlv/python:run-commands',
63
+ options: {
64
+ command: `uv run fastapi dev ${normalizedName}/main.py`,
65
+ cwd: dir,
66
+ },
67
+ };
68
+ projectConfig.metadata = {
69
+ apiName: schema.name,
70
+ apiType: 'fast-api',
71
+ };
72
+ projectConfig.targets = (0, nx_1.sortProjectTargets)(projectConfig.targets);
73
+ (0, devkit_1.updateProjectConfiguration)(tree, normalizedName, projectConfig);
74
+ [
75
+ (0, devkit_1.joinPathFragments)(dir, normalizedModuleName !== null && normalizedModuleName !== void 0 ? normalizedModuleName : normalizedName, 'hello.py'),
76
+ (0, devkit_1.joinPathFragments)(dir, 'tests', 'test_hello.py'),
77
+ ].forEach((f) => tree.delete(f));
78
+ (0, devkit_1.generateFiles)(tree, // the virtual file system
79
+ (0, devkit_1.joinPathFragments)(__dirname, 'files', 'app'), // path to the file templates
80
+ dir, // destination path of the files
81
+ {
82
+ name: normalizedName,
83
+ }, {
84
+ overwriteStrategy: devkit_1.OverwriteStrategy.Overwrite,
85
+ });
86
+ if (!tree.exists((0, devkit_1.joinPathFragments)(shared_constructs_1.PACKAGES_DIR, shared_constructs_1.SHARED_CONSTRUCTS_DIR, 'src', 'app', 'http-apis', `${apiNameKebabCase}.ts`))) {
87
+ (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files', shared_constructs_1.SHARED_CONSTRUCTS_DIR, 'src', 'app'), (0, devkit_1.joinPathFragments)(shared_constructs_1.PACKAGES_DIR, shared_constructs_1.SHARED_CONSTRUCTS_DIR, 'src', 'app'), enhancedOptions, {
88
+ overwriteStrategy: devkit_1.OverwriteStrategy.KeepExisting,
89
+ });
90
+ (0, ast_1.addStarExport)(tree, (0, devkit_1.joinPathFragments)(shared_constructs_1.PACKAGES_DIR, shared_constructs_1.SHARED_CONSTRUCTS_DIR, 'src', 'app', 'index.ts'), './http-apis/index.js');
91
+ (0, ast_1.addStarExport)(tree, (0, devkit_1.joinPathFragments)(shared_constructs_1.PACKAGES_DIR, shared_constructs_1.SHARED_CONSTRUCTS_DIR, 'src', 'app', 'http-apis', 'index.ts'), `./${apiNameKebabCase}.js`);
92
+ }
93
+ (0, http_api_1.addHttpApi)(tree, apiNameClassName);
94
+ (0, devkit_1.updateJson)(tree, (0, devkit_1.joinPathFragments)(shared_constructs_1.PACKAGES_DIR, shared_constructs_1.SHARED_CONSTRUCTS_DIR, 'project.json'), (config) => {
95
+ var _a;
96
+ if (!config.targets) {
97
+ config.targets = {};
98
+ }
99
+ if (!config.targets.build) {
100
+ config.targets.build = {};
101
+ }
102
+ config.targets.build.dependsOn = [
103
+ ...((_a = config.targets.build.dependsOn) !== null && _a !== void 0 ? _a : []),
104
+ `${fullyQualifiedName}:build`,
105
+ ];
106
+ return config;
107
+ });
108
+ const projectToml = (0, toml_1.parse)(tree.read((0, devkit_1.joinPathFragments)(dir, 'pyproject.toml'), 'utf8'));
109
+ projectToml.project.dependencies = ['fastapi', 'mangum'].concat(((_b = projectToml.project) === null || _b === void 0 ? void 0 : _b.dependencies) || []);
110
+ projectToml['dependency-groups'] = { dev: ['fastapi[standard]>=0.115'] };
111
+ tree.write((0, devkit_1.joinPathFragments)(dir, 'pyproject.toml'), (0, toml_1.stringify)(projectToml));
112
+ yield (0, format_1.formatFilesInSubtree)(tree);
113
+ return () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
114
+ yield new provider_1.UVProvider(tree.root, new logger_1.Logger(), tree).install();
115
+ (0, devkit_1.installPackagesTask)(tree);
116
+ });
117
+ });
118
+ exports.fastApiProjectGenerator = fastApiProjectGenerator;
119
+ exports.default = exports.fastApiProjectGenerator;
120
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/py/fast-api/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+
6
+ export interface FastApiProjectGeneratorSchema {
7
+ readonly name: string;
8
+ readonly directory?: string;
9
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "$schema": "https://json-schema.org/schema",
3
+ "$id": "TsLib",
4
+ "title": "Create a Python FastAPI project",
5
+ "description": "Create a Python FastAPI project",
6
+ "type": "object",
7
+ "properties": {
8
+ "name": {
9
+ "type": "string",
10
+ "description": "project name.",
11
+ "x-priority": "important"
12
+ },
13
+ "directory": {
14
+ "type": "string",
15
+ "description": "Parent directory where the project is placed.",
16
+ "default": "packages",
17
+ "x-prompt": "Which directory do you want to create the project in?",
18
+ "x-priority": "important"
19
+ }
20
+ },
21
+ "required": ["name"]
22
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { GeneratorCallback, Tree } from '@nx/devkit';
6
+ import { PyProjectGeneratorSchema } from './schema';
7
+ export interface PyProjectDetails {
8
+ readonly normalizedName: string;
9
+ /**
10
+ * Full package name including scope (eg foo.bar)
11
+ */
12
+ readonly fullyQualifiedName: string;
13
+ /**
14
+ * Directory of the library relative to the root
15
+ */
16
+ readonly dir: string;
17
+ readonly normalizedModuleName?: string;
18
+ }
19
+ /**
20
+ * Returns details about the Python project to be created
21
+ */
22
+ export declare const getPyProjectDetails: (tree: Tree, schema: {
23
+ name: string;
24
+ directory?: string;
25
+ moduleName?: string;
26
+ }) => PyProjectDetails;
27
+ /**
28
+ * Generates a Python project
29
+ */
30
+ export declare const pyProjectGenerator: (tree: Tree, schema: PyProjectGeneratorSchema) => Promise<GeneratorCallback>;
31
+ export default pyProjectGenerator;
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pyProjectGenerator = exports.getPyProjectDetails = void 0;
4
+ const tslib_1 = require("tslib");
5
+ /**
6
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
7
+ * SPDX-License-Identifier: Apache-2.0
8
+ */
9
+ const devkit_1 = require("@nx/devkit");
10
+ const generator_1 = tslib_1.__importDefault(require("@nxlv/python/src/generators/migrate-to-shared-venv/generator"));
11
+ const generator_2 = tslib_1.__importDefault(require("@nxlv/python/src/generators/uv-project/generator"));
12
+ const provider_1 = require("@nxlv/python/src/provider/uv/provider");
13
+ const logger_1 = require("@nxlv/python/src/executors/utils/logger");
14
+ const versions_1 = require("../../utils/versions");
15
+ const npm_scope_1 = require("../../utils/npm-scope");
16
+ const names_1 = require("../../utils/names");
17
+ const nx_1 = require("../../utils/nx");
18
+ /**
19
+ * Returns details about the Python project to be created
20
+ */
21
+ const getPyProjectDetails = (tree, schema) => {
22
+ var _a;
23
+ const scope = (0, names_1.toSnakeCase)((0, npm_scope_1.getNpmScope)(tree));
24
+ const normalizedName = (0, names_1.toSnakeCase)(schema.name);
25
+ const normalizedModuleName = (0, names_1.toSnakeCase)(schema.moduleName);
26
+ const fullyQualifiedName = `${scope}.${normalizedName}`;
27
+ const dir = (0, devkit_1.joinPathFragments)((_a = (0, names_1.toSnakeCase)(schema.directory)) !== null && _a !== void 0 ? _a : '.', normalizedName);
28
+ return { dir, fullyQualifiedName, normalizedName, normalizedModuleName };
29
+ };
30
+ exports.getPyProjectDetails = getPyProjectDetails;
31
+ /**
32
+ * Generates a Python project
33
+ */
34
+ const pyProjectGenerator = (tree, schema) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
35
+ var _a, _b, _c;
36
+ const { dir, normalizedName, normalizedModuleName, fullyQualifiedName } = (0, exports.getPyProjectDetails)(tree, schema);
37
+ const pythonPlugin = (0, versions_1.withVersions)(['@nxlv/python']);
38
+ Object.entries(pythonPlugin).forEach(([name, version]) => (0, devkit_1.ensurePackage)(name, version));
39
+ const nxJson = (0, devkit_1.readNxJson)(tree);
40
+ if (!((_a = nxJson.plugins) === null || _a === void 0 ? void 0 : _a.find((p) => typeof p === 'string'
41
+ ? p === '@nxlv/python'
42
+ : p.plugin === '@nxlv/python'))) {
43
+ nxJson.plugins = [
44
+ ...((_b = nxJson.plugins) !== null && _b !== void 0 ? _b : []),
45
+ {
46
+ plugin: '@nxlv/python',
47
+ options: {
48
+ packageManager: 'uv',
49
+ },
50
+ },
51
+ ];
52
+ (0, devkit_1.updateNxJson)(tree, nxJson);
53
+ }
54
+ if (!tree.exists('uv.lock')) {
55
+ yield (0, generator_1.default)(tree, {
56
+ autoActivate: true,
57
+ packageManager: 'uv',
58
+ moveDevDependencies: false,
59
+ pyenvPythonVersion: '3.12.0',
60
+ pyprojectPythonDependency: '>=3.12',
61
+ });
62
+ }
63
+ yield (0, generator_2.default)(tree, {
64
+ name: normalizedName,
65
+ publishable: false,
66
+ buildLockedVersions: true,
67
+ buildBundleLocalDependencies: true,
68
+ linter: 'ruff',
69
+ rootPyprojectDependencyGroup: 'main',
70
+ pyenvPythonVersion: '3.12.0',
71
+ pyprojectPythonDependency: '>=3.12',
72
+ projectType: schema.projectType,
73
+ projectNameAndRootFormat: 'as-provided',
74
+ moduleName: normalizedModuleName,
75
+ directory: dir,
76
+ unitTestRunner: 'pytest',
77
+ codeCoverage: true,
78
+ codeCoverageHtmlReport: true,
79
+ codeCoverageXmlReport: true,
80
+ unitTestHtmlReport: true,
81
+ unitTestJUnitReport: true,
82
+ });
83
+ const outputPath = `{workspaceRoot}/dist/${dir}`;
84
+ const buildOutputPath = (0, devkit_1.joinPathFragments)(outputPath, 'build');
85
+ const projectConfiguration = (0, devkit_1.readProjectConfiguration)(tree, normalizedName);
86
+ projectConfiguration.name = fullyQualifiedName;
87
+ const buildTarget = projectConfiguration.targets.build;
88
+ projectConfiguration.targets.compile = Object.assign(Object.assign({}, buildTarget), { outputs: [buildOutputPath], options: Object.assign(Object.assign({}, buildTarget.options), { outputPath: buildOutputPath }) });
89
+ projectConfiguration.targets.build = {
90
+ dependsOn: ['lint', 'compile', 'test', ...((_c = buildTarget.dependsOn) !== null && _c !== void 0 ? _c : [])],
91
+ options: {
92
+ outputPath,
93
+ },
94
+ };
95
+ projectConfiguration.targets = (0, nx_1.sortProjectTargets)(projectConfiguration.targets);
96
+ (0, devkit_1.updateProjectConfiguration)(tree, normalizedName, projectConfiguration);
97
+ return () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
98
+ yield new provider_1.UVProvider(tree.root, new logger_1.Logger(), tree).install();
99
+ });
100
+ });
101
+ exports.pyProjectGenerator = pyProjectGenerator;
102
+ exports.default = exports.pyProjectGenerator;
103
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/py/project/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+
6
+ export interface PyProjectGeneratorSchema {
7
+ readonly name: string;
8
+ readonly projectType: 'application' | 'library';
9
+ readonly directory?: string;
10
+ readonly moduleName?: string;
11
+ }