@aws/nx-plugin 0.110.0 → 0.112.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 (67) hide show
  1. package/README.md +1 -0
  2. package/generators.json +6 -0
  3. package/package.json +1 -1
  4. package/src/connection/agent-serve-local.js +7 -8
  5. package/src/connection/agent-serve-local.js.map +1 -1
  6. package/src/connection/serve-local.js +7 -8
  7. package/src/connection/serve-local.js.map +1 -1
  8. package/src/infra/app/generator.js +2 -5
  9. package/src/infra/app/generator.js.map +1 -1
  10. package/src/preset/__snapshots__/generator.spec.ts.snap +2 -0
  11. package/src/py/fast-api/__snapshots__/generator.spec.ts.snap +2 -2
  12. package/src/py/fast-api/files/app/__name__/init.py.template +2 -2
  13. package/src/py/project/generator.js +17 -1
  14. package/src/py/project/generator.js.map +1 -1
  15. package/src/py/strands-agent/__snapshots__/generator.spec.ts.snap +1 -1
  16. package/src/py/strands-agent/a2a-connection/generator.js +4 -8
  17. package/src/py/strands-agent/a2a-connection/generator.js.map +1 -1
  18. package/src/py/strands-agent/files/http/init.py.template +2 -2
  19. package/src/py/strands-agent/mcp-connection/__snapshots__/generator.spec.ts.snap +8 -4
  20. package/src/py/strands-agent/mcp-connection/generator.js +4 -8
  21. package/src/py/strands-agent/mcp-connection/generator.js.map +1 -1
  22. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +4822 -0
  23. package/src/ts/rdb/files/Dockerfile.template +15 -0
  24. package/src/ts/rdb/files/prisma/models/example.prisma.template +5 -0
  25. package/src/ts/rdb/files/prisma/schema.prisma.template +9 -0
  26. package/src/ts/rdb/files/prisma.config.ts.template +24 -0
  27. package/src/ts/rdb/files/scripts/docker-pull.ts.template +15 -0
  28. package/src/ts/rdb/files/scripts/docker-start.ts.template +81 -0
  29. package/src/ts/rdb/files/scripts/wait-for-db.ts.template +55 -0
  30. package/src/ts/rdb/files/src/constants.ts.template +8 -0
  31. package/src/ts/rdb/files/src/create-db-user-handler.ts.template +128 -0
  32. package/src/ts/rdb/files/src/index.ts.template +2 -0
  33. package/src/ts/rdb/files/src/migration-handler.ts.template +54 -0
  34. package/src/ts/rdb/files/src/prisma.ts.template +104 -0
  35. package/src/ts/rdb/files/src/utils.ts.template +145 -0
  36. package/src/ts/rdb/generator.d.ts +10 -0
  37. package/src/ts/rdb/generator.js +206 -0
  38. package/src/ts/rdb/generator.js.map +1 -0
  39. package/src/ts/rdb/schema.d.ts +17 -0
  40. package/src/ts/rdb/schema.json +73 -0
  41. package/src/ts/strands-agent/a2a-connection/generator.js +4 -8
  42. package/src/ts/strands-agent/a2a-connection/generator.js.map +1 -1
  43. package/src/ts/strands-agent/mcp-connection/generator.js +4 -8
  44. package/src/ts/strands-agent/mcp-connection/generator.js.map +1 -1
  45. package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_client.py.template +9 -3
  46. package/src/utils/agent-connection/files/py-core-runtime-config/runtime_config.py.template +3 -2
  47. package/src/utils/api-constructs/api-constructs.js +2 -10
  48. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  49. package/src/utils/api-constructs/open-api-metadata.js +2 -7
  50. package/src/utils/api-constructs/open-api-metadata.js.map +1 -1
  51. package/src/utils/function-constructs/function-constructs.js +2 -10
  52. package/src/utils/function-constructs/function-constructs.js.map +1 -1
  53. package/src/utils/nx.d.ts +14 -1
  54. package/src/utils/nx.js +27 -1
  55. package/src/utils/nx.js.map +1 -1
  56. package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +43 -0
  57. package/src/utils/rdb-constructs/files/cdk/core/rdb/aurora.ts.template +380 -0
  58. package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +732 -0
  59. package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +742 -0
  60. package/src/utils/rdb-constructs/rdb-constructs.d.ts +23 -0
  61. package/src/utils/rdb-constructs/rdb-constructs.js +59 -0
  62. package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -0
  63. package/src/utils/versions.d.ts +15 -3
  64. package/src/utils/versions.js +14 -2
  65. package/src/utils/versions.js.map +1 -1
  66. package/src/utils/website-constructs/website-constructs.js +2 -10
  67. package/src/utils/website-constructs/website-constructs.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"nx.js","sourceRoot":"","sources":["../../../../../packages/nx-plugin/src/utils/nx.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nx.js","sourceRoot":"","sources":["../../../../../packages/nx-plugin/src/utils/nx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import * as path from 'path';
2
+ import * as url from 'url';
3
+ import { Construct } from 'constructs';
4
+ import { DB_PACKAGE_NAME } from '<%= databasePackageAlias %>';
5
+ import {
6
+ AuroraDatabase,
7
+ AuroraDatabaseEngines,
8
+ AuroraDatabaseProps,
9
+ } from '../../core/rdb/aurora.js';
10
+ import { findWorkspaceRoot } from '../../core/workspace.js';
11
+
12
+ export type <%= nameClassName %>Props = Omit<
13
+ AuroraDatabaseProps,
14
+ | 'databaseName'
15
+ | 'adminUser'
16
+ | 'createDbUserBundleDir'
17
+ | 'engine'
18
+ | 'runtimeConfigKey'
19
+ | 'migrationBundleDir'
20
+ >;
21
+
22
+ /**
23
+ * CDK construct that provisions an Aurora Serverless v2 cluster.
24
+ */
25
+ export class <%= nameClassName %> extends AuroraDatabase {
26
+ constructor(scope: Construct, id: string, props: <%= nameClassName %>Props) {
27
+ super(scope, id, {
28
+ ...props,
29
+ databaseName: '<%= databaseName %>',
30
+ adminUser: '<%= adminUser %>',
31
+ runtimeConfigKey: DB_PACKAGE_NAME,
32
+ migrationBundleDir: path.join(
33
+ findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
34
+ '<%- migrationBundleDir %>',
35
+ ),
36
+ createDbUserBundleDir: path.join(
37
+ findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
38
+ '<%- createDbUserBundleDir %>',
39
+ ),
40
+ engine: AuroraDatabaseEngines.<%= engine %>({}),
41
+ });
42
+ }
43
+ }
@@ -0,0 +1,380 @@
1
+ import { CfnOutput, Duration, RemovalPolicy, Stack } from 'aws-cdk-lib';
2
+ import { CustomResource } from 'aws-cdk-lib';
3
+ import { IConnectable, IVpc, Port, SubnetType } from 'aws-cdk-lib/aws-ec2';
4
+ import { IGrantable, Role, ServicePrincipal } from 'aws-cdk-lib/aws-iam';
5
+ import { Key } from 'aws-cdk-lib/aws-kms';
6
+ import { Platform } from 'aws-cdk-lib/aws-ecr-assets';
7
+ import {
8
+ Architecture,
9
+ Code,
10
+ DockerImageCode,
11
+ DockerImageFunction,
12
+ Function,
13
+ Runtime,
14
+ Tracing,
15
+ } from 'aws-cdk-lib/aws-lambda';
16
+ import {
17
+ AuroraMysqlEngineVersion,
18
+ AuroraPostgresEngineVersion,
19
+ ClusterInstance,
20
+ Credentials,
21
+ DatabaseCluster,
22
+ DatabaseClusterEngine,
23
+ DatabaseClusterProps,
24
+ DatabaseProxy,
25
+ DefaultAuthScheme,
26
+ IClusterEngine,
27
+ } from 'aws-cdk-lib/aws-rds';
28
+ import { Provider } from 'aws-cdk-lib/custom-resources';
29
+ import { Trigger } from 'aws-cdk-lib/triggers';
30
+ import { Construct } from 'constructs';
31
+ import { RuntimeConfig } from '../runtime-config.js';
32
+
33
+ export type AuroraDatabaseEngineVersion =
34
+ | AuroraMysqlEngineVersion
35
+ | AuroraPostgresEngineVersion;
36
+
37
+ export interface AuroraDatabaseEngine {
38
+ /**
39
+ * Discriminant identifying the engine type.
40
+ */
41
+ readonly type: 'mysql' | 'postgres';
42
+
43
+ /**
44
+ * Default Aurora engine version used when one is not explicitly provided.
45
+ */
46
+ readonly defaultVersion: AuroraDatabaseEngineVersion;
47
+
48
+ /**
49
+ * Builds the CDK cluster engine for the provided engine version.
50
+ */
51
+ clusterEngine(version: AuroraDatabaseEngineVersion): IClusterEngine;
52
+ }
53
+
54
+ export class AuroraDatabaseEngines {
55
+ public static mysql({
56
+ defaultVersion = AuroraMysqlEngineVersion.VER_3_12_0,
57
+ }: {
58
+ defaultVersion?: AuroraMysqlEngineVersion;
59
+ }): AuroraDatabaseEngine {
60
+ return {
61
+ type: 'mysql',
62
+ defaultVersion,
63
+ clusterEngine: (version) =>
64
+ DatabaseClusterEngine.auroraMysql({
65
+ version: version as AuroraMysqlEngineVersion,
66
+ }),
67
+ };
68
+ }
69
+
70
+ public static postgres({
71
+ defaultVersion = AuroraPostgresEngineVersion.VER_17_7,
72
+ }: {
73
+ defaultVersion?: AuroraPostgresEngineVersion;
74
+ }): AuroraDatabaseEngine {
75
+ return {
76
+ type: 'postgres',
77
+ defaultVersion,
78
+ clusterEngine: (version) =>
79
+ DatabaseClusterEngine.auroraPostgres({
80
+ version: version as AuroraPostgresEngineVersion,
81
+ }),
82
+ };
83
+ }
84
+ }
85
+
86
+ type _AuroraDatabaseProps = Omit<
87
+ DatabaseClusterProps,
88
+ | 'credentials'
89
+ | 'defaultDatabaseName'
90
+ | 'engine'
91
+ | 'iamAuthentication'
92
+ | 'instanceProps'
93
+ | 'writer'
94
+ >;
95
+
96
+ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
97
+ /**
98
+ * VPC where the Aurora cluster will be deployed.
99
+ */
100
+ readonly vpc: IVpc;
101
+
102
+ /**
103
+ * Aurora engine preset used to build the cluster.
104
+ */
105
+ readonly engine: AuroraDatabaseEngine;
106
+
107
+ /**
108
+ * The engine version to deploy.
109
+ *
110
+ * @default - engine.defaultVersion
111
+ */
112
+ readonly engineVersion?: AuroraDatabaseEngineVersion;
113
+
114
+ /**
115
+ * Admin username used when generating credentials.
116
+ */
117
+ readonly adminUser: string;
118
+
119
+ /**
120
+ * The initial database created in the cluster.
121
+ */
122
+ readonly databaseName: string;
123
+
124
+ /**
125
+ * RuntimeConfig key used under the `database` namespace.
126
+ */
127
+ readonly runtimeConfigKey: string;
128
+
129
+ /**
130
+ * Migration bundle used to create a migration handler Lambda.
131
+ */
132
+ readonly migrationBundleDir: string;
133
+
134
+ /**
135
+ * Bundle used to create or reconcile the application database user.
136
+ */
137
+ readonly createDbUserBundleDir: string;
138
+
139
+ /**
140
+ * Writer instance for the Aurora cluster.
141
+ */
142
+ readonly writer?: DatabaseClusterProps['writer'];
143
+
144
+ /**
145
+ * Whether to provision an RDS Proxy in front of the Aurora cluster.
146
+ *
147
+ * @default true
148
+ */
149
+ readonly enableRdsProxy?: boolean;
150
+
151
+ /**
152
+ * Whether to enable automatic credential rotation for the admin secret.
153
+ *
154
+ * @default true
155
+ */
156
+ readonly enableCredentialRotation?: boolean;
157
+
158
+ /**
159
+ * Whether to enable deletion protection on the Aurora cluster.
160
+ *
161
+ * @default true
162
+ */
163
+ readonly deletionProtection?: boolean;
164
+
165
+ /**
166
+ * Removal policy applied to the Aurora cluster.
167
+ *
168
+ * @default RemovalPolicy.RETAIN
169
+ */
170
+ readonly removalPolicy?: RemovalPolicy;
171
+
172
+ /**
173
+ * Whether to enable automatic key rotation on the KMS key used to encrypt the Aurora cluster and its credentials secret.
174
+ *
175
+ * @default true
176
+ */
177
+ readonly enableKeyRotation?: boolean;
178
+ }
179
+
180
+ /**
181
+ * Reusable Aurora database construct that supports different Aurora engines
182
+ * through typed engine presets.
183
+ */
184
+ export abstract class AuroraDatabase extends Construct {
185
+ public readonly cluster: DatabaseCluster;
186
+ public readonly proxy?: DatabaseProxy;
187
+ private readonly adminUser: string;
188
+ private readonly dbUser: string;
189
+
190
+ constructor(
191
+ scope: Construct,
192
+ id: string,
193
+ {
194
+ vpc,
195
+ adminUser,
196
+ databaseName,
197
+ runtimeConfigKey,
198
+ migrationBundleDir,
199
+ createDbUserBundleDir,
200
+ vpcSubnets,
201
+ writer,
202
+ enableRdsProxy = true,
203
+ enableCredentialRotation = true,
204
+ deletionProtection = true,
205
+ removalPolicy = RemovalPolicy.RETAIN,
206
+ enableKeyRotation = true,
207
+ engine,
208
+ engineVersion,
209
+ ...clusterProps
210
+ }: AuroraDatabaseProps,
211
+ ) {
212
+ super(scope, id);
213
+
214
+ this.adminUser = adminUser;
215
+
216
+ const key = new Key(this, 'EncryptionKey', { enableKeyRotation });
217
+ this.cluster = new DatabaseCluster(this, 'DatabaseCluster', {
218
+ ...clusterProps,
219
+ vpc,
220
+ vpcSubnets,
221
+ engine: engine.clusterEngine(engineVersion ?? engine.defaultVersion),
222
+ writer: writer ?? ClusterInstance.serverlessV2('writer'),
223
+ credentials: Credentials.fromGeneratedSecret(adminUser, {
224
+ encryptionKey: key,
225
+ }),
226
+ iamAuthentication: true,
227
+ monitoringInterval: Duration.seconds(5),
228
+ defaultDatabaseName: databaseName,
229
+ storageEncrypted: true,
230
+ storageEncryptionKey: key,
231
+ deletionProtection,
232
+ removalPolicy,
233
+ });
234
+
235
+ if (enableCredentialRotation) {
236
+ this.cluster.addRotationSingleUser({
237
+ automaticallyAfter: Duration.days(30),
238
+ vpcSubnets: {
239
+ subnetType: SubnetType.PRIVATE_WITH_EGRESS,
240
+ },
241
+ });
242
+ }
243
+
244
+ const proxyRole = enableRdsProxy
245
+ ? new Role(this, 'DatabaseProxyRole', {
246
+ assumedBy: new ServicePrincipal('rds.amazonaws.com'),
247
+ })
248
+ : undefined;
249
+
250
+ if (enableRdsProxy) {
251
+ this.proxy = this.cluster.addProxy('DatabaseProxy', {
252
+ vpc,
253
+ vpcSubnets,
254
+ defaultAuthScheme: DefaultAuthScheme.IAM_AUTH,
255
+ role: proxyRole,
256
+ });
257
+ }
258
+
259
+ const databaseHostname =
260
+ this.proxy?.endpoint ?? this.cluster.clusterEndpoint.hostname;
261
+ const databasePort = this.cluster.clusterEndpoint.port;
262
+
263
+ const createDbUserHandler = new Function(this, 'CreateDbUserHandler', {
264
+ code: Code.fromAsset(createDbUserBundleDir),
265
+ handler: 'index.handler',
266
+ runtime: Runtime.NODEJS_LATEST,
267
+ timeout: Duration.minutes(5),
268
+ tracing: Tracing.ACTIVE,
269
+ vpc,
270
+ vpcSubnets: {
271
+ subnetType: SubnetType.PRIVATE_WITH_EGRESS,
272
+ },
273
+ environment: {
274
+ DATABASE_SECRET_ARN: this.cluster.secret!.secretArn,
275
+ NODE_EXTRA_CA_CERTS: '/var/runtime/ca-cert.pem',
276
+ },
277
+ architecture: Architecture.ARM_64,
278
+ });
279
+
280
+ this.cluster.connections.allowDefaultPortFrom(
281
+ createDbUserHandler,
282
+ 'Allow the create-db-user handler to connect to the database',
283
+ );
284
+ this.grantSecretRead(createDbUserHandler);
285
+
286
+ const createDbUserProvider = new Provider(this, 'CreateDbUserProvider', {
287
+ onEventHandler: createDbUserHandler,
288
+ });
289
+
290
+ const createDbUserResource = new CustomResource(
291
+ this,
292
+ 'CreateDbUserResource',
293
+ {
294
+ serviceToken: createDbUserProvider.serviceToken,
295
+ properties: {
296
+ clusterIdentifier: this.cluster.clusterIdentifier,
297
+ },
298
+ },
299
+ );
300
+ createDbUserResource.node.addDependency(this.cluster);
301
+ this.dbUser = createDbUserResource.getAttString('dbUser');
302
+ if (this.proxy && proxyRole) {
303
+ this.cluster.grantConnect(proxyRole, this.dbUser);
304
+ }
305
+
306
+ const rc = RuntimeConfig.ensure(this);
307
+ rc.set('database', runtimeConfigKey, {
308
+ hostname: databaseHostname,
309
+ port: databasePort,
310
+ database: databaseName,
311
+ adminUser: this.adminUser,
312
+ dbUser: this.dbUser,
313
+ region: Stack.of(this).region,
314
+ });
315
+
316
+ const migrationHandler = new DockerImageFunction(this, 'MigrationHandler', {
317
+ code: DockerImageCode.fromImageAsset(migrationBundleDir, {
318
+ platform: Platform.LINUX_ARM64,
319
+ }),
320
+ memorySize: 1024,
321
+ timeout: Duration.minutes(5),
322
+ tracing: Tracing.ACTIVE,
323
+ vpc,
324
+ environment: engine.type === 'mysql' ? {
325
+ DATABASE_SECRET_ARN: this.cluster.secret!.secretArn,
326
+ } : {
327
+ HOSTNAME: databaseHostname,
328
+ DATABASE: databaseName,
329
+ PORT: databasePort.toString(),
330
+ DBUSER: this.dbUser,
331
+ },
332
+ architecture: Architecture.ARM_64,
333
+ });
334
+
335
+ if (engine.type === 'mysql') {
336
+ this.cluster.connections.allowDefaultPortFrom(migrationHandler);
337
+ this.grantSecretRead(migrationHandler);
338
+ } else {
339
+ this.allowDefaultPortFrom(migrationHandler);
340
+ this.grantConnect(migrationHandler);
341
+ }
342
+
343
+ const trigger = new Trigger(this, 'MigrationTrigger', {
344
+ handler: migrationHandler,
345
+ });
346
+ trigger.node.addDependency(createDbUserResource);
347
+
348
+ new CfnOutput(this, 'ClusterEndpoint', {
349
+ value: this.cluster.clusterEndpoint.hostname,
350
+ });
351
+
352
+ if (this.proxy?.endpoint) {
353
+ new CfnOutput(this, 'ProxyEndpoint', {
354
+ value: this.proxy?.endpoint,
355
+ });
356
+ }
357
+ }
358
+
359
+ public allowDefaultPortFrom(other: IConnectable, description?: string): void {
360
+ if (this.proxy) {
361
+ this.proxy.connections.allowFrom(
362
+ other,
363
+ Port.tcp(this.cluster.clusterEndpoint.port),
364
+ description,
365
+ );
366
+ } else {
367
+ this.cluster.connections.allowDefaultPortFrom(other, description);
368
+ }
369
+ }
370
+
371
+ public grantSecretRead(grantee: IGrantable) {
372
+ return this.cluster.secret!.grantRead(grantee);
373
+ }
374
+
375
+ public grantConnect(grantee: IGrantable) {
376
+ return this.proxy
377
+ ? this.proxy.grantConnect(grantee, this.dbUser)
378
+ : this.cluster.grantConnect(grantee, this.dbUser);
379
+ }
380
+ }