@rxap/plugin-nestjs 16.1.0-dev.4 → 16.1.0-dev.41

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 (112) hide show
  1. package/CHANGELOG.md +361 -0
  2. package/README.md +155 -1
  3. package/generators.json +112 -0
  4. package/package.json +59 -41
  5. package/src/generators/feature-microservice/generator.d.ts +4 -0
  6. package/src/generators/feature-microservice/generator.js +17 -0
  7. package/src/generators/feature-microservice/generator.js.map +1 -0
  8. package/src/generators/feature-microservice/index.d.ts +2 -0
  9. package/src/generators/feature-microservice/index.js +7 -0
  10. package/src/generators/feature-microservice/index.js.map +1 -0
  11. package/src/generators/feature-microservice/schema.d.ts +5 -0
  12. package/src/generators/feature-microservice/schema.json +23 -0
  13. package/src/generators/frontend-microservice/generator.d.ts +4 -0
  14. package/src/generators/frontend-microservice/generator.js +17 -0
  15. package/src/generators/frontend-microservice/generator.js.map +1 -0
  16. package/src/generators/frontend-microservice/index.d.ts +2 -0
  17. package/src/generators/frontend-microservice/index.js +7 -0
  18. package/src/generators/frontend-microservice/index.js.map +1 -0
  19. package/src/generators/frontend-microservice/schema.d.ts +6 -0
  20. package/src/generators/frontend-microservice/schema.json +29 -0
  21. package/src/generators/health-indicator/generator.d.ts +4 -0
  22. package/src/generators/health-indicator/generator.js +31 -0
  23. package/src/generators/health-indicator/generator.js.map +1 -0
  24. package/src/generators/health-indicator/index.d.ts +2 -0
  25. package/src/generators/health-indicator/index.js +7 -0
  26. package/src/generators/health-indicator/index.js.map +1 -0
  27. package/src/generators/health-indicator/schema.d.ts +5 -0
  28. package/src/generators/health-indicator/schema.json +32 -0
  29. package/src/generators/health-indicator-init/generator.d.ts +4 -0
  30. package/src/generators/health-indicator-init/generator.js +35 -0
  31. package/src/generators/health-indicator-init/generator.js.map +1 -0
  32. package/src/generators/health-indicator-init/index.d.ts +2 -0
  33. package/src/generators/health-indicator-init/index.js +7 -0
  34. package/src/generators/health-indicator-init/index.js.map +1 -0
  35. package/src/generators/health-indicator-init/schema.d.ts +4 -0
  36. package/src/generators/health-indicator-init/schema.json +22 -0
  37. package/src/generators/init/generator.js +8 -5
  38. package/src/generators/init/generator.js.map +1 -1
  39. package/src/generators/init/index.d.ts +2 -0
  40. package/src/generators/init/index.js +7 -0
  41. package/src/generators/init/index.js.map +1 -0
  42. package/src/generators/init/schema.d.ts +2 -0
  43. package/src/generators/init/schema.json +10 -0
  44. package/src/generators/init-application/extract-existing-config-validation.d.ts +3 -0
  45. package/src/generators/init-application/extract-existing-config-validation.js +47 -0
  46. package/src/generators/init-application/extract-existing-config-validation.js.map +1 -0
  47. package/src/generators/init-application/files/shared/Dockerfile +33 -0
  48. package/src/generators/init-application/generator.js +569 -34
  49. package/src/generators/init-application/generator.js.map +1 -1
  50. package/src/generators/init-application/index.d.ts +2 -0
  51. package/src/generators/init-application/index.js +7 -0
  52. package/src/generators/init-application/index.js.map +1 -0
  53. package/src/generators/init-application/schema.d.ts +5 -2
  54. package/src/generators/init-application/schema.json +36 -21
  55. package/src/generators/init-library/generator.js +36 -7
  56. package/src/generators/init-library/generator.js.map +1 -1
  57. package/src/generators/init-library/index.d.ts +2 -0
  58. package/src/generators/init-library/index.js +7 -0
  59. package/src/generators/init-library/index.js.map +1 -0
  60. package/src/generators/init-library/schema.d.ts +2 -0
  61. package/src/generators/init-library/schema.json +10 -0
  62. package/src/generators/jwt/generator.d.ts +4 -0
  63. package/src/generators/jwt/generator.js +76 -0
  64. package/src/generators/jwt/generator.js.map +1 -0
  65. package/src/generators/jwt/index.d.ts +2 -0
  66. package/src/generators/jwt/index.js +7 -0
  67. package/src/generators/jwt/index.js.map +1 -0
  68. package/src/generators/jwt/schema.d.ts +4 -0
  69. package/src/generators/jwt/schema.json +18 -0
  70. package/src/generators/microservice/generator.d.ts +4 -0
  71. package/src/generators/microservice/generator.js +26 -0
  72. package/src/generators/microservice/generator.js.map +1 -0
  73. package/src/generators/microservice/index.d.ts +2 -0
  74. package/src/generators/microservice/index.js +7 -0
  75. package/src/generators/microservice/index.js.map +1 -0
  76. package/src/generators/microservice/schema.d.ts +6 -0
  77. package/src/generators/microservice/schema.json +27 -0
  78. package/src/generators/open-api/generator.d.ts +4 -0
  79. package/src/generators/open-api/generator.js +74 -0
  80. package/src/generators/open-api/generator.js.map +1 -0
  81. package/src/generators/open-api/index.d.ts +2 -0
  82. package/src/generators/open-api/index.js +7 -0
  83. package/src/generators/open-api/index.js.map +1 -0
  84. package/src/generators/open-api/schema.d.ts +4 -0
  85. package/src/generators/open-api/schema.json +18 -0
  86. package/src/generators/sentry/generator.d.ts +4 -0
  87. package/src/generators/sentry/generator.js +152 -0
  88. package/src/generators/sentry/generator.js.map +1 -0
  89. package/src/generators/sentry/index.d.ts +2 -0
  90. package/src/generators/sentry/index.js +7 -0
  91. package/src/generators/sentry/index.js.map +1 -0
  92. package/src/generators/sentry/schema.d.ts +6 -0
  93. package/src/generators/sentry/schema.json +32 -0
  94. package/src/generators/swagger/files/environments/environment.swagger.ts__tmpl__ +1 -0
  95. package/src/generators/swagger/files/swagger.ts__tmpl__ +17 -15
  96. package/src/generators/swagger/generator.js +10 -17
  97. package/src/generators/swagger/generator.js.map +1 -1
  98. package/src/generators/swagger/index.d.ts +2 -0
  99. package/src/generators/swagger/index.js +7 -0
  100. package/src/generators/swagger/index.js.map +1 -0
  101. package/src/generators/swagger/schema.d.ts +1 -0
  102. package/src/generators/swagger/schema.json +3 -0
  103. package/src/generators/validator/generator.d.ts +4 -0
  104. package/src/generators/validator/generator.js +14 -0
  105. package/src/generators/validator/generator.js.map +1 -0
  106. package/src/generators/validator/index.d.ts +2 -0
  107. package/src/generators/validator/index.js +7 -0
  108. package/src/generators/validator/index.js.map +1 -0
  109. package/src/generators/validator/schema.d.ts +4 -0
  110. package/src/generators/validator/schema.json +22 -0
  111. package/src/lib/skip-non-nest-project.js +3 -3
  112. package/src/lib/skip-non-nest-project.js.map +1 -1
