@aws/nx-plugin 1.0.0-rc.15 → 1.0.0-rc.17

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 (26) hide show
  1. package/package.json +1 -1
  2. package/src/py/fast-api/__snapshots__/generator.spec.ts.snap +122 -14
  3. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +122 -14
  4. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +74 -322
  5. package/src/ts/rdb/files/config.json.template +14 -0
  6. package/src/ts/rdb/files/prisma.config.ts.template +5 -4
  7. package/src/ts/rdb/files/src/index.ts.template +0 -1
  8. package/src/ts/rdb/files/src/prisma.ts.template +26 -21
  9. package/src/ts/rdb/generator.d.ts +0 -4
  10. package/src/ts/rdb/generator.js +15 -7
  11. package/src/ts/rdb/generator.js.map +1 -1
  12. package/src/utils/api-constructs/files/cdk/core/api/utils/utils.ts.template +61 -7
  13. package/src/utils/files/common/scripts/src/rdb/pull-image.ts.template +16 -0
  14. package/src/utils/files/common/scripts/src/rdb/start-container.ts.template +102 -0
  15. package/src/utils/files/common/scripts/src/rdb/wait-for-db.ts.template +59 -0
  16. package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +12 -2
  17. package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +6 -4
  18. package/src/utils/rdb-constructs/rdb-constructs.d.ts +1 -0
  19. package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
  20. package/src/utils/shared-rdb-scripts.d.ts +11 -0
  21. package/src/utils/shared-rdb-scripts.js +20 -0
  22. package/src/utils/shared-rdb-scripts.js.map +1 -0
  23. package/src/ts/rdb/files/scripts/pull-image.ts.template +0 -15
  24. package/src/ts/rdb/files/scripts/start-container.ts.template +0 -84
  25. package/src/ts/rdb/files/scripts/wait-for-db.ts.template +0 -55
  26. package/src/ts/rdb/files/src/constants.ts.template +0 -8
@@ -6,6 +6,7 @@ const tslib_1 = require("tslib");
6
6
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
7
7
  * SPDX-License-Identifier: Apache-2.0
8
8
  */
9
+ const node_path_1 = require("node:path");
9
10
  const devkit_1 = require("@nx/devkit");
10
11
  const bundle_1 = require("../../utils/bundle/bundle");
11
12
  const containers_1 = require("../../utils/containers");
@@ -22,6 +23,8 @@ const pnpm_workspace_1 = require("../../utils/pnpm-workspace");
22
23
  const port_1 = require("../../utils/port");
23
24
  const rdb_constructs_1 = require("../../utils/rdb-constructs/rdb-constructs");
24
25
  const shared_constructs_1 = require("../../utils/shared-constructs");
26
+ const shared_constructs_constants_1 = require("../../utils/shared-constructs-constants");
27
+ const shared_rdb_scripts_1 = require("../../utils/shared-rdb-scripts");
25
28
  const versions_1 = require("../../utils/versions");
26
29
  const generator_1 = tslib_1.__importStar(require("../lib/generator"));
27
30
  exports.TS_RDB_GENERATOR_INFO = (0, nx_1.getGeneratorInfo)(__filename);
