@rxdi/schematics 0.7.124 → 0.7.128

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 (224) hide show
  1. package/lib/application/application.factory.js +4 -4
  2. package/lib/application/application.factory.test.ts +88 -0
  3. package/lib/application/application.factory.ts +54 -0
  4. package/lib/application/application.schema.d.ts +34 -0
  5. package/lib/application/files/js/.babelrc +4 -0
  6. package/lib/application/files/js/.prettierrc +4 -0
  7. package/lib/application/files/js/README.md +37 -0
  8. package/lib/application/files/js/index.js +3 -0
  9. package/lib/application/files/js/jsconfig.json +9 -0
  10. package/lib/application/files/js/nest-cli.json +5 -0
  11. package/lib/application/files/js/nodemon.json +6 -0
  12. package/lib/application/files/js/package.json +46 -0
  13. package/lib/application/files/js/test/app.e2e-spec.js +23 -0
  14. package/lib/application/files/js/test/jest-e2e.json +5 -0
  15. package/lib/application/files/ts/.prettierrc +4 -0
  16. package/lib/application/files/ts/README.md +75 -0
  17. package/lib/application/files/ts/nest-cli.json +5 -0
  18. package/lib/application/files/ts/nodemon-debug.json +6 -0
  19. package/lib/application/files/ts/nodemon.json +6 -0
  20. package/lib/application/files/ts/package.json +58 -0
  21. package/lib/application/files/ts/test/app.e2e-spec.ts +23 -0
  22. package/lib/application/files/ts/test/jest-e2e.json +9 -0
  23. package/lib/application/files/ts/tsconfig.build.json +4 -0
  24. package/lib/application/schema.json +49 -0
  25. package/lib/class/class.factory.js +6 -6
  26. package/lib/class/class.factory.test.ts +100 -0
  27. package/lib/class/class.factory.ts +54 -0
  28. package/lib/class/class.schema.d.ts +28 -0
  29. package/lib/class/files/js/__name__.js +1 -0
  30. package/lib/class/files/js/__name__.spec.js +7 -0
  31. package/lib/class/files/ts/__name__.spec.ts +7 -0
  32. package/lib/class/files/ts/__name__.ts +1 -0
  33. package/lib/class/schema.json +39 -0
  34. package/lib/client-app/angular/angular.factory.js +9 -9
  35. package/lib/client-app/angular/angular.factory.ts +139 -0
  36. package/lib/client-app/angular/angular.schema.d.ts +32 -0
  37. package/lib/client-app/angular/files/angular.constants.ts +4 -0
  38. package/lib/client-app/angular/files/angular.module.ts +41 -0
  39. package/lib/client-app/angular/files/angular.providers.ts +27 -0
  40. package/lib/client-app/angular/files/angular.utils.ts +19 -0
  41. package/lib/client-app/angular/files/interfaces/angular-options.interface.ts +87 -0
  42. package/lib/client-app/angular/files/loaders/abstract.loader.ts +16 -0
  43. package/lib/client-app/angular/files/loaders/express.loader.ts +25 -0
  44. package/lib/client-app/angular/files/loaders/fastify.loader.ts +34 -0
  45. package/lib/client-app/angular/files/loaders/noop.loader.ts +12 -0
  46. package/lib/client-app/angular/schema.json +24 -0
  47. package/lib/component/component.factory.js +8 -8
  48. package/lib/component/component.factory.test.ts +191 -0
  49. package/lib/component/component.factory.ts +91 -0
  50. package/lib/component/component.schema.d.ts +44 -0
  51. package/lib/component/files/js/__name__.component.js +56 -0
  52. package/lib/component/files/js/__name__.component.spec.js +31 -0
  53. package/lib/component/files/ts/__name__.component.spec.ts +31 -0
  54. package/lib/component/files/ts/__name__.component.ts +56 -0
  55. package/lib/component/schema.json +47 -0
  56. package/lib/configuration/configuration.factory.js +4 -4
  57. package/lib/configuration/configuration.factory.test.ts +60 -0
  58. package/lib/configuration/configuration.factory.ts +35 -0
  59. package/lib/configuration/configuration.schema.d.ts +18 -0
  60. package/lib/configuration/files/js/nest-cli.json +5 -0
  61. package/lib/configuration/files/ts/nest-cli.json +5 -0
  62. package/lib/controller/controller.factory.js +8 -8
  63. package/lib/controller/controller.factory.test.ts +191 -0
  64. package/lib/controller/controller.factory.ts +91 -0
  65. package/lib/controller/controller.schema.d.ts +44 -0
  66. package/lib/controller/files/js/__name__.controller.js +24 -0
  67. package/lib/controller/files/js/__name__.controller.spec.js +61 -0
  68. package/lib/controller/files/ts/__name__.controller.spec.ts +61 -0
  69. package/lib/controller/files/ts/__name__.controller.ts +24 -0
  70. package/lib/controller/schema.json +47 -0
  71. package/lib/decorator/decorator.factory.js +5 -5
  72. package/lib/decorator/decorator.factory.test.ts +111 -0
  73. package/lib/decorator/decorator.factory.ts +48 -0
  74. package/lib/decorator/decorator.schema.d.ts +24 -0
  75. package/lib/decorator/files/js/__name__.decorator.js +3 -0
  76. package/lib/decorator/files/ts/__name__.decorator.ts +3 -0
  77. package/lib/decorator/schema.json +35 -0
  78. package/lib/defaults.ts +6 -0
  79. package/lib/effect/effect.factory.js +9 -9
  80. package/lib/effect/effect.factory.test.ts +190 -0
  81. package/lib/effect/effect.factory.ts +91 -0
  82. package/lib/effect/effect.schema.d.ts +44 -0
  83. package/lib/effect/files/js/__name__.effect.js +11 -0
  84. package/lib/effect/files/js/__name__.effect.spec.js +17 -0
  85. package/lib/effect/files/ts/__name__.effect.spec.ts +17 -0
  86. package/lib/effect/files/ts/__name__.effect.ts +11 -0
  87. package/lib/effect/schema.json +39 -0
  88. package/lib/filter/files/js/__name__.filter.js +6 -0
  89. package/lib/filter/files/js/__name__.filter.spec.js +7 -0
  90. package/lib/filter/files/ts/__name__.filter.spec.ts +7 -0
  91. package/lib/filter/files/ts/__name__.filter.ts +6 -0
  92. package/lib/filter/filter.factory.js +6 -6
  93. package/lib/filter/filter.factory.test.ts +147 -0
  94. package/lib/filter/filter.factory.ts +51 -0
  95. package/lib/filter/filter.schema.d.ts +28 -0
  96. package/lib/filter/schema.json +39 -0
  97. package/lib/gateway/files/js/__name__.gateway.js +9 -0
  98. package/lib/gateway/files/js/__name__.gateway.spec.js +18 -0
  99. package/lib/gateway/files/ts/__name__.gateway.spec.ts +18 -0
  100. package/lib/gateway/files/ts/__name__.gateway.ts +9 -0
  101. package/lib/gateway/gateway.factory.js +8 -8
  102. package/lib/gateway/gateway.factory.test.ts +147 -0
  103. package/lib/gateway/gateway.factory.ts +92 -0
  104. package/lib/gateway/gateway.schema.d.ts +36 -0
  105. package/lib/gateway/schema.json +39 -0
  106. package/lib/guard/files/js/__name__.guard.js +17 -0
  107. package/lib/guard/files/js/__name__.guard.spec.js +7 -0
  108. package/lib/guard/files/ts/__name__.guard.spec.ts +7 -0
  109. package/lib/guard/files/ts/__name__.guard.ts +17 -0
  110. package/lib/guard/guard.factory.js +6 -6
  111. package/lib/guard/guard.factory.test.ts +156 -0
  112. package/lib/guard/guard.factory.ts +51 -0
  113. package/lib/guard/guard.schema.d.ts +28 -0
  114. package/lib/guard/schema.json +39 -0
  115. package/lib/interceptor/files/js/__name__.interceptor.js +18 -0
  116. package/lib/interceptor/files/js/__name__.interceptor.spec.js +7 -0
  117. package/lib/interceptor/files/ts/__name__.interceptor.spec.ts +7 -0
  118. package/lib/interceptor/files/ts/__name__.interceptor.ts +19 -0
  119. package/lib/interceptor/interceptor.factory.js +6 -6
  120. package/lib/interceptor/interceptor.factory.test.ts +146 -0
  121. package/lib/interceptor/interceptor.factory.ts +51 -0
  122. package/lib/interceptor/interceptor.schema.d.ts +28 -0
  123. package/lib/interceptor/schema.json +39 -0
  124. package/lib/interface/files/__name__.interface.ts +1 -0
  125. package/lib/interface/interface.factory.js +5 -5
  126. package/lib/interface/interface.factory.test.ts +84 -0
  127. package/lib/interface/interface.factory.ts +47 -0
  128. package/lib/interface/interface.schema.d.ts +20 -0
  129. package/lib/interface/schema.json +31 -0
  130. package/lib/library/files/js/.babelrc +4 -0
  131. package/lib/library/files/js/jsconfig.json +9 -0
  132. package/lib/library/files/js/package.json +8 -0
  133. package/lib/library/files/js/src/__name__.module.js +8 -0
  134. package/lib/library/files/js/src/__name__.service.js +4 -0
  135. package/lib/library/files/js/src/__name__.service.spec.js +18 -0
  136. package/lib/library/files/js/src/index.js +2 -0
  137. package/lib/library/files/ts/package.json +8 -0
  138. package/lib/library/files/ts/src/__name__.module.ts +8 -0
  139. package/lib/library/files/ts/src/__name__.service.spec.ts +18 -0
  140. package/lib/library/files/ts/src/__name__.service.ts +4 -0
  141. package/lib/library/files/ts/src/index.ts +2 -0
  142. package/lib/library/files/ts/tsconfig.lib.json +5 -0
  143. package/lib/library/library.factory.js +12 -12
  144. package/lib/library/library.factory.test.ts +68 -0
  145. package/lib/library/library.factory.ts +158 -0
  146. package/lib/library/library.schema.d.ts +24 -0
  147. package/lib/library/schema.json +37 -0
  148. package/lib/module/files/js/__name__.module.js +4 -0
  149. package/lib/module/files/ts/__name__.module.ts +4 -0
  150. package/lib/module/module.factory.js +7 -7
  151. package/lib/module/module.factory.test.ts +165 -0
  152. package/lib/module/module.factory.ts +79 -0
  153. package/lib/module/module.schema.d.ts +36 -0
  154. package/lib/module/schema.json +40 -0
  155. package/lib/pipe/files/js/__name__.pipe.js +8 -0
  156. package/lib/pipe/files/js/__name__.pipe.spec.js +7 -0
  157. package/lib/pipe/files/ts/__name__.pipe.spec.ts +7 -0
  158. package/lib/pipe/files/ts/__name__.pipe.ts +8 -0
  159. package/lib/pipe/pipe.factory.js +6 -6
  160. package/lib/pipe/pipe.factory.test.ts +141 -0
  161. package/lib/pipe/pipe.factory.ts +51 -0
  162. package/lib/pipe/pipe.schema.d.ts +28 -0
  163. package/lib/pipe/schema.json +39 -0
  164. package/lib/plugin/files/js/__name__.plugin.js +28 -0
  165. package/lib/plugin/files/js/__name__.plugin.spec.js +7 -0
  166. package/lib/plugin/files/ts/__name__.plugin.spec.ts +7 -0
  167. package/lib/plugin/files/ts/__name__.plugin.ts +28 -0
  168. package/lib/plugin/plugin.factory.d.ts +2 -2
  169. package/lib/plugin/plugin.factory.js +1 -2
  170. package/lib/plugin/plugin.factory.test.ts +191 -0
  171. package/lib/plugin/plugin.factory.ts +91 -0
  172. package/lib/plugin/plugin.schema.d.ts +44 -0
  173. package/lib/plugin/schema.json +52 -0
  174. package/lib/provider/files/js/__name__.js +4 -0
  175. package/lib/provider/files/js/__name__.spec.js +17 -0
  176. package/lib/provider/files/ts/__name__.spec.ts +17 -0
  177. package/lib/provider/files/ts/__name__.ts +4 -0
  178. package/lib/provider/provider.factory.js +1 -2
  179. package/lib/provider/provider.factory.test.ts +151 -0
  180. package/lib/provider/provider.factory.ts +89 -0
  181. package/lib/provider/provider.schema.d.ts +44 -0
  182. package/lib/provider/schema.json +39 -0
  183. package/lib/resolver/files/js/__name__.resolver.js +4 -0
  184. package/lib/resolver/files/js/__name__.resolver.spec.js +18 -0
  185. package/lib/resolver/files/ts/__name__.resolver.spec.ts +18 -0
  186. package/lib/resolver/files/ts/__name__.resolver.ts +4 -0
  187. package/lib/resolver/resolver.factory.js +8 -8
  188. package/lib/resolver/resolver.factory.test.ts +117 -0
  189. package/lib/resolver/resolver.factory.ts +92 -0
  190. package/lib/resolver/resolver.schema.d.ts +36 -0
  191. package/lib/resolver/schema.json +39 -0
  192. package/lib/service/files/js/__name__.service.js +4 -0
  193. package/lib/service/files/js/__name__.service.spec.js +17 -0
  194. package/lib/service/files/ts/__name__.service.spec.ts +17 -0
  195. package/lib/service/files/ts/__name__.service.ts +4 -0
  196. package/lib/service/schema.json +39 -0
  197. package/lib/service/service.factory.js +9 -9
  198. package/lib/service/service.factory.test.ts +190 -0
  199. package/lib/service/service.factory.ts +91 -0
  200. package/lib/service/service.schema.d.ts +44 -0
  201. package/lib/type/files/js/__name__.type.js +10 -0
  202. package/lib/type/files/ts/__name__.type.ts +10 -0
  203. package/lib/type/schema.json +43 -0
  204. package/lib/type/type.factory.d.ts +1 -1
  205. package/lib/type/type.factory.js +1 -2
  206. package/lib/type/type.factory.test.ts +191 -0
  207. package/lib/type/type.factory.ts +91 -0
  208. package/lib/type/type.schema.d.ts +44 -0
  209. package/package.json +2 -2
  210. package/utils/metadata.manager.js +1 -1
  211. package/utils/metadata.manager.ts +219 -0
  212. package/utils/module-import.declarator.js +2 -2
  213. package/utils/module-import.declarator.ts +41 -0
  214. package/utils/module-metadata.declarator.ts +14 -0
  215. package/utils/module.declarator.js +2 -2
  216. package/utils/module.declarator.ts +41 -0
  217. package/utils/module.finder.js +1 -1
  218. package/utils/module.finder.ts +32 -0
  219. package/utils/name.parser.js +3 -3
  220. package/utils/name.parser.ts +29 -0
  221. package/utils/path.solver.js +2 -2
  222. package/utils/path.solver.ts +17 -0
  223. package/utils/source-root.helpers.js +2 -2
  224. package/utils/source-root.helpers.ts +30 -0