@@ -5,11 +5,109 @@ const tslib_1 = require("tslib");
5
5
  const devkit_1 = require("@nx/devkit");
6
6
  const library_1 = require("@nx/js/src/generators/library/library");
7
7
  const generator_utilities_1 = require("@rxap/generator-utilities");
8
+ const ts_morph_1 = require("@rxap/ts-morph");
9
+ const workspace_ts_morph_1 = require("@rxap/workspace-ts-morph");
8
10
  const workspace_utilities_1 = require("@rxap/workspace-utilities");
9
- const ngcli_adapter_1 = require("nx/src/adapter/ngcli-adapter");
10
11
  const path_1 = require("path");
12
+ const ts_morph_2 = require("ts-morph");
11
13
  const skip_non_nest_project_1 = require("../../lib/skip-non-nest-project");
12
- const generator_1 = require("../swagger/generator");
14
+ const generator_1 = require("../health-indicator-init/generator");
15
+ const generator_2 = require("../health-indicator/generator");
16
+ const generator_3 = require("../jwt/generator");
17
+ const generator_4 = require("../open-api/generator");
18
+ const generator_5 = require("../sentry/generator");
19
+ const generator_6 = require("../swagger/generator");
20
+ const generator_7 = require("../validator/generator");
21
+ const extract_existing_config_validation_1 = require("./extract-existing-config-validation");
22
+ function coerceEnvironmentFiles(tree, options) {
23
+ (0, workspace_ts_morph_1.TsMorphNestProjectTransform)(tree, {
24
+ project: options.project,
25
+ }, (project, [sourceFile, prodSourceFile]) => {
26
+ (0, ts_morph_1.CoerceImports)(sourceFile, {
27
+ moduleSpecifier: '@rxap/nest-utilities',
28
+ namedImports: ['Environment'],
29
+ });
30
+ (0, ts_morph_1.CoerceImports)(prodSourceFile, {
31
+ moduleSpecifier: '@rxap/nest-utilities',
32
+ namedImports: ['Environment'],
33
+ });
34
+ const baseEnvironment = {
35
+ name: w => w.quote('development'),
36
+ production: 'false',
37
+ app: w => w.quote(options.project),
38
+ };
39
+ if (options.sentry) {
40
+ baseEnvironment['sentry'] = ts_morph_2.Writers.object({
41
+ enabled: 'false',
42
+ debug: 'false',
43
+ });
44
+ }
45
+ const normal = (0, ts_morph_1.CoerceVariableDeclaration)(sourceFile, 'environment', {
46
+ type: 'Environment',
47
+ initializer: ts_morph_2.Writers.object(baseEnvironment),
48
+ });
49
+ if (options.overwrite) {
50
+ normal.set({ initializer: ts_morph_2.Writers.object(baseEnvironment) });
51
+ }
52
+ baseEnvironment['name'] = w => w.quote('production');
53
+ baseEnvironment['production'] = 'true';
54
+ if (options.sentry) {
55
+ baseEnvironment['sentry'] = ts_morph_2.Writers.object({
56
+ enabled: 'true',
57
+ debug: 'false',
58
+ });
59
+ }
60
+ const prod = (0, ts_morph_1.CoerceVariableDeclaration)(prodSourceFile, 'environment', {
61
+ type: 'Environment',
62
+ initializer: ts_morph_2.Writers.object(baseEnvironment),
63
+ });
64
+ if (options.overwrite) {
65
+ prod.set({ initializer: ts_morph_2.Writers.object(baseEnvironment) });
66
+ }
67
+ }, [
68
+ '/environments/environment.ts?',
69
+ '/environments/environment.prod.ts?',
70
+ ]);
71
+ }
72
+ function removeAppServiceFile(tree, projectSourceRoot) {
73
+ var _a, _b;
74
+ const appServiceFilePath = (0, path_1.join)(projectSourceRoot, 'app', 'app.service.ts');
75
+ if (tree.exists(appServiceFilePath)) {
76
+ if ((_b = (_a = tree.read(appServiceFilePath)) === null || _a === void 0 ? void 0 : _a.toString('utf-8')) === null || _b === void 0 ? void 0 : _b.includes('return { message: \'Hello API\' };')) {
77
+ console.warn('Remove the app service file');
78
+ tree.delete(appServiceFilePath);
79
+ if (tree.exists((0, path_1.join)(projectSourceRoot, 'app', 'app.service.spec.ts'))) {
80
+ console.warn('Remove the app service spec file');
81
+ tree.delete((0, path_1.join)(projectSourceRoot, 'app', 'app.service.spec.ts'));
82
+ }
83
+ else {
84
+ console.warn('The app service spec file does not exists');
85
+ }
86
+ }
87
+ else {
88
+ console.warn('The app service file does not contains the default method');
89
+ }
90
+ }
91
+ else {
92
+ console.warn('The app service file does not exists');
93
+ }
94
+ }
95
+ function removeAppControllerSpecFile(tree, projectSourceRoot) {
96
+ var _a, _b;
97
+ const appControllerSpecFilePath = (0, path_1.join)(projectSourceRoot, 'app', 'app.controller.spec.ts');
98
+ if (tree.exists(appControllerSpecFilePath)) {
99
+ if ((_b = (_a = tree.read(appControllerSpecFilePath)) === null || _a === void 0 ? void 0 : _a.toString('utf-8')) === null || _b === void 0 ? void 0 : _b.includes('should return "Hello API"')) {
100
+ console.warn('Remove the app controller spec file');
101
+ tree.delete(appControllerSpecFilePath);
102
+ }
103
+ else {
104
+ console.warn('The app controller spec file does not contains the default test');
105
+ }
106
+ }
107
+ else {
108
+ console.warn('The app controller spec file does not exists');
109
+ }
110
+ }
13
111
  function skipProject(tree, options, project, projectName) {
14
112
  if ((0, skip_non_nest_project_1.SkipNonNestProject)(tree, options, project, projectName)) {
15
113
  return true;
@@ -23,10 +121,12 @@ function setGeneralTargetDefaults(tree) {
23
121
  const nxJson = (0, devkit_1.readNxJson)(tree);
24
122
  (0, workspace_utilities_1.CoerceTargetDefaultsDependency)(nxJson, 'build', 'generate-package-json');
25
123
  (0, workspace_utilities_1.CoerceTargetDefaultsDependency)(nxJson, 'generate-open-api', 'swagger-generate');
124
+ (0, workspace_utilities_1.CoerceNxJsonCacheableOperation)(nxJson, 'generate-package-json', 'generate-open-api', 'swagger-generate', 'swagger-build');
26
125
  (0, devkit_1.updateNxJson)(tree, nxJson);
27
126
  }
28
127
  function updateProjectTargets(project) {
29
- var _a, _b, _c;
128
+ var _a, _b, _c, _d, _e;
129
+ var _f, _g;
30
130
  (0, workspace_utilities_1.CoerceTarget)(project, 'generate-package-json', {
31
131
  executor: '@rxap/plugin-nestjs:package-json',
32
132
  configurations: {
@@ -40,7 +140,7 @@ function updateProjectTargets(project) {
40
140
  (0, workspace_utilities_1.CoerceTarget)(project, 'generate-open-api', {
41
141
  executor: '@rxap/plugin-library:run-generator',
42
142
  options: {
43
- generator: '@rxap/schematics-open-api:generate',
143
+ generator: '@rxap/plugin-open-api:generate',
44
144
  options: {
45
145
  project: `open-api-${project.name}`,
46
146
  path: `${outputPath.replace('dist/', 'dist/swagger/')}/openapi.json`,
@@ -48,14 +148,62 @@ function updateProjectTargets(project) {
48
148
  },
49
149
  },
50
150
  });
151
+ (0, workspace_utilities_1.CoerceTarget)(project, 'build', {
152
+ options: {
153
+ generatePackageJson: true,
154
+ },
155
+ configurations: {
156
+ production: {
157
+ fileReplacements: [
158
+ {
159
+ replace: `${project.sourceRoot}/environments/environment.ts`,
160
+ with: `${project.sourceRoot}/environments/environment.prod.ts`,
161
+ },
162
+ ],
163
+ },
164
+ development: {
165
+ progress: true,
166
+ },
167
+ },
168
+ }, workspace_utilities_1.Strategy.OVERWRITE);
169
+ if (project.targets['docker']) {
170
+ (_d = (_f = project.targets['docker']).options) !== null && _d !== void 0 ? _d : (_f.options = {});
171
+ (_e = (_g = project.targets['docker'].options).dockerfile) !== null && _e !== void 0 ? _e : (_g.dockerfile = 'shared/nestjs/Dockerfile');
172
+ }
51
173
  }
52
174
  function updateGitIgnore(tree, project) {
53
175
  (0, generator_utilities_1.CoerceIgnorePattern)(tree, (0, path_1.join)(project.root, '.gitignore'), ['package.json']);
54
176
  }
177
+ function addDependencies(tree, options) {
178
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
179
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@nestjs/throttler', 'latest', { soft: true });
180
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, 'cookie-parser', 'latest', { soft: true });
181
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@nestjs/config', 'latest', { soft: true });
182
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, 'joi', 'latest', { soft: true });
183
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@rxap/nest-utilities', 'latest', { soft: true });
184
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@rxap/nest-server', 'latest', { soft: true });
185
+ yield (0, workspace_utilities_1.AddPackageJsonDevDependency)(tree, '@types/cookie-parser', 'latest', { soft: true });
186
+ yield (0, workspace_utilities_1.AddPackageJsonDevDependency)(tree, '@types/csurf', 'latest', { soft: true });
187
+ yield (0, workspace_utilities_1.AddPackageJsonDevDependency)(tree, '@rxap/plugin-application', 'latest', { soft: true });
188
+ yield (0, workspace_utilities_1.AddPackageJsonDevDependency)(tree, '@rxap/plugin-docker', 'latest', { soft: true });
189
+ switch (options.platform) {
190
+ case 'express':
191
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@nestjs/platform-express', 'latest', { soft: true });
192
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, 'helmet', 'latest', { soft: true });
193
+ break;
194
+ case 'fastify':
195
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@nestjs/platform-fastify', 'latest', { soft: true });
196
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@fastify/helmet', 'latest', { soft: true });
197
+ break;
198
+ }
199
+ });
200
+ }
55
201
  function createOpenApiClientSdkLibrary(tree, project, projects) {
202
+ var _a;
56
203
  return tslib_1.__awaiter(this, void 0, void 0, function* () {
57
204
  const openApiProjectName = `open-api-${project.name}`;
58
205
  if (projects.has(openApiProjectName)) {
206
+ console.log(`Open api client sdk library for project ${project.name} already exists`);
59
207
  return;
60
208
  }
61
209
  const projectRoot = project.root;
@@ -63,14 +211,21 @@ function createOpenApiClientSdkLibrary(tree, project, projects) {
63
211
  const name = fragments.pop();
64
212
  fragments.shift(); // remove the root folder
65
213
  const directory = `open-api/${fragments.join('/')}`;
66
- yield (0, library_1.default)(tree, {
67
- name,
68
- directory,
69
- unitTestRunner: 'none',
70
- tags: 'open-api',
71
- buildable: false,
72
- bundler: 'none',
73
- });
214
+ const manuelCreateCommand = `nx g @nx/js:library --name ${name} --directory ${directory} --unitTestRunner none --tags open-api --buildable false --bundler none`;
215
+ try {
216
+ yield (0, library_1.default)(tree, {
217
+ name,
218
+ directory,
219
+ unitTestRunner: 'none',
220
+ tags: 'open-api',
221
+ buildable: false,
222
+ bundler: 'none',
223
+ });
224
+ }
225
+ catch (e) {
226
+ console.log(`Manuel create open api client sdk library: ${manuelCreateCommand}`);
227
+ throw new Error(`Can't create open api client sdk library: ${e.message}`);
228
+ }
74
229
  let tsConfig;
75
230
  try {
76
231
  tsConfig = JSON.parse(tree.read('tsconfig.base.json').toString('utf-8'));
@@ -80,37 +235,417 @@ function createOpenApiClientSdkLibrary(tree, project, projects) {
80
235
  }
81
236
  projects = (0, devkit_1.getProjects)(tree);
82
237
  if (!projects.has(openApiProjectName)) {
238
+ console.log(`Manuel create open api client sdk library: ${manuelCreateCommand}`);
83
239
  throw new Error(`Can't find project ${openApiProjectName}`);
84
240
  }
85
- const openApiProjectRoot = projects.get(openApiProjectName).root;
86
- delete tsConfig.compilerOptions.paths[`${directory}/${name}`];
87
- tsConfig.compilerOptions.paths[`${openApiProjectName}/*`] = [`${openApiProjectRoot}/src/lib/*`];
88
- tree.write('tsconfig.base.json', JSON.stringify(tsConfig, null, 2));
241
+ const openApiProjectConfiguration = projects.get(openApiProjectName);
242
+ const openApiProjectRoot = openApiProjectConfiguration.root;
243
+ if (tsConfig.compilerOptions.paths[`${directory}/${name}`]) {
244
+ delete tsConfig.compilerOptions.paths[`${directory}/${name}`];
245
+ tsConfig.compilerOptions.paths[`${openApiProjectName}/*`] = [`${openApiProjectRoot}/src/lib/*`];
246
+ tree.write('tsconfig.base.json', JSON.stringify(tsConfig, null, 2));
247
+ }
89
248
  tree.write(`${openApiProjectRoot}/src/index.ts`, 'export {};');
90
- tree.delete(`${openApiProjectRoot}/src/lib/${openApiProjectName}.ts`);
91
- tree.delete(`${openApiProjectRoot}/README.md`);
249
+ if (tree.exists(`${openApiProjectRoot}/src/lib/${openApiProjectName}.ts`)) {
250
+ tree.delete(`${openApiProjectRoot}/src/lib/${openApiProjectName}.ts`);
251
+ }
252
+ if (tree.exists(`${openApiProjectRoot}/README.md`)) {
253
+ tree.delete(`${openApiProjectRoot}/README.md`);
254
+ }
255
+ (_a = openApiProjectConfiguration.implicitDependencies) !== null && _a !== void 0 ? _a : (openApiProjectConfiguration.implicitDependencies = []);
256
+ if (!openApiProjectConfiguration.implicitDependencies.includes(project.name)) {
257
+ openApiProjectConfiguration.implicitDependencies.push(project.name);
258
+ }
259
+ (0, devkit_1.updateProjectConfiguration)(tree, openApiProjectName, openApiProjectConfiguration);
260
+ });
261
+ }
262
+ function getPort(tree, options, projectSourceRoot) {
263
+ if (options.port && options.projects.length === 1) {
264
+ return options.port;
265
+ }
266
+ if (tree.exists((0, path_1.join)(projectSourceRoot, 'app', 'app.config.ts'))) {
267
+ const match = tree.read((0, path_1.join)(projectSourceRoot, 'app', 'app.config.ts'))
268
+ .toString()
269
+ .match(/validationSchema\['PORT'\] = Joi.number\(\).default\((\d+)\);/);
270
+ if (match) {
271
+ return parseInt(match[1]);
272
+ }
273
+ }
274
+ if (tree.exists((0, path_1.join)(projectSourceRoot, 'app', 'app.module.ts'))) {
275
+ const match = tree.read((0, path_1.join)(projectSourceRoot, 'app', 'app.module.ts'))
276
+ .toString()
277
+ .match(/PORT: Joi.number\(\).default\((\d+)\)/);
278
+ if (match) {
279
+ return parseInt(match[1]);
280
+ }
281
+ }
282
+ return Math.floor(Math.random() * 1000) + 3000;
283
+ }
284
+ const MAIN_NEST_APP_OPTIONS_STATEMENT = 'const options: NestApplicationOptions = {};';
285
+ const MAIN_BOOTSTRAP_OPTIONS_STATEMENT = 'const bootstrapOptions: Partial<MonolithicBootstrapOptions> = {};';
286
+ const MAIN_SERVER_STATEMENT = 'const server = new Monolithic<NestApplicationOptions, NestExpressApplication>(AppModule, environment, options, bootstrapOptions);';
287
+ const MAIN_BOOTSTRAP_STATEMENT = 'server.bootstrap().catch((e) => console.error(\'Server bootstrap failed: \' + e.message));';
288
+ const MAIN_SETUP_HELMET_STATEMENT = 'server.after(SetupHelmet());';
289
+ const MAIN_SETUP_COOKIE_STATEMENT = 'server.after(SetupCookieParser());';
290
+ const MAIN_SETUP_CORS_STATEMENT = 'server.after(SetupCors());';
291
+ function assertMainStatements(sourceFile) {
292
+ var _a;
293
+ const statements = [];
294
+ statements.push('const options: NestApplicationOptions = {');
295
+ statements.push('const bootstrapOptions: Partial<MonolithicBootstrapOptions> = {');
296
+ statements.push('const server = new Monolithic<NestApplicationOptions, NestExpressApplication>(AppModule, environment, options, bootstrapOptions);');
297
+ const existingStatements = (_a = sourceFile.getStatements().map(s => s.getText())) !== null && _a !== void 0 ? _a : [];
298
+ for (const statement of statements) {
299
+ if (!existingStatements.includes(statement)) {
300
+ console.error(`Missing statement from main.ts: ${statement}`);
301
+ sourceFile.set({
302
+ statements: [
303
+ MAIN_NEST_APP_OPTIONS_STATEMENT,
304
+ MAIN_BOOTSTRAP_OPTIONS_STATEMENT,
305
+ MAIN_SERVER_STATEMENT,
306
+ MAIN_SETUP_HELMET_STATEMENT,
307
+ MAIN_SETUP_COOKIE_STATEMENT,
308
+ MAIN_SETUP_CORS_STATEMENT,
309
+ MAIN_BOOTSTRAP_STATEMENT,
310
+ ],
311
+ });
312
+ (0, ts_morph_1.CoerceImports)(sourceFile, [
313
+ {
314
+ moduleSpecifier: '@nestjs/common',
315
+ namedImports: ['NestApplicationOptions'],
316
+ },
317
+ {
318
+ moduleSpecifier: '@nestjs/platform-express',
319
+ namedImports: ['NestExpressApplication'],
320
+ },
321
+ {
322
+ moduleSpecifier: '@rxap/nest-server',
323
+ namedImports: [
324
+ 'MonolithicBootstrapOptions',
325
+ 'Monolithic',
326
+ 'SetupHelmet',
327
+ 'SetupCookieParser',
328
+ 'SetupCors',
329
+ ],
330
+ },
331
+ {
332
+ moduleSpecifier: './app/app.module',
333
+ namedImports: ['AppModule'],
334
+ },
335
+ {
336
+ moduleSpecifier: './environments/environment',
337
+ namedImports: ['environment'],
338
+ },
339
+ ]);
340
+ return;
341
+ }
342
+ }
343
+ }
344
+ function updateMainFile(tree, project, projectName, options) {
345
+ (0, workspace_ts_morph_1.TsMorphAngularProjectTransform)(tree, {
346
+ project: project.name,
347
+ // directory: '..' // to move from the apps/demo/src/app folder into the apps/demo/src folder
348
+ }, (project, [sourceFile]) => {
349
+ var _a;
350
+ assertMainStatements(sourceFile);
351
+ const importDeclarations = [];
352
+ const statements = [];
353
+ if (options.sentry) {
354
+ importDeclarations.push({
355
+ moduleSpecifier: '@rxap/nest-sentry',
356
+ namedImports: ['SetupSentryLogger'],
357
+ });
358
+ statements.push('server.after(SetupSentryLogger());');
359
+ }
360
+ else {
361
+ importDeclarations.push({
362
+ moduleSpecifier: '@rxap/nest-logger',
363
+ namedImports: ['RxapLogger'],
364
+ });
365
+ statements.push('server.after(app => app.useLogger(new RxapLogger()));');
366
+ }
367
+ if (options.validator) {
368
+ importDeclarations.push({
369
+ moduleSpecifier: '@rxap/nest-server',
370
+ namedImports: ['ValidationPipeSetup'],
371
+ });
372
+ statements.push('server.after(ValidationPipeSetup());');
373
+ }
374
+ if (options.swaggerLive) {
375
+ importDeclarations.push({
376
+ moduleSpecifier: '@rxap/nest-server',
377
+ namedImports: ['SetupSwagger'],
378
+ });
379
+ statements.push('server.after(SetupSwagger());');
380
+ }
381
+ if (options.statusRegister) {
382
+ importDeclarations.push({
383
+ moduleSpecifier: '@rxap/nest-server',
384
+ namedImports: ['RegisterToStatusService'],
385
+ });
386
+ statements.push('server.ready(RegisterToStatusService());');
387
+ }
388
+ (0, ts_morph_1.CoerceImports)(sourceFile, importDeclarations);
389
+ for (let i = 0; i < statements.length; i++) {
390
+ const statement = statements[i];
391
+ const lastStatement = i > 0 ? statements[i - 1] : null;
392
+ const nestStatement = i < statements.length - 1 ? statements[i + 1] : null;
393
+ const existingStatements = (_a = sourceFile.getStatements().map(s => s.getText())) !== null && _a !== void 0 ? _a : [];
394
+ if (!existingStatements.includes(statement)) {
395
+ let index;
396
+ if (lastStatement) {
397
+ index = existingStatements.findIndex(s => s.includes(lastStatement)) + 1;
398
+ }
399
+ else if (nestStatement) {
400
+ index = existingStatements.findIndex(s => s.includes(nestStatement));
401
+ }
402
+ else {
403
+ index = existingStatements.findIndex(s => s.includes(MAIN_BOOTSTRAP_STATEMENT));
404
+ }
405
+ console.log(`insert statement: ${statement} at index ${index}`);
406
+ sourceFile.insertStatements(index, statement);
407
+ }
408
+ }
409
+ if (projectName === 'service-status') {
410
+ const variableDeclaration = (0, ts_morph_1.CoerceVariableDeclaration)(sourceFile, 'bootstrapOptions', { initializer: '{}' });
411
+ const objectLiteralExpression = variableDeclaration.getInitializerIfKindOrThrow(ts_morph_2.SyntaxKind.ObjectLiteralExpression);
412
+ let objectLiteralElementLike = objectLiteralExpression.getProperty('globalPrefixOptions');
413
+ if (!objectLiteralElementLike) {
414
+ objectLiteralElementLike = objectLiteralExpression.addPropertyAssignment({
415
+ name: 'globalPrefixOptions',
416
+ initializer: '{}',
417
+ });
418
+ }
419
+ const gpoPropertyAssigment = objectLiteralElementLike.asKindOrThrow(ts_morph_2.SyntaxKind.PropertyAssignment);
420
+ const gpoObjectLiteralExpression = gpoPropertyAssigment.getInitializerIfKindOrThrow(ts_morph_2.SyntaxKind.ObjectLiteralExpression);
421
+ let gpoElementLike = gpoObjectLiteralExpression.getProperty('exclude');
422
+ if (!gpoElementLike) {
423
+ gpoElementLike = gpoObjectLiteralExpression.addPropertyAssignment({
424
+ name: 'exclude',
425
+ initializer: `[ '/health(.*)', '/info', '/openapi', '/register' ]`,
426
+ });
427
+ }
428
+ }
429
+ }, ['main.ts']);
430
+ }
431
+ function updateTags(project, options) {
432
+ const tags = ['backend', 'nest', 'service'];
433
+ if (options.sentry) {
434
+ tags.push('sentry');
435
+ }
436
+ if (options.swagger) {
437
+ tags.push('swagger');
438
+ }
439
+ if (options.jwt) {
440
+ tags.push('jwt');
441
+ }
442
+ if (options.healthIndicator) {
443
+ tags.push('health-indicator');
444
+ }
445
+ if (options.openApi) {
446
+ tags.push('openapi');
447
+ }
448
+ if (options.platform) {
449
+ tags.push(options.platform);
450
+ }
451
+ (0, generator_utilities_1.CoerceProjectTags)(project, tags);
452
+ }
453
+ function updateApiConfigurationFile(tree, projectName, apiPrefix, apiConfigurationFile) {
454
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
455
+ if (apiConfigurationFile) {
456
+ yield (0, workspace_utilities_1.UpdateJsonFile)(tree, json => {
457
+ json[projectName] = { baseUrl: `/${apiPrefix}` };
458
+ }, apiConfigurationFile, { create: true });
459
+ }
92
460
  });
93
461
  }
94
462
  function initApplicationGenerator(tree, options) {
463
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
95
464
  return tslib_1.__awaiter(this, void 0, void 0, function* () {
465
+ (_a = options.sentry) !== null && _a !== void 0 ? _a : (options.sentry = true);
466
+ (_b = options.swagger) !== null && _b !== void 0 ? _b : (options.swagger = true);
467
+ (_c = options.healthIndicator) !== null && _c !== void 0 ? _c : (options.healthIndicator = true);
468
+ (_d = options.platform) !== null && _d !== void 0 ? _d : (options.platform = 'express');
469
+ (_e = options.validator) !== null && _e !== void 0 ? _e : (options.validator = true);
470
+ (_f = options.healthIndicatorList) !== null && _f !== void 0 ? _f : (options.healthIndicatorList = []);
471
+ (_g = options.port) !== null && _g !== void 0 ? _g : (options.port = undefined);
472
+ (_h = options.apiPrefix) !== null && _h !== void 0 ? _h : (options.apiPrefix = undefined);
473
+ (_j = options.sentryDsn) !== null && _j !== void 0 ? _j : (options.sentryDsn = undefined);
474
+ (_k = options.overwrite) !== null && _k !== void 0 ? _k : (options.overwrite = false);
475
+ (_l = options.openApi) !== null && _l !== void 0 ? _l : (options.openApi = false);
476
+ (_m = options.jwt) !== null && _m !== void 0 ? _m : (options.jwt = false);
477
+ (_o = options.statusRegister) !== null && _o !== void 0 ? _o : (options.statusRegister = true);
478
+ (_p = options.apiConfigurationFile) !== null && _p !== void 0 ? _p : (options.apiConfigurationFile = 'shared/service/configuration/latest/config.api.json');
96
479
  console.log('nestjs application init generator:', options);
480
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@rxap/nest-server', 'latest', { soft: true });
481
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@rxap/nest-utilities', 'latest', { soft: true });
482
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@rxap/nest-logger', 'latest', { soft: true });
483
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@nestjs/terminus', 'latest', { soft: true });
484
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@nestjs/config', 'latest', { soft: true });
485
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, 'joi', 'latest', { soft: true });
486
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@rxap/plugin-nestjs', 'latest', { soft: true });
487
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@rxap/plugin-library', 'latest', { soft: true });
488
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@rxap/plugin-open-api', 'latest', { soft: true });
489
+ if (options.sentry) {
490
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@rxap/nest-sentry', 'latest', { soft: true });
491
+ }
492
+ if (options.swagger) {
493
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@nestjs/swagger', 'latest', { soft: true });
494
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@rxap/workspace-open-api', 'latest', { soft: true });
495
+ }
496
+ if (options.jwt) {
497
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@rxap/nest-jwt', 'latest', { soft: true });
498
+ }
499
+ if (options.openApi) {
500
+ yield (0, workspace_utilities_1.AddPackageJsonDependency)(tree, '@rxap/nest-open-api', 'latest', { soft: true });
501
+ }
502
+ (0, workspace_utilities_1.CoerceFilesStructure)(tree, {
503
+ srcFolder: (0, path_1.join)(__dirname, 'files', 'shared'),
504
+ target: 'shared/nestjs',
505
+ overwrite: options.overwrite,
506
+ });
97
507
  setGeneralTargetDefaults(tree);
98
- const projects = (0, devkit_1.getProjects)(tree);
99
- for (const [projectName, project] of projects.entries()) {
100
- if (skipProject(tree, options, project, projectName)) {
101
- continue;
102
- }
103
- console.log(`init project: ${projectName}`);
104
- updateProjectTargets(project);
105
- updateGitIgnore(tree, project);
106
- yield createOpenApiClientSdkLibrary(tree, project, projects);
107
- // apply changes to the project configuration
108
- (0, devkit_1.updateProjectConfiguration)(tree, projectName, project);
109
- if (options.swagger) {
110
- yield (0, generator_1.default)(tree, { project: projectName });
111
- }
112
- if (options.legacy) {
113
- yield (0, ngcli_adapter_1.wrapAngularDevkitSchematic)('@rxap/schematic-nestjs', 'init')(tree, Object.assign(Object.assign({}, options), { swagger: false, project: projectName }));
508
+ yield addDependencies(tree, options);
509
+ if (!options.skipProjects) {
510
+ const projects = (0, devkit_1.getProjects)(tree);
511
+ for (const [projectName, project] of projects.entries()) {
512
+ if (skipProject(tree, options, project, projectName)) {
513
+ continue;
514
+ }
515
+ const projectSourceRoot = project.sourceRoot;
516
+ if (!projectSourceRoot) {
517
+ throw new Error(`Can't find project source root for project ${projectName}`);
518
+ }
519
+ const port = getPort(tree, options, projectSourceRoot);
520
+ const globalApiPrefix = (0, workspace_utilities_1.GetNestApiPrefix)(tree, options, projectSourceRoot, projectName);
521
+ console.log(`init project: ${projectName}`);
522
+ updateProjectTargets(project);
523
+ updateGitIgnore(tree, project);
524
+ updateTags(project, options);
525
+ yield updateApiConfigurationFile(tree, projectName, globalApiPrefix, options.apiConfigurationFile);
526
+ yield createOpenApiClientSdkLibrary(tree, project, projects);
527
+ // apply changes to the project configuration
528
+ (0, devkit_1.updateProjectConfiguration)(tree, projectName, project);
529
+ coerceEnvironmentFiles(tree, {
530
+ project: projectName,
531
+ sentry: options.sentry,
532
+ overwrite: options.overwrite,
533
+ });
534
+ (0, workspace_ts_morph_1.TsMorphNestProjectTransform)(tree, { project: projectName }, (project, [moduleSourceFile, controllerSourceFile, configSourceFile]) => {
535
+ (0, ts_morph_1.CoerceNestAppModule)(moduleSourceFile);
536
+ (0, ts_morph_1.CoerceNestAppController)(controllerSourceFile);
537
+ (0, ts_morph_1.CoerceNestThrottlerModuleImport)(moduleSourceFile, { overwrite: options.overwrite });
538
+ (0, ts_morph_1.CoerceNestConfigModuleImport)(moduleSourceFile, { overwrite: options.overwrite });
539
+ (0, ts_morph_1.CoerceAppGuardProvider)(moduleSourceFile);
540
+ (0, ts_morph_1.CoerceNestEnvironmentProvider)(moduleSourceFile);
541
+ (0, ts_morph_1.CoerceNestLoggerProvider)(moduleSourceFile);
542
+ const itemList = (0, extract_existing_config_validation_1.ExtractExistingConfigValidation)(moduleSourceFile);
543
+ for (const item of [
544
+ {
545
+ name: 'PORT',
546
+ type: 'number',
547
+ defaultValue: port.toFixed(0),
548
+ },
549
+ {
550
+ name: 'GLOBAL_API_PREFIX',
551
+ defaultValue: w => w.quote(globalApiPrefix),
552
+ },
553
+ {
554
+ name: 'THROTTLER_TTL',
555
+ defaultValue: '1',
556
+ },
557
+ {
558
+ name: 'THROTTLER_LIMIT',
559
+ defaultValue: '10',
560
+ },
561
+ {
562
+ name: 'COOKIE_SECRET',
563
+ defaultValue: 'GenerateRandomString()',
564
+ },
565
+ ]) {
566
+ if (!itemList.find(i => i.name === item.name)) {
567
+ itemList.push(item);
568
+ }
569
+ }
570
+ if (options.statusRegister && projectName !== 'service-status') {
571
+ if (!itemList.find(i => i.name === 'STATUS_SERVICE_BASE_URL')) {
572
+ itemList.push({
573
+ name: 'STATUS_SERVICE_BASE_URL',
574
+ defaultValue: `environment.production ? 'http://rxap-service-status:3000' : 'http://localhost:5300'`,
575
+ });
576
+ }
577
+ (0, ts_morph_1.CoerceImports)(configSourceFile, {
578
+ namespaceImport: 'process',
579
+ moduleSpecifier: 'process',
580
+ });
581
+ }
582
+ (0, ts_morph_1.CoerceNestAppConfig)(configSourceFile, {
583
+ itemList,
584
+ overwrite: options.overwrite,
585
+ });
586
+ (0, ts_morph_1.CoerceImports)(configSourceFile, {
587
+ namedImports: ['GenerateRandomString'],
588
+ moduleSpecifier: '@rxap/utilities',
589
+ });
590
+ }, [
591
+ '/app/app.module.ts',
592
+ '/app/app.controller.ts',
593
+ '/app/app.config.ts?',
594
+ ]);
595
+ removeAppServiceFile(tree, projectSourceRoot);
596
+ removeAppControllerSpecFile(tree, projectSourceRoot);
597
+ if (options.generateMain) {
598
+ updateMainFile(tree, project, projectName, options);
599
+ }
600
+ if (options.healthIndicator || ((_q = options.healthIndicatorList) === null || _q === void 0 ? void 0 : _q.length)) {
601
+ if ((_r = options.healthIndicatorList) === null || _r === void 0 ? void 0 : _r.length) {
602
+ for (const healthIndicator of options.healthIndicatorList) {
603
+ yield (0, generator_2.default)(tree, {
604
+ name: healthIndicator,
605
+ project: projectName,
606
+ overwrite: options.overwrite,
607
+ });
608
+ }
609
+ }
610
+ else {
611
+ yield (0, generator_1.default)(tree, {
612
+ project: projectName,
613
+ overwrite: options.overwrite,
614
+ });
615
+ }
616
+ }
617
+ if (options.sentry) {
618
+ yield (0, generator_5.default)(tree, {
619
+ project: projectName,
620
+ dsn: options.sentryDsn,
621
+ required: !!options.sentryDsn,
622
+ overwrite: options.overwrite,
623
+ });
624
+ }
625
+ if (options.validator) {
626
+ yield (0, generator_7.default)(tree, {
627
+ project: projectName,
628
+ overwrite: options.overwrite,
629
+ });
630
+ }
631
+ if (options.openApi) {
632
+ yield (0, generator_4.default)(tree, {
633
+ project: projectName,
634
+ overwrite: options.overwrite,
635
+ });
636
+ }
637
+ if (options.jwt) {
638
+ yield (0, generator_3.default)(tree, {
639
+ project: projectName,
640
+ overwrite: options.overwrite,
641
+ });
642
+ }
643
+ if (options.swagger !== false) {
644
+ yield (0, generator_6.default)(tree, {
645
+ project: projectName,
646
+ overwrite: options.overwrite,
647
+ });
648
+ }
114
649
  }
115
650
  }
116
651
  });