@@ -59,6 +62,10 @@ const tsRdbGenerator = async (tree, options) => {
59
62
  const localDbHost = 'localhost';
60
63
  const localDbUser = options.engine === 'mysql' ? 'root' : 'dbadmin';
61
64
  const localDbPassword = 'password';
65
+ const containerName = `${(0, npm_scope_1.getNpmScope)(tree)}-${databaseName}`;
66
+ const dockerImage = options.engine === 'mysql'
67
+ ? 'public.ecr.aws/docker/library/mysql:8.0.44'
68
+ : 'public.ecr.aws/docker/library/postgres:17.7';
62
69
  const templateOptions = {
63
70
  engine: options.engine,
64
71
  runtimeConfigKey: nameClassName,
@@ -75,9 +82,13 @@ const tsRdbGenerator = async (tree, options) => {
75
82
  localDbUser,
76
83
  localDbPassword,
77
84
  containerEngine,
85
+ containerName,
86
+ dockerImage,
78
87
  };
79
88
  (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files'), dir, templateOptions);
80
89
  (0, git_1.updateGitIgnore)(tree, dir, (patterns) => [...patterns, 'generated/prisma']);
90
+ await (0, shared_rdb_scripts_1.sharedRdbScriptsGenerator)(tree);
91
+ const scriptsDir = (0, node_path_1.relative)(dir, (0, devkit_1.joinPathFragments)(shared_constructs_constants_1.PACKAGES_DIR, shared_constructs_constants_1.SHARED_SCRIPTS_DIR, 'src', 'rdb'));
81
92
  const relativePathToRoot = (0, paths_1.getRelativePathToRootByDirectory)(projectConfig.root);
82
93
  const fs = new fs_1.FsCommands(tree);
83
94
  const migrationBundleDir = (0, devkit_1.joinPathFragments)('dist', projectConfig.root, 'bundle', 'migration');
@@ -120,21 +131,17 @@ const tsRdbGenerator = async (tree, options) => {
120
131
  cwd: '{projectRoot}',
121
132
  },
122
133
  };
123
- const containerName = `${(0, npm_scope_1.getNpmScope)(tree)}-${databaseName}`;
124
- const dockerImage = options.engine === 'mysql'
125
- ? 'public.ecr.aws/docker/library/mysql:8.0.44'
126
- : 'public.ecr.aws/docker/library/postgres:17.7';
127
134
  projectConfig.targets['pull-image'] = {
128
135
  executor: 'nx:run-commands',
129
136
  options: {
130
- command: `tsx scripts/pull-image.ts ${dockerImage}`,
137
+ command: `tsx ${scriptsDir}/pull-image.ts`,
131
138
  cwd: '{projectRoot}',
132
139
  },
133
140
  };
134
141
  projectConfig.targets['serve-local'] = {
135
142
  executor: 'nx:run-commands',
136
143
  options: {
137
- command: `tsx scripts/start-container.ts ${containerName} ${dockerImage} ${localDbPort} ${databaseName}${options.engine === 'mysql' ? '' : ` ${localDbUser}`} ${localDbPassword}`,
144
+ command: `tsx ${scriptsDir}/start-container.ts`,
138
145
  cwd: '{projectRoot}',
139
146
  },
140
147
  continuous: true,
@@ -144,7 +151,7 @@ const tsRdbGenerator = async (tree, options) => {
144
151
  executor: 'nx:run-commands',
145
152
  dependsOn: ['serve-local'],
146
153
  options: {
147
- command: `tsx scripts/wait-for-db.ts ${localDbPort} ${databaseName} ${localDbUser} ${localDbPassword}`,
154
+ command: `tsx ${scriptsDir}/wait-for-db.ts`,
148
155
  cwd: '{projectRoot}',
149
156
  },
150
157
  };
@@ -185,6 +192,7 @@ const tsRdbGenerator = async (tree, options) => {
185
192
  await (0, rdb_constructs_1.addRdbInfra)(tree, {
186
193
  iac,
187
194
  projectName: fullyQualifiedName,
195
+ projectRoot: dir,
188
196
  nameClassName,
189
197
  nameKebabCase,
190
198
  databasePackageAlias: (0, npm_scope_1.toScopeAlias)(fullyQualifiedName),
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/ts/rdb/generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/ts/rdb/generator.ts"],"names":[],"mappings":"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"}
@@ -148,6 +148,8 @@ export type ApiIntegrations<TOperation extends string, TBaseIntegration> =
148
148
  * @template TDefaultIntegrationProps - Type for default integration properties
149
149
  * @template TDefaultIntegration - Type for default integration implementation
150
150
  * @template TPattern - The integration pattern ('shared' or 'isolated')
151
+ * @template TOverridden - Union of operation names that have been overridden
152
+ * @template TOperationOptioned - Union of operation names with per-operation options
151
153
  */
152
154
  export class IntegrationBuilder<
153
155
  TOperation extends string,
@@ -156,6 +158,8 @@ export class IntegrationBuilder<
156
158
  TDefaultIntegrationProps extends object,
157
159
  TDefaultIntegration extends TBaseIntegration,
158
160
  TPattern extends 'shared' | 'isolated',
161
+ TOverridden extends string = never,
162
+ TOperationOptioned extends string = never,
159
163
  > {
160
164
  /** Options for the integration builder */
161
165
  private options: IntegrationBuilderProps<
@@ -168,6 +172,11 @@ export class IntegrationBuilder<
168
172
  /** Map of operation names to their custom integrations */
169
173
  private integrations: Partial<TIntegrations> = {};
170
174
 
175
+ /** Map of default integration keys to per-operation default option overrides */
176
+ private perOperationOptions: Partial<
177
+ Record<string, Partial<TDefaultIntegrationProps>>
178
+ > = {};
179
+
171
180
  /**
172
181
  * Create an Integration Builder for an HTTP API with a shared pattern
173
182
  */
@@ -322,11 +331,16 @@ export class IntegrationBuilder<
322
331
  /**
323
332
  * Overrides default integrations with custom implementations for specific operations.
324
333
  *
334
+ * Operations which have per-operation options set via withOperationOptions cannot be
335
+ * overridden, since these still use the default integration.
336
+ *
325
337
  * @param overrides - Map of operation names to their custom integration implementations
326
338
  * @returns The builder instance with updated type information reflecting the overrides
327
339
  */
328
340
  public withOverrides<
329
- TOverrideIntegrations extends Partial<Record<TOperation, TBaseIntegration>>,
341
+ TOverrideIntegrations extends Partial<
342
+ Record<Exclude<TOperation, TOperationOptioned>, TBaseIntegration>
343
+ >,
330
344
  >(overrides: TOverrideIntegrations) {
331
345
  this.integrations = { ...this.integrations, ...overrides };
332
346
  // Re-type to include the overridden integration types.
@@ -342,7 +356,9 @@ export class IntegrationBuilder<
342
356
  MergedIntegrations,
343
357
  TDefaultIntegrationProps,
344
358
  TDefaultIntegration,
345
- TPattern
359
+ TPattern,
360
+ TOverridden | Extract<keyof TOverrideIntegrations, string>,
361
+ TOperationOptioned
346
362
  >;
347
363
  }
348
364
 
@@ -361,6 +377,43 @@ export class IntegrationBuilder<
361
377
  return this;
362
378
  }
363
379
 
380
+ /**
381
+ * Updates the default integration options for specific operations, without
382
+ * affecting the others. The given options are merged with the defaults (and
383
+ * any options set via withDefaultOptions) when building each default integration.
384
+ *
385
+ * Operations which have been replaced via withOverrides cannot be targeted, since
386
+ * they no longer use the default integration.
387
+ *
388
+ * @param options - Map of operation names to partial default integration options
389
+ * @returns The builder instance
390
+ */
391
+ public withOperationOptions<
392
+ TOptions extends Partial<
393
+ Record<
394
+ Exclude<DefaultIntegrationKeys<TPattern, TOperation>, TOverridden>,
395
+ Partial<TDefaultIntegrationProps>
396
+ >
397
+ >,
398
+ >(options: TOptions) {
399
+ Object.entries(options).forEach(([op, opOptions]) => {
400
+ this.perOperationOptions[op] = {
401
+ ...this.perOperationOptions[op],
402
+ ...(opOptions as Partial<TDefaultIntegrationProps>),
403
+ };
404
+ });
405
+ return this as unknown as IntegrationBuilder<
406
+ TOperation,
407
+ TBaseIntegration,
408
+ TIntegrations,
409
+ TDefaultIntegrationProps,
410
+ TDefaultIntegration,
411
+ TPattern,
412
+ TOverridden,
413
+ TOperationOptioned | Extract<keyof TOptions, string>
414
+ >;
415
+ }
416
+
364
417
  /**
365
418
  * Builds and returns the complete set of integrations.
366
419
  *
@@ -375,6 +428,10 @@ export class IntegrationBuilder<
375
428
  */
376
429
  public build(): TIntegrations {
377
430
  const options = this.options;
431
+ const buildOptionsFor = (op: string): TDefaultIntegrationProps => ({
432
+ ...options.defaultIntegrationOptions,
433
+ ...this.perOperationOptions[op],
434
+ });
378
435
  return {
379
436
  ...Object.fromEntries(
380
437
  options.pattern === 'shared'
@@ -383,7 +440,7 @@ export class IntegrationBuilder<
383
440
  '$router',
384
441
  options.buildDefaultIntegration(
385
442
  '$router',
386
- options.defaultIntegrationOptions,
443
+ buildOptionsFor('$router'),
387
444
  ),
388
445
  ],
389
446
  ]
@@ -394,10 +451,7 @@ export class IntegrationBuilder<
394
451
  )
395
452
  .map((op) => [
396
453
  op,
397
- options.buildDefaultIntegration(
398
- op,
399
- options.defaultIntegrationOptions,
400
- ),
454
+ options.buildDefaultIntegration(op, buildOptionsFor(op)),
401
455
  ]),
402
456
  ),
403
457
  ...this.integrations,
@@ -0,0 +1,16 @@
1
+ import { spawnSync } from 'child_process';
2
+ import { readFileSync } from 'fs';
3
+
4
+ const { containerEngine, image } =
5
+ JSON.parse(readFileSync('config.json', 'utf-8')).serveLocal;
6
+
7
+ const inspect = spawnSync(containerEngine, ['image', 'inspect', image], {
8
+ stdio: 'ignore',
9
+ });
10
+
11
+ if (inspect.status !== 0) {
12
+ const pull = spawnSync(containerEngine, ['pull', image], { stdio: 'inherit' });
13
+ if (pull.status !== 0) {
14
+ process.exit(pull.status ?? 1);
15
+ }
16
+ }
@@ -0,0 +1,102 @@
1
+ import { spawn, spawnSync } from "child_process";
2
+ import { readFileSync } from "fs";
3
+
4
+ const {
5
+ containerEngine,
6
+ containerName,
7
+ image,
8
+ port,
9
+ dbName,
10
+ dbUser,
11
+ dbPassword,
12
+ dbEngine,
13
+ } = JSON.parse(readFileSync("config.json", "utf-8")).serveLocal;
14
+
15
+ const containerExists = (): boolean =>
16
+ spawnSync(containerEngine, ["container", "inspect", containerName], {
17
+ stdio: "ignore",
18
+ }).status === 0;
19
+
20
+ const isRunning = (): boolean => {
21
+ const result = spawnSync(
22
+ containerEngine,
23
+ ["container", "inspect", "-f", "{{.State.Running}}", containerName],
24
+ { encoding: "utf-8" },
25
+ );
26
+ return result.status === 0 && result.stdout.trim() === "true";
27
+ };
28
+
29
+ if (containerExists()) {
30
+ if (!isRunning()) {
31
+ const start = spawnSync(containerEngine, ["start", containerName], {
32
+ stdio: "inherit",
33
+ });
34
+ if (start.status !== 0) process.exit(start.status ?? 1);
35
+ }
36
+ } else {
37
+ const engineArgs =
38
+ dbEngine === "mysql"
39
+ ? [
40
+ "-v",
41
+ `${containerName}-data:/var/lib/mysql`,
42
+ "-e",
43
+ `MYSQL_DATABASE=${dbName}`,
44
+ "-e",
45
+ `MYSQL_ROOT_PASSWORD=${dbPassword}`,
46
+ "-p",
47
+ `${port}:3306`,
48
+ ]
49
+ : [
50
+ "-v",
51
+ `${containerName}-data:/var/lib/postgresql`,
52
+ "-e",
53
+ `POSTGRES_DB=${dbName}`,
54
+ "-e",
55
+ `POSTGRES_USER=${dbUser}`,
56
+ "-e",
57
+ `POSTGRES_PASSWORD=${dbPassword}`,
58
+ "-e",
59
+ "PGDATA=/var/lib/postgresql/17/docker",
60
+ "-p",
61
+ `${port}:5432`,
62
+ ];
63
+ const runArgs = [
64
+ "run",
65
+ ...(containerEngine === "docker" ? ["--rm"] : []),
66
+ "--name",
67
+ containerName,
68
+ "-d",
69
+ ...engineArgs,
70
+ image,
71
+ ];
72
+ const create = spawnSync(containerEngine, runArgs, { stdio: "inherit" });
73
+ if (create.status !== 0) process.exit(create.status ?? 1);
74
+ }
75
+
76
+ const logs = spawn(containerEngine, ["logs", "-f", containerName], {
77
+ stdio: ["ignore", "inherit", "inherit"],
78
+ });
79
+
80
+ let exiting = false;
81
+
82
+ const cleanup = () => {
83
+ if (exiting) return;
84
+ exiting = true;
85
+ if (containerEngine === "docker") {
86
+ spawnSync(containerEngine, ["stop", containerName], { stdio: "ignore" });
87
+ } else {
88
+ spawnSync(containerEngine, ["rm", "-f", containerName], {
89
+ stdio: "ignore",
90
+ });
91
+ }
92
+ logs.kill();
93
+ process.exit(0);
94
+ };
95
+
96
+ process.on("SIGTERM", cleanup);
97
+ process.on("SIGINT", cleanup);
98
+ process.on("SIGHUP", cleanup);
99
+
100
+ logs.on("exit", (code) => {
101
+ if (!exiting) process.exit(code ?? 0);
102
+ });
@@ -0,0 +1,59 @@
1
+ import { readFileSync } from 'fs';
2
+
3
+ const { port, dbName, dbUser, dbPassword, dbEngine } =
4
+ JSON.parse(readFileSync('config.json', 'utf-8')).serveLocal;
5
+
6
+ const noop = () => undefined;
7
+ const timeoutAt = Date.now() + 60000;
8
+
9
+ if (dbEngine === 'mysql') {
10
+ // @ts-ignore - mariadb is only installed for mysql engine
11
+ const { createConnection } = await import('mariadb');
12
+ while (Date.now() < timeoutAt) {
13
+ let conn: Awaited<ReturnType<typeof createConnection>> | undefined;
14
+ try {
15
+ conn = await createConnection({
16
+ host: 'localhost',
17
+ port: parseInt(port),
18
+ user: dbUser,
19
+ password: dbPassword,
20
+ database: dbName,
21
+ connectTimeout: 500,
22
+ allowPublicKeyRetrieval: true,
23
+ });
24
+ await conn.end();
25
+ console.log('Database is ready.');
26
+ process.exit(0);
27
+ } catch {
28
+ console.log('Database is not ready.');
29
+ await conn?.end().catch(noop);
30
+ }
31
+ await new Promise((r) => setTimeout(r, 200));
32
+ }
33
+ } else {
34
+ // @ts-ignore - pg is only installed for pg engine
35
+ const { Client } = await import('pg');
36
+ while (Date.now() < timeoutAt) {
37
+ const client = new Client({
38
+ host: 'localhost',
39
+ port: parseInt(port),
40
+ user: dbUser,
41
+ password: dbPassword,
42
+ database: dbName,
43
+ connectionTimeoutMillis: 500,
44
+ });
45
+ client.on('error', noop);
46
+ try {
47
+ await client.connect();
48
+ await client.end();
49
+ console.log('Database is ready.');
50
+ process.exit(0);
51
+ } catch {
52
+ console.log('Database is not ready.');
53
+ await client.end().catch(noop);
54
+ }
55
+ await new Promise((r) => setTimeout(r, 200));
56
+ }
57
+ }
58
+
59
+ throw new Error(`Timed out waiting for ${dbEngine} on port ${port}`);
@@ -1,7 +1,7 @@
1
1
  import * as path from 'path';
2
2
  import * as url from 'url';
3
+ import { readFileSync } from 'fs';
3
4
  import { Construct } from 'constructs';
4
- import { DB_PACKAGE_NAME } from '<%= databasePackageAlias %>';
5
5
  import {
6
6
  AuroraDatabase,
7
7
  AuroraDatabaseEngines,
@@ -9,6 +9,16 @@ import {
9
9
  } from '../../core/rdb/aurora.js';
10
10
  import { findWorkspaceRoot } from '../../core/workspace.js';
11
11
 
12
+ const { runtimeConfigKey } = JSON.parse(
13
+ readFileSync(
14
+ path.join(
15
+ findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
16
+ '<%= projectRoot %>/config.json',
17
+ ),
18
+ 'utf-8',
19
+ ),
20
+ ) as { runtimeConfigKey: string };
21
+
12
22
  export type <%= nameClassName %>Props = Omit<
13
23
  AuroraDatabaseProps,
14
24
  | 'databaseName'
@@ -28,7 +38,7 @@ export class <%= nameClassName %> extends AuroraDatabase {
28
38
  ...props,
29
39
  databaseName: '<%= databaseName %>',
30
40
  adminUser: '<%= adminUser %>',
31
- runtimeConfigKey: DB_PACKAGE_NAME,
41
+ runtimeConfigKey,
32
42
  migrationBundleDir: path.join(
33
43
  findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
34
44
  '<%- migrationBundleDir %>',
@@ -141,10 +141,12 @@ resource "random_string" "suffix" {
141
141
  }
142
142
 
143
143
  locals {
144
- create_db_user_bundle_path = "${path.module}/../../../../../../../<%- createDbUserBundleDir %>"
145
- migration_function_name = "<%= nameKebabCase %>-migration-${random_string.suffix.result}"
144
+ config = jsondecode(file("${path.module}/../../../../../../../<%= projectRoot %>/config.json"))
145
+ runtime_config_key = local.config.runtimeConfigKey
146
+ create_db_user_bundle_path = "${path.module}/../../../../../../../<%- createDbUserBundleDir %>"
147
+ migration_function_name = "<%= nameKebabCase %>-migration-${random_string.suffix.result}"
146
148
  create_db_user_function_name = "<%= nameKebabCase %>-create-db-user-${random_string.suffix.result}"
147
- database_runtime_user = "db_${random_string.suffix.result}"
149
+ database_runtime_user = "db_${random_string.suffix.result}"
148
150
  }
149
151
 
150
152
  module "aurora" {
@@ -210,7 +212,7 @@ module "add_rdb_to_runtime_config" {
210
212
  source = "../../../core/runtime-config/entry"
211
213
 
212
214
  namespace = "database"
213
- key = "<%= nameClassName %>"
215
+ key = local.runtime_config_key
214
216
  value = {
215
217
  hostname = module.aurora.cluster_endpoint
216
218
  port = module.aurora.cluster_port
@@ -7,6 +7,7 @@ import type { Containers } from '../containers';
7
7
  import type { Iac } from '../iac';
8
8
  export interface AddRdbConstructOptions {
9
9
  projectName: string;
10
+ projectRoot: string;
10
11
  nameClassName: string;
11
12
  nameKebabCase: string;
12
13
  databasePackageAlias: string;
@@ -1 +1 @@
1
- {"version":3,"file":"rdb-constructs.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/utils/rdb-constructs/rdb-constructs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rdb-constructs.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/utils/rdb-constructs/rdb-constructs.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
+ import { type Tree } from '@nx/devkit';
6
+ /**
7
+ * Ensures the shared scripts package exists and adds RDB local-dev scripts
8
+ * to packages/common/scripts/src/rdb/. Used by ts#rdb. Scripts read all
9
+ * config at runtime from config.json so a single set serves all database engines.
10
+ */
11
+ export declare function sharedRdbScriptsGenerator(tree: Tree): Promise<void>;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sharedRdbScriptsGenerator = sharedRdbScriptsGenerator;
4
+ /**
5
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
6
+ * SPDX-License-Identifier: Apache-2.0
7
+ */
8
+ const devkit_1 = require("@nx/devkit");
9
+ const shared_constructs_constants_1 = require("./shared-constructs-constants");
10
+ const shared_scripts_1 = require("./shared-scripts");
11
+ /**
12
+ * Ensures the shared scripts package exists and adds RDB local-dev scripts
13
+ * to packages/common/scripts/src/rdb/. Used by ts#rdb. Scripts read all
14
+ * config at runtime from config.json so a single set serves all database engines.
15
+ */
16
+ async function sharedRdbScriptsGenerator(tree) {
17
+ await (0, shared_scripts_1.ensureSharedScriptsProject)(tree);
18
+ (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files', shared_constructs_constants_1.SHARED_SCRIPTS_DIR, 'src', 'rdb'), (0, devkit_1.joinPathFragments)(shared_constructs_constants_1.PACKAGES_DIR, shared_constructs_constants_1.SHARED_SCRIPTS_DIR, 'src', 'rdb'), {}, { overwriteStrategy: devkit_1.OverwriteStrategy.KeepExisting });
19
+ }
20
+ //# sourceMappingURL=shared-rdb-scripts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-rdb-scripts.js","sourceRoot":"","sources":["../../../../../packages/nx-plugin/src/utils/shared-rdb-scripts.ts"],"names":[],"mappings":";;AAqBA,8DAUC;AA/BD;;;GAGG;AACH,uCAKoB;AACpB,+EAGuC;AACvC,qDAA8D;AAE9D;;;;GAIG;AACI,KAAK,UAAU,yBAAyB,CAAC,IAAU;IACxD,MAAM,IAAA,2CAA0B,EAAC,IAAI,CAAC,CAAC;IAEvC,IAAA,sBAAa,EACX,IAAI,EACJ,IAAA,0BAAiB,EAAC,SAAS,EAAE,OAAO,EAAE,gDAAkB,EAAE,KAAK,EAAE,KAAK,CAAC,EACvE,IAAA,0BAAiB,EAAC,0CAAY,EAAE,gDAAkB,EAAE,KAAK,EAAE,KAAK,CAAC,EACjE,EAAE,EACF,EAAE,iBAAiB,EAAE,0BAAiB,CAAC,YAAY,EAAE,CACtD,CAAC;AACJ,CAAC"}
@@ -1,15 +0,0 @@
1
- import { spawnSync } from 'child_process';
2
-
3
- const ENGINE = '<%= containerEngine %>';
4
- const image = process.argv[2];
5
-
6
- const inspect = spawnSync(ENGINE, ['image', 'inspect', image], {
7
- stdio: 'ignore',
8
- });
9
-
10
- if (inspect.status !== 0) {
11
- const pull = spawnSync(ENGINE, ['pull', image], { stdio: 'inherit' });
12
- if (pull.status !== 0) {
13
- process.exit(pull.status ?? 1);
14
- }
15
- }
@@ -1,84 +0,0 @@
1
- import { spawn, spawnSync } from 'child_process';
2
-
3
- const ENGINE = '<%= containerEngine %>';
4
-
5
- <%_ if (engine === 'mysql') { _%>
6
- const [containerName, image, hostPort, dbName, dbPassword] =
7
- process.argv.slice(2);
8
- <%_ } else { _%>
9
- const [containerName, image, hostPort, dbName, dbUser, dbPassword] =
10
- process.argv.slice(2);
11
- <%_ } _%>
12
-
13
- const containerExists = (): boolean =>
14
- spawnSync(ENGINE, ['container', 'inspect', containerName], {
15
- stdio: 'ignore',
16
- }).status === 0;
17
-
18
- const isRunning = (): boolean => {
19
- const result = spawnSync(
20
- ENGINE,
21
- ['container', 'inspect', '-f', '{{.State.Running}}', containerName],
22
- { encoding: 'utf-8' },
23
- );
24
- return result.status === 0 && result.stdout.trim() === 'true';
25
- };
26
-
27
- if (containerExists()) {
28
- if (!isRunning()) {
29
- const start = spawnSync(ENGINE, ['start', containerName], {
30
- stdio: 'inherit',
31
- });
32
- if (start.status !== 0) process.exit(start.status ?? 1);
33
- }
34
- } else {
35
- <%_ if (engine === 'mysql') { _%>
36
- const runArgs = (
37
- `run <%- containerEngine === 'docker' ? '--rm ' : '' %>--name ${containerName}` +
38
- ` -e MYSQL_DATABASE=${dbName}` +
39
- ` -e MYSQL_ROOT_PASSWORD=${dbPassword}` +
40
- ` -p ${hostPort}:3306` +
41
- ` -v ${containerName}-data:/var/lib/mysql` +
42
- ` -d ${image}`
43
- ).split(' ');
44
- <%_ } else { _%>
45
- const runArgs = (
46
- `run <%- containerEngine === 'docker' ? '--rm ' : '' %>--name ${containerName}` +
47
- ` -e POSTGRES_DB=${dbName}` +
48
- ` -e POSTGRES_USER=${dbUser}` +
49
- ` -e POSTGRES_PASSWORD=${dbPassword}` +
50
- ` -e PGDATA=/var/lib/postgresql/17/docker` +
51
- ` -p ${hostPort}:5432` +
52
- ` -v ${containerName}-data:/var/lib/postgresql` +
53
- ` -d ${image}`
54
- ).split(' ');
55
- <%_ } _%>
56
- const create = spawnSync(ENGINE, runArgs, { stdio: 'inherit' });
57
- if (create.status !== 0) process.exit(create.status ?? 1);
58
- }
59
-
60
- const logs = spawn(ENGINE, ['logs', '-f', containerName], {
61
- stdio: ['ignore', 'inherit', 'inherit'],
62
- });
63
-
64
- let exiting = false;
65
-
66
- const cleanup = () => {
67
- if (exiting) return;
68
- exiting = true;
69
- <%_ if (containerEngine === 'docker') { _%>
70
- spawnSync(ENGINE, ['stop', containerName], { stdio: 'ignore' });
71
- <%_ } else { _%>
72
- spawnSync(ENGINE, ['rm', '-f', containerName], { stdio: 'ignore' });
73
- <%_ } _%>
74
- logs.kill();
75
- process.exit(0);
76
- };
77
-
78
- process.on('SIGTERM', cleanup);
79
- process.on('SIGINT', cleanup);
80
- process.on('SIGHUP', cleanup);
81
-
82
- logs.on('exit', (code) => {
83
- if (!exiting) process.exit(code ?? 0);
84
- });