@@ -0,0 +1,25 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { AbstractHttpAdapter } from '@nestjs/core';
3
+ import { loadPackage } from '../angular.utils';
4
+ import { AngularModuleOptions } from '../interfaces/angular-options.interface';
5
+ import { AbstractLoader } from './abstract.loader';
6
+
7
+ @Injectable()
8
+ export class ExpressLoader extends AbstractLoader {
9
+ public register(
10
+ httpAdapter: AbstractHttpAdapter,
11
+ options: AngularModuleOptions,
12
+ ) {
13
+ const app = httpAdapter.getInstance();
14
+ const express = loadPackage('express', 'AngularModule', () =>
15
+ require('express'),
16
+ );
17
+ const clientPath = options.rootPath;
18
+ const indexFilePath = this.getIndexFilePath(clientPath);
19
+
20
+ app.use(express.static(clientPath, options.serveStaticOptions));
21
+ app.get(options.renderPath, (req: any, res: any) =>
22
+ res.sendFile(indexFilePath),
23
+ );
24
+ }
25
+ }
@@ -0,0 +1,34 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { AbstractHttpAdapter } from '@nestjs/core';
3
+ import * as fs from 'fs';
4
+ import { loadPackage } from '../angular.utils';
5
+ import { AngularModuleOptions } from '../interfaces/angular-options.interface';
6
+ import { AbstractLoader } from './abstract.loader';
7
+
8
+ @Injectable()
9
+ export class FastifyLoader extends AbstractLoader {
10
+ public register(
11
+ httpAdapter: AbstractHttpAdapter,
12
+ options: AngularModuleOptions,
13
+ ) {
14
+ const app = httpAdapter.getInstance();
15
+ const fastifyStatic = loadPackage('fastify-static', 'AngularModule', () =>
16
+ require('fastify-static'),
17
+ );
18
+ const { setHeaders, redirect, ...send } =
19
+ options.serveStaticOptions || ({} as any);
20
+ const clientPath = options.rootPath;
21
+ const indexFilePath = this.getIndexFilePath(clientPath);
22
+
23
+ app.register(fastifyStatic, {
24
+ root: clientPath,
25
+ setHeaders,
26
+ redirect,
27
+ send,
28
+ });
29
+ app.get(options.renderPath, (req: any, res: any) => {
30
+ const stream = fs.createReadStream(indexFilePath);
31
+ res.type('text/html').send(stream);
32
+ });
33
+ }
34
+ }
@@ -0,0 +1,12 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { AbstractHttpAdapter } from '@nestjs/core';
3
+ import { AngularModuleOptions } from '../interfaces/angular-options.interface';
4
+ import { AbstractLoader } from './abstract.loader';
5
+
6
+ @Injectable()
7
+ export class NoopLoader extends AbstractLoader {
8
+ public register(
9
+ httpAdapter: AbstractHttpAdapter,
10
+ options: AngularModuleOptions,
11
+ ) {}
12
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "http://json-schema.org/schema",
3
+ "id": "SchematicsNestModule",
4
+ "title": "Nest Module Options Schema",
5
+ "type": "object",
6
+ "properties": {
7
+ "name": {
8
+ "type": "string",
9
+ "description": "The name of the application.",
10
+ "$default": {
11
+ "$source": "argv",
12
+ "index": 0
13
+ },
14
+ "x-prompt": "What name would you like to use for Angular application?"
15
+ },
16
+ "initApp": {
17
+ "type": "boolean",
18
+ "description": "Flag to skip the angular application generation.",
19
+ "default": false,
20
+ "x-prompt": "Would you like to initialize Angular application?"
21
+ }
22
+ },
23
+ "required": ["name"]
24
+ }
@@ -13,9 +13,9 @@ const ELEMENT_TYPE = 'component';
13
13
  function main(options) {
14
14
  options = transform(options);
15
15
  return (tree, context) => {
16
- return schematics_1.branchAndMerge(schematics_1.chain([
17
- source_root_helpers_1.mergeSourceRoot(options),
18
- schematics_1.mergeWith(generate(options)),
16
+ return (0, schematics_1.branchAndMerge)((0, schematics_1.chain)([
17
+ (0, source_root_helpers_1.mergeSourceRoot)(options),
18
+ (0, schematics_1.mergeWith)(generate(options)),
19
19
  addDeclarationToModule(options),
20
20
  ]))(tree, context);
21
21
  };
@@ -32,14 +32,14 @@ function transform(source) {
32
32
  target.language !== undefined ? target.language : defaults_1.DEFAULT_LANGUAGE;
33
33
  target.path = target.flat
34
34
  ? target.path
35
- : core_1.join(target.path, target.name);
35
+ : (0, core_1.join)(target.path, target.name);
36
36
  return target;
37
37
  }
38
38
  function generate(options) {
39
- return (context) => schematics_1.apply(schematics_1.url(core_1.join('./files', options.language)), [
40
- options.spec ? schematics_1.noop() : schematics_1.filter(path => !path.endsWith('.spec.ts')),
41
- schematics_1.template(Object.assign(Object.assign({}, core_1.strings), options)),
42
- schematics_1.move(options.path),
39
+ return (context) => (0, schematics_1.apply)((0, schematics_1.url)((0, core_1.join)('./files', options.language)), [
40
+ options.spec ? (0, schematics_1.noop)() : (0, schematics_1.filter)(path => !path.endsWith('.spec.ts')),
41
+ (0, schematics_1.template)(Object.assign(Object.assign({}, core_1.strings), options)),
42
+ (0, schematics_1.move)(options.path),
43
43
  ])(context);
44
44
  }
45
45
  function addDeclarationToModule(options) {
@@ -0,0 +1,191 @@
1
+ import { normalize } from '@angular-devkit/core';
2
+ import {
3
+ SchematicTestRunner,
4
+ UnitTestTree,
5
+ } from '@angular-devkit/schematics/testing';
6
+ import * as path from 'path';
7
+ import { ApplicationOptions } from '../application/application.schema';
8
+ import { ModuleOptions } from '../module/module.schema';
9
+ import { ControllerOptions } from './component.schema';
10
+
11
+ describe('Controller Factory', () => {
12
+ const runner: SchematicTestRunner = new SchematicTestRunner(
13
+ '.',
14
+ path.join(process.cwd(), 'src/collection.json'),
15
+ );
16
+ it('should manage name only', () => {
17
+ const options: ControllerOptions = {
18
+ name: 'foo',
19
+ skipImport: true,
20
+ spec: false,
21
+ flat: false,
22
+ };
23
+ const tree: UnitTestTree = runner.runSchematic('controller', options);
24
+ const files: string[] = tree.files;
25
+
26
+ expect(
27
+ files.find(filename => filename === '/foo/foo.controller.ts'),
28
+ ).toBeDefined();
29
+ expect(
30
+ files.find(filename => filename === '/foo/foo.controller.spec.ts'),
31
+ ).not.toBeDefined();
32
+ expect(tree.readContent('/foo/foo.controller.ts')).toEqual(
33
+ "import { Component } from '@rxdi/core';\n" +
34
+ '\n' +
35
+ "@Component('foo')\n" +
36
+ 'export class FooController {}\n',
37
+ );
38
+ });
39
+ it('should manage name has a path', () => {
40
+ const options: ControllerOptions = {
41
+ name: 'bar/foo',
42
+ skipImport: true,
43
+ };
44
+ const tree: UnitTestTree = runner.runSchematic('controller', options);
45
+ const files: string[] = tree.files;
46
+ expect(
47
+ files.find(filename => filename === '/bar/foo/foo.controller.ts'),
48
+ ).toBeDefined();
49
+ expect(
50
+ files.find(filename => filename === '/bar/foo/foo.controller.spec.ts'),
51
+ ).toBeDefined();
52
+ expect(tree.readContent('/bar/foo/foo.controller.ts')).toEqual(
53
+ "import { Controller } from '@nestjs/common';\n" +
54
+ '\n' +
55
+ "@Controller('foo')\n" +
56
+ 'export class FooController {}\n',
57
+ );
58
+ });
59
+ it('should manage name and path', () => {
60
+ const options: ControllerOptions = {
61
+ name: 'foo',
62
+ path: 'bar',
63
+ skipImport: true,
64
+ };
65
+ const tree: UnitTestTree = runner.runSchematic('controller', options);
66
+ const files: string[] = tree.files;
67
+ expect(
68
+ files.find(filename => filename === '/bar/foo/foo.controller.ts'),
69
+ ).toBeDefined();
70
+ expect(
71
+ files.find(filename => filename === '/bar/foo/foo.controller.spec.ts'),
72
+ ).toBeDefined();
73
+ expect(tree.readContent('/bar/foo/foo.controller.ts')).toEqual(
74
+ "import { Controller } from '@nestjs/common';\n" +
75
+ '\n' +
76
+ "@Controller('foo')\n" +
77
+ 'export class FooController {}\n',
78
+ );
79
+ });
80
+ it('should manage name to dasherize', () => {
81
+ const options: ControllerOptions = {
82
+ name: 'fooBar',
83
+ skipImport: true,
84
+ };
85
+ const tree: UnitTestTree = runner.runSchematic('controller', options);
86
+ const files: string[] = tree.files;
87
+ expect(
88
+ files.find(filename => filename === '/foo-bar/foo-bar.controller.ts'),
89
+ ).toBeDefined();
90
+ expect(
91
+ files.find(
92
+ filename => filename === '/foo-bar/foo-bar.controller.spec.ts',
93
+ ),
94
+ ).toBeDefined();
95
+ expect(tree.readContent('/foo-bar/foo-bar.controller.ts')).toEqual(
96
+ "import { Controller } from '@nestjs/common';\n" +
97
+ '\n' +
98
+ "@Controller('foo-bar')\n" +
99
+ 'export class FooBarController {}\n',
100
+ );
101
+ });
102
+ it('should manage path to dasherize', () => {
103
+ const options: ControllerOptions = {
104
+ name: 'barBaz/foo',
105
+ skipImport: true,
106
+ };
107
+ const tree: UnitTestTree = runner.runSchematic('controller', options);
108
+ const files: string[] = tree.files;
109
+ expect(
110
+ files.find(filename => filename === '/bar-baz/foo/foo.controller.ts'),
111
+ ).toBeDefined();
112
+ expect(
113
+ files.find(
114
+ filename => filename === '/bar-baz/foo/foo.controller.spec.ts',
115
+ ),
116
+ ).toBeDefined();
117
+ expect(tree.readContent('/bar-baz/foo/foo.controller.ts')).toEqual(
118
+ "import { Controller } from '@nestjs/common';\n" +
119
+ '\n' +
120
+ "@Controller('foo')\n" +
121
+ 'export class FooController {}\n',
122
+ );
123
+ });
124
+ it('should manage javascript file', () => {
125
+ const options: ControllerOptions = {
126
+ name: 'foo',
127
+ language: 'js',
128
+ skipImport: true,
129
+ };
130
+ const tree: UnitTestTree = runner.runSchematic('controller', options);
131
+ const files: string[] = tree.files;
132
+ expect(
133
+ files.find(filename => filename === '/foo/foo.controller.js'),
134
+ ).toBeDefined();
135
+ expect(
136
+ files.find(filename => filename === '/foo/foo.controller.spec.js'),
137
+ ).toBeDefined();
138
+ expect(tree.readContent('/foo/foo.controller.js')).toEqual(
139
+ "import { Controller } from '@nestjs/common';\n" +
140
+ '\n' +
141
+ "@Controller('foo')\n" +
142
+ 'export class FooController {}\n',
143
+ );
144
+ });
145
+ it('should manage declaration in app module', () => {
146
+ const app: ApplicationOptions = {
147
+ name: '',
148
+ };
149
+ let tree: UnitTestTree = runner.runSchematic('application', app);
150
+ const options: ControllerOptions = {
151
+ name: 'foo',
152
+ };
153
+ tree = runner.runSchematic('controller', options, tree);
154
+ expect(tree.readContent(normalize('/src/app.module.ts'))).toEqual(
155
+ "import { Module } from '@nestjs/common';\n" +
156
+ "import { AppController } from './app.controller';\n" +
157
+ "import { AppService } from './app.service';\n" +
158
+ "import { FooController } from './foo/foo.controller';\n" +
159
+ '\n' +
160
+ '@Module({\n' +
161
+ ' imports: [],\n' +
162
+ ' controllers: [AppController, FooController],\n' +
163
+ ' providers: [AppService],\n' +
164
+ '})\n' +
165
+ 'export class AppModule {}\n',
166
+ );
167
+ });
168
+ it('should manage declaration in foo module', () => {
169
+ const app: ApplicationOptions = {
170
+ name: '',
171
+ };
172
+ let tree: UnitTestTree = runner.runSchematic('application', app);
173
+ const module: ModuleOptions = {
174
+ name: 'foo',
175
+ };
176
+ tree = runner.runSchematic('module', module, tree);
177
+ const options: ControllerOptions = {
178
+ name: 'foo',
179
+ };
180
+ tree = runner.runSchematic('controller', options, tree);
181
+ expect(tree.readContent(normalize('/src/foo/foo.module.ts'))).toEqual(
182
+ "import { Module } from '@nestjs/common';\n" +
183
+ "import { FooController } from './foo.controller';\n" +
184
+ '\n' +
185
+ '@Module({\n' +
186
+ ' controllers: [FooController]\n' +
187
+ '})\n' +
188
+ 'export class FooModule {}\n',
189
+ );
190
+ });
191
+ });
@@ -0,0 +1,91 @@
1
+ import { join, Path, strings } from '@angular-devkit/core';
2
+ import {
3
+ apply,
4
+ branchAndMerge,
5
+ chain,
6
+ filter,
7
+ mergeWith,
8
+ move,
9
+ noop,
10
+ Rule,
11
+ SchematicContext,
12
+ template,
13
+ Tree,
14
+ url,
15
+ } from '@angular-devkit/schematics';
16
+ import {
17
+ DeclarationOptions,
18
+ ModuleDeclarator,
19
+ } from '../../utils/module.declarator';
20
+ import { ModuleFinder } from '../../utils/module.finder';
21
+ import { Location, NameParser } from '../../utils/name.parser';
22
+ import { mergeSourceRoot } from '../../utils/source-root.helpers';
23
+ import { DEFAULT_LANGUAGE } from '../defaults';
24
+ import { ControllerOptions } from './component.schema';
25
+
26
+ const ELEMENT_METADATA = 'components';
27
+ const ELEMENT_TYPE = 'component';
28
+
29
+ export function main(options: ControllerOptions): Rule {
30
+ options = transform(options);
31
+ return (tree: Tree, context: SchematicContext) => {
32
+ return branchAndMerge(
33
+ chain([
34
+ mergeSourceRoot(options),
35
+ mergeWith(generate(options)),
36
+ addDeclarationToModule(options),
37
+ ]),
38
+ )(tree, context);
39
+ };
40
+ }
41
+
42
+ function transform(source: ControllerOptions): ControllerOptions {
43
+ const target: ControllerOptions = Object.assign({}, source);
44
+ target.metadata = ELEMENT_METADATA;
45
+ target.type = ELEMENT_TYPE;
46
+
47
+ const location: Location = new NameParser().parse(target);
48
+ target.name = strings.dasherize(location.name);
49
+ target.path = strings.dasherize(location.path);
50
+ target.language =
51
+ target.language !== undefined ? target.language : DEFAULT_LANGUAGE;
52
+
53
+ target.path = target.flat
54
+ ? target.path
55
+ : join(target.path as Path, target.name);
56
+ return target;
57
+ }
58
+
59
+ function generate(options: ControllerOptions) {
60
+ return (context: SchematicContext) =>
61
+ apply(url(join('./files' as Path, options.language)), [
62
+ options.spec ? noop() : filter(path => !path.endsWith('.spec.ts')),
63
+ template({
64
+ ...strings,
65
+ ...options,
66
+ }),
67
+ move(options.path),
68
+ ])(context);
69
+ }
70
+
71
+ function addDeclarationToModule(options: ControllerOptions): Rule {
72
+ return (tree: Tree) => {
73
+ if (options.skipImport !== undefined && options.skipImport) {
74
+ return tree;
75
+ }
76
+ options.module = new ModuleFinder(tree).find({
77
+ name: options.name,
78
+ path: options.path as Path,
79
+ });
80
+ if (!options.module) {
81
+ return tree;
82
+ }
83
+ const content = tree.read(options.module).toString();
84
+ const declarator: ModuleDeclarator = new ModuleDeclarator();
85
+ tree.overwrite(
86
+ options.module,
87
+ declarator.declare(content, options as DeclarationOptions),
88
+ );
89
+ return tree;
90
+ };
91
+ }
@@ -0,0 +1,44 @@
1
+ import { Path } from '@angular-devkit/core';
2
+
3
+ export interface ControllerOptions {
4
+ /**
5
+ * The name of the controller.
6
+ */
7
+ name: string;
8
+ /**
9
+ * The path to create the controller.
10
+ */
11
+ path?: string | Path;
12
+ /**
13
+ * The path to insert the controller declaration.
14
+ */
15
+ module?: Path;
16
+ /**
17
+ * Directive to insert declaration in module.
18
+ */
19
+ skipImport?: boolean;
20
+ /**
21
+ * Metadata name affected by declaration insertion.
22
+ */
23
+ metadata?: string;
24
+ /**
25
+ * Nest element type name
26
+ */
27
+ type?: string;
28
+ /**
29
+ * Application language.
30
+ */
31
+ language?: string;
32
+ /**
33
+ * The source root path
34
+ */
35
+ sourceRoot?: string;
36
+ /**
37
+ * Specifies if a spec file is generated.
38
+ */
39
+ spec?: boolean;
40
+ /**
41
+ * Flag to indicate if a directory is created.
42
+ */
43
+ flat?: boolean;
44
+ }
@@ -0,0 +1,56 @@
1
+ import {
2
+ html,
3
+ Component,
4
+ async,
5
+ LitElement,
6
+ property,
7
+ OnInit,
8
+ OnDestroy,
9
+ OnUpdate,
10
+ queryAll
11
+ } from '@rxdi/lit-html';
12
+ import { timer } from 'rxjs';
13
+ import { map } from 'rxjs/operators';
14
+ import { RouteParams } from '@rxdi/router';
15
+
16
+ /**
17
+ * @customElement '<%= dasherize(name) %>-component'
18
+ */
19
+ @Component({
20
+ selector: '<%= dasherize(name) %>-component',
21
+ template(this: <%= classify(name) %>Component) {
22
+ return html`
23
+ <header>
24
+ <h1>${this.name}</h1>
25
+ </header>
26
+ ${async(this.timer)} ${JSON.stringify(this.params)}
27
+ <div>
28
+ 1
29
+ </div>
30
+ <div>
31
+ 2
32
+ </div>
33
+ `;
34
+ }
35
+ })
36
+ export class <%= classify(name) %>Component extends LitElement implements OnInit, OnDestroy, OnUpdate {
37
+ @property() private name: string;
38
+
39
+ @RouteParams() private params: any;
40
+
41
+ @queryAll('div') private divs: HTMLElement[];
42
+
43
+ private timer = timer(1, 1000).pipe(map(v => v));
44
+
45
+ OnInit() {
46
+ console.log('<%= classify(name) %>Component component init');
47
+ }
48
+
49
+ OnDestroy() {
50
+ console.log('<%= classify(name) %>Component component destroyed');
51
+ }
52
+
53
+ OnUpdate() {
54
+ console.log('<%= classify(name) %>Component component updated');
55
+ }
56
+ }
@@ -0,0 +1,31 @@
1
+ import { Container, createTestBed } from '@rxdi/core';
2
+ import { <%= classify(name) %>Component } from './<%= name %>.component';
3
+
4
+
5
+ describe('<%= classify(name) %>Component', () => {
6
+ beforeAll(async () => {
7
+ await createTestBed({
8
+ components: [<%= classify(name) %>Component]
9
+ }).toPromise();
10
+ });
11
+
12
+ afterEach(() => {
13
+ // The jsdom instance is shared across test cases in a single file so reset the DOM
14
+ while (document.body.firstChild) {
15
+ document.body.removeChild(document.body.firstChild);
16
+ }
17
+ });
18
+
19
+ it('should be defined', done => {
20
+ expect(Container.has(<%= classify(name) %>Component)).toBeTruthy();
21
+ done();
22
+ });
23
+
24
+ it('displays greeting', () => {
25
+ const element = Container.get(<%= classify(name) %>Component);
26
+ element['render']();
27
+ document.body.appendChild(element);
28
+ const div = document.querySelector('<%= dasherize(name) %>-component');
29
+ expect(div.textContent).toBe('');
30
+ });
31
+ });
@@ -0,0 +1,31 @@
1
+ import { Container, createTestBed } from '@rxdi/core';
2
+ import { <%= classify(name) %>Component } from './<%= name %>.component';
3
+
4
+
5
+ describe('<%= classify(name) %>Component', () => {
6
+ beforeAll(async () => {
7
+ await createTestBed({
8
+ components: [<%= classify(name) %>Component]
9
+ }).toPromise();
10
+ });
11
+
12
+ afterEach(() => {
13
+ // The jsdom instance is shared across test cases in a single file so reset the DOM
14
+ while (document.body.firstChild) {
15
+ document.body.removeChild(document.body.firstChild);
16
+ }
17
+ });
18
+
19
+ it('should be defined', done => {
20
+ expect(Container.has(<%= classify(name) %>Component)).toBeTruthy();
21
+ done();
22
+ });
23
+
24
+ it('displays greeting', () => {
25
+ const element = Container.get(<%= classify(name) %>Component);
26
+ element['render']();
27
+ document.body.appendChild(element);
28
+ const div = document.querySelector('<%= dasherize(name) %>-component');
29
+ expect(div.textContent).toBe('');
30
+ });
31
+ });
@@ -0,0 +1,56 @@
1
+ import {
2
+ html,
3
+ Component,
4
+ async,
5
+ LitElement,
6
+ property,
7
+ OnInit,
8
+ OnDestroy,
9
+ OnUpdate,
10
+ queryAll
11
+ } from '@rxdi/lit-html';
12
+ import { timer } from 'rxjs';
13
+ import { map } from 'rxjs/operators';
14
+ import { RouteParams } from '@rxdi/router';
15
+
16
+ /**
17
+ * @customElement '<%= dasherize(name) %>-component'
18
+ */
19
+ @Component({
20
+ selector: '<%= dasherize(name) %>-component',
21
+ template(this: <%= classify(name) %>Component) {
22
+ return html`
23
+ <header>
24
+ <h1>${this.name}</h1>
25
+ </header>
26
+ ${async(this.timer)} ${JSON.stringify(this.params)}
27
+ <div>
28
+ 1
29
+ </div>
30
+ <div>
31
+ 2
32
+ </div>
33
+ `;
34
+ }
35
+ })
36
+ export class <%= classify(name) %>Component extends LitElement implements OnInit, OnDestroy, OnUpdate {
37
+ @property() private name: string;
38
+
39
+ @RouteParams() private params: any;
40
+
41
+ @queryAll('div') private divs: HTMLElement[];
42
+
43
+ private timer = timer(1, 1000).pipe(map(v => v));
44
+
45
+ OnInit() {
46
+ console.log('<%= classify(name) %>Component component init');
47
+ }
48
+
49
+ OnDestroy() {
50
+ console.log('<%= classify(name) %>Component component destroyed');
51
+ }
52
+
53
+ OnUpdate() {
54
+ console.log('<%= classify(name) %>Component component updated');
55
+ }
56
+ }
@@ -0,0 +1,47 @@
1
+ {
2
+ "$schema": "http://json-schema.org/schema",
3
+ "id": "SchematicsNestController",
4
+ "title": "@rxdi/core Component Options Schema",
5
+ "type": "object",
6
+ "properties": {
7
+ "name": {
8
+ "type": "string",
9
+ "description": "The name of the controller.",
10
+ "$default": {
11
+ "$source": "argv",
12
+ "index": 0
13
+ },
14
+ "x-prompt": "What name would you like to use for the controller?"
15
+ },
16
+ "path": {
17
+ "type": "string",
18
+ "format": "path",
19
+ "description": "The path to create the controller."
20
+ },
21
+ "language": {
22
+ "type": "string",
23
+ "description": "Nest controller language (ts/js)."
24
+ },
25
+ "sourceRoot": {
26
+ "type": "string",
27
+ "description": "Nest controller source root directory."
28
+ },
29
+ "skipImport": {
30
+ "description": "Flag to skip the module import.",
31
+ "default": false
32
+ },
33
+ "module": {
34
+ "type": "string",
35
+ "description": "Allows specification of the declaring module."
36
+ },
37
+ "flat": {
38
+ "default": false,
39
+ "description": "Flag to indicate if a directory is created."
40
+ },
41
+ "spec": {
42
+ "default": true,
43
+ "description": "Specifies if a spec file is generated."
44
+ }
45
+ },
46
+ "required": ["name"]
47
+ }