@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,47 @@
1
+ {
2
+ "$schema": "http://json-schema.org/schema",
3
+ "id": "SchematicsNestController",
4
+ "title": "Nest Controller 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
+ }
@@ -7,7 +7,7 @@ const name_parser_1 = require("../../utils/name.parser");
7
7
  const source_root_helpers_1 = require("../../utils/source-root.helpers");
8
8
  function main(options) {
9
9
  options = transform(options);
10
- return schematics_1.chain([source_root_helpers_1.mergeSourceRoot(options), schematics_1.mergeWith(generate(options))]);
10
+ return (0, schematics_1.chain)([(0, source_root_helpers_1.mergeSourceRoot)(options), (0, schematics_1.mergeWith)(generate(options))]);
11
11
  }
12
12
  exports.main = main;
13
13
  function transform(options) {
@@ -21,12 +21,12 @@ function transform(options) {
21
21
  target.language = target.language !== undefined ? target.language : 'ts';
22
22
  target.path = target.flat
23
23
  ? target.path
24
- : core_1.join(target.path, target.name);
24
+ : (0, core_1.join)(target.path, target.name);
25
25
  return target;
26
26
  }
27
27
  function generate(options) {
28
- return (context) => schematics_1.apply(schematics_1.url(core_1.join('./files', options.language)), [
29
- schematics_1.template(Object.assign(Object.assign({}, core_1.strings), options)),
30
- schematics_1.move(options.path),
28
+ return (context) => (0, schematics_1.apply)((0, schematics_1.url)((0, core_1.join)('./files', options.language)), [
29
+ (0, schematics_1.template)(Object.assign(Object.assign({}, core_1.strings), options)),
30
+ (0, schematics_1.move)(options.path),
31
31
  ])(context);
32
32
  }
@@ -0,0 +1,111 @@
1
+ import {
2
+ SchematicTestRunner,
3
+ UnitTestTree,
4
+ } from '@angular-devkit/schematics/testing';
5
+ import * as path from 'path';
6
+ import { DecoratorOptions } from './decorator.schema';
7
+
8
+ describe('Decorator Factory', () => {
9
+ const runner: SchematicTestRunner = new SchematicTestRunner(
10
+ '.',
11
+ path.join(process.cwd(), 'src/collection.json'),
12
+ );
13
+ it('should manage name only', () => {
14
+ const options: DecoratorOptions = {
15
+ name: 'foo',
16
+ flat: false,
17
+ };
18
+ const tree: UnitTestTree = runner.runSchematic('decorator', options);
19
+ const files: string[] = tree.files;
20
+ expect(
21
+ files.find(filename => filename === '/foo/foo.decorator.ts'),
22
+ ).not.toBeUndefined();
23
+ expect(tree.readContent('/foo/foo.decorator.ts')).toEqual(
24
+ "import { ReflectMetadata } from '@nestjs/common';\n" +
25
+ '\n' +
26
+ "export const Foo = (...args: string[]) => ReflectMetadata('foo', args);\n",
27
+ );
28
+ });
29
+ it('should manage name as a path', () => {
30
+ const options: DecoratorOptions = {
31
+ name: 'bar/foo',
32
+ flat: false,
33
+ };
34
+ const tree: UnitTestTree = runner.runSchematic('decorator', options);
35
+ const files: string[] = tree.files;
36
+ expect(
37
+ files.find(filename => filename === '/bar/foo/foo.decorator.ts'),
38
+ ).not.toBeUndefined();
39
+ expect(tree.readContent('/bar/foo/foo.decorator.ts')).toEqual(
40
+ "import { ReflectMetadata } from '@nestjs/common';\n" +
41
+ '\n' +
42
+ "export const Foo = (...args: string[]) => ReflectMetadata('foo', args);\n",
43
+ );
44
+ });
45
+ it('should manage name and path', () => {
46
+ const options: DecoratorOptions = {
47
+ name: 'foo',
48
+ path: 'baz',
49
+ flat: false,
50
+ };
51
+ const tree: UnitTestTree = runner.runSchematic('decorator', options);
52
+ const files: string[] = tree.files;
53
+ expect(
54
+ files.find(filename => filename === '/baz/foo/foo.decorator.ts'),
55
+ ).not.toBeUndefined();
56
+ expect(tree.readContent('/baz/foo/foo.decorator.ts')).toEqual(
57
+ "import { ReflectMetadata } from '@nestjs/common';\n" +
58
+ '\n' +
59
+ "export const Foo = (...args: string[]) => ReflectMetadata('foo', args);\n",
60
+ );
61
+ });
62
+ it('should manage name to dasherize', () => {
63
+ const options: DecoratorOptions = {
64
+ name: 'fooBar',
65
+ flat: false,
66
+ };
67
+ const tree: UnitTestTree = runner.runSchematic('decorator', options);
68
+ const files: string[] = tree.files;
69
+ expect(
70
+ files.find(filename => filename === '/foo-bar/foo-bar.decorator.ts'),
71
+ ).not.toBeUndefined();
72
+ expect(tree.readContent('/foo-bar/foo-bar.decorator.ts')).toEqual(
73
+ "import { ReflectMetadata } from '@nestjs/common';\n" +
74
+ '\n' +
75
+ "export const FooBar = (...args: string[]) => ReflectMetadata('foo-bar', args);\n",
76
+ );
77
+ });
78
+ it('should manage path to dasherize', () => {
79
+ const options: DecoratorOptions = {
80
+ name: 'barBaz/foo',
81
+ flat: false,
82
+ };
83
+ const tree: UnitTestTree = runner.runSchematic('decorator', options);
84
+ const files: string[] = tree.files;
85
+ expect(
86
+ files.find(filename => filename === '/bar-baz/foo/foo.decorator.ts'),
87
+ ).not.toBeUndefined();
88
+ expect(tree.readContent('/bar-baz/foo/foo.decorator.ts')).toEqual(
89
+ "import { ReflectMetadata } from '@nestjs/common';\n" +
90
+ '\n' +
91
+ "export const Foo = (...args: string[]) => ReflectMetadata('foo', args);\n",
92
+ );
93
+ });
94
+ it('should manage javascript file', () => {
95
+ const options: DecoratorOptions = {
96
+ name: 'foo',
97
+ language: 'js',
98
+ flat: false,
99
+ };
100
+ const tree: UnitTestTree = runner.runSchematic('decorator', options);
101
+ const files: string[] = tree.files;
102
+ expect(
103
+ files.find(filename => filename === '/foo/foo.decorator.js'),
104
+ ).not.toBeUndefined();
105
+ expect(tree.readContent('/foo/foo.decorator.js')).toEqual(
106
+ "import { ReflectMetadata } from '@nestjs/common';\n" +
107
+ '\n' +
108
+ "export const Foo = (...args) => ReflectMetadata('foo', args);\n",
109
+ );
110
+ });
111
+ });
@@ -0,0 +1,48 @@
1
+ import { join, Path, strings } from '@angular-devkit/core';
2
+ import {
3
+ apply,
4
+ chain,
5
+ mergeWith,
6
+ move,
7
+ Rule,
8
+ SchematicContext,
9
+ SchematicsException,
10
+ Source,
11
+ template,
12
+ url,
13
+ } from '@angular-devkit/schematics';
14
+ import { Location, NameParser } from '../../utils/name.parser';
15
+ import { mergeSourceRoot } from '../../utils/source-root.helpers';
16
+ import { DecoratorOptions } from './decorator.schema';
17
+
18
+ export function main(options: DecoratorOptions): Rule {
19
+ options = transform(options);
20
+ return chain([mergeSourceRoot(options), mergeWith(generate(options))]);
21
+ }
22
+
23
+ function transform(options: DecoratorOptions): DecoratorOptions {
24
+ const target: DecoratorOptions = Object.assign({}, options);
25
+ if (!target.name) {
26
+ throw new SchematicsException('Option (name) is required.');
27
+ }
28
+ const location: Location = new NameParser().parse(target);
29
+ target.name = strings.dasherize(location.name);
30
+ target.path = strings.dasherize(location.path);
31
+ target.language = target.language !== undefined ? target.language : 'ts';
32
+
33
+ target.path = target.flat
34
+ ? target.path
35
+ : join(target.path as Path, target.name);
36
+ return target;
37
+ }
38
+
39
+ function generate(options: DecoratorOptions): Source {
40
+ return (context: SchematicContext) =>
41
+ apply(url(join('./files' as Path, options.language)), [
42
+ template({
43
+ ...strings,
44
+ ...options,
45
+ }),
46
+ move(options.path),
47
+ ])(context);
48
+ }
@@ -0,0 +1,24 @@
1
+ import { Path } from '@angular-devkit/core';
2
+
3
+ export interface DecoratorOptions {
4
+ /**
5
+ * The name of the decorator.
6
+ */
7
+ name: string;
8
+ /**
9
+ * The path to create the decorator.
10
+ */
11
+ path?: string | Path;
12
+ /**
13
+ * Application language.
14
+ */
15
+ language?: string;
16
+ /**
17
+ * The source root path
18
+ */
19
+ sourceRoot?: string;
20
+ /**
21
+ * Flag to indicate if a directory is created.
22
+ */
23
+ flat?: boolean;
24
+ }
@@ -0,0 +1,3 @@
1
+ import { ReflectMetadata } from '@nestjs/common';
2
+
3
+ export const <%= classify(name) %> = (...args) => ReflectMetadata('<%= name %>', args);
@@ -0,0 +1,3 @@
1
+ import { ReflectMetadata } from '@nestjs/common';
2
+
3
+ export const <%= classify(name) %> = (...args: string[]) => ReflectMetadata('<%= name %>', args);
@@ -0,0 +1,35 @@
1
+ {
2
+ "$schema": "http://json-schema.org/schema",
3
+ "id": "SchematicsNestDecorator",
4
+ "title": "Nest Decorator Options Schema",
5
+ "type": "object",
6
+ "properties": {
7
+ "name": {
8
+ "type": "string",
9
+ "description": "The name of the decorator.",
10
+ "$default": {
11
+ "$source": "argv",
12
+ "index": 0
13
+ },
14
+ "x-prompt": "What name would you like to use for the decorator?"
15
+ },
16
+ "path": {
17
+ "type": "string",
18
+ "format": "path",
19
+ "description": "The path to create the decorator."
20
+ },
21
+ "language": {
22
+ "type": "string",
23
+ "description": "Nest decorator language (ts/js)."
24
+ },
25
+ "sourceRoot": {
26
+ "type": "string",
27
+ "description": "Nest decorator source root directory."
28
+ },
29
+ "flat": {
30
+ "default": true,
31
+ "description": "Flag to indicate if a directory is created."
32
+ }
33
+ },
34
+ "required": ["name"]
35
+ }
@@ -0,0 +1,6 @@
1
+ export const DEFAULT_AUTHOR = '';
2
+ export const DEFAULT_DESCRIPTION = '';
3
+ export const DEFAULT_LANGUAGE = 'ts';
4
+ export const DEFAULT_VERSION = '0.0.1';
5
+ export const DEFAULT_PATH_NAME = 'src';
6
+ export const DEFAULT_LIB_PATH = 'libs';
@@ -11,10 +11,10 @@ const source_root_helpers_1 = require("../../utils/source-root.helpers");
11
11
  function main(options) {
12
12
  options = transform(options);
13
13
  return (tree, context) => {
14
- return schematics_1.branchAndMerge(schematics_1.chain([
15
- source_root_helpers_1.mergeSourceRoot(options),
14
+ return (0, schematics_1.branchAndMerge)((0, schematics_1.chain)([
15
+ (0, source_root_helpers_1.mergeSourceRoot)(options),
16
16
  addDeclarationToModule(options),
17
- schematics_1.mergeWith(generate(options)),
17
+ (0, schematics_1.mergeWith)(generate(options)),
18
18
  ]))(tree, context);
19
19
  };
20
20
  }
@@ -23,7 +23,7 @@ function transform(source) {
23
23
  const target = Object.assign({}, source);
24
24
  target.metadata = 'effects';
25
25
  target.type = 'effect';
26
- if (util_1.isNullOrUndefined(target.name)) {
26
+ if ((0, util_1.isNullOrUndefined)(target.name)) {
27
27
  throw new schematics_1.SchematicsException('Option (name) is required.');
28
28
  }
29
29
  const location = new name_parser_1.NameParser().parse(target);
@@ -32,14 +32,14 @@ function transform(source) {
32
32
  target.language = target.language !== undefined ? target.language : 'ts';
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,190 @@
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 { ServiceOptions } from './service.schema';
10
+
11
+ describe('Service 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: ServiceOptions = {
18
+ name: 'foo',
19
+ skipImport: true,
20
+ flat: true,
21
+ };
22
+ const tree: UnitTestTree = runner.runSchematic('service', options);
23
+ const files: string[] = tree.files;
24
+ expect(
25
+ files.find(filename => filename === '/foo.service.ts'),
26
+ ).toBeDefined();
27
+ expect(
28
+ files.find(filename => filename === '/foo.service.spec.ts'),
29
+ ).toBeDefined();
30
+ expect(tree.readContent('/foo.service.ts')).toEqual(
31
+ "import { Injectable } from '@nestjs/common';\n" +
32
+ '\n' +
33
+ '@Injectable()\n' +
34
+ 'export class FooService {}\n',
35
+ );
36
+ });
37
+ it('should manage name as a path', () => {
38
+ const options: ServiceOptions = {
39
+ name: 'bar/foo',
40
+ skipImport: true,
41
+ flat: true,
42
+ };
43
+ const tree: UnitTestTree = runner.runSchematic('service', options);
44
+ const files: string[] = tree.files;
45
+ expect(
46
+ files.find(filename => filename === '/bar/foo.service.ts'),
47
+ ).toBeDefined();
48
+ expect(
49
+ files.find(filename => filename === '/bar/foo.service.spec.ts'),
50
+ ).toBeDefined();
51
+ expect(tree.readContent('/bar/foo.service.ts')).toEqual(
52
+ "import { Injectable } from '@nestjs/common';\n" +
53
+ '\n' +
54
+ '@Injectable()\n' +
55
+ 'export class FooService {}\n',
56
+ );
57
+ });
58
+ it('should manage name and path', () => {
59
+ const options: ServiceOptions = {
60
+ name: 'foo',
61
+ path: 'bar',
62
+ skipImport: true,
63
+ flat: true,
64
+ };
65
+ const tree: UnitTestTree = runner.runSchematic('service', options);
66
+ const files: string[] = tree.files;
67
+ expect(
68
+ files.find(filename => filename === '/bar/foo.service.ts'),
69
+ ).toBeDefined();
70
+ expect(
71
+ files.find(filename => filename === '/bar/foo.service.spec.ts'),
72
+ ).toBeDefined();
73
+ expect(tree.readContent('/bar/foo.service.ts')).toEqual(
74
+ "import { Injectable } from '@nestjs/common';\n" +
75
+ '\n' +
76
+ '@Injectable()\n' +
77
+ 'export class FooService {}\n',
78
+ );
79
+ });
80
+ it('should manage name to dasherize', () => {
81
+ const options: ServiceOptions = {
82
+ name: 'fooBar',
83
+ skipImport: true,
84
+ flat: true,
85
+ };
86
+ const tree: UnitTestTree = runner.runSchematic('service', options);
87
+ const files: string[] = tree.files;
88
+ expect(
89
+ files.find(filename => filename === '/foo-bar.service.ts'),
90
+ ).toBeDefined();
91
+ expect(tree.readContent('/foo-bar.service.ts')).toEqual(
92
+ "import { Injectable } from '@nestjs/common';\n" +
93
+ '\n' +
94
+ '@Injectable()\n' +
95
+ 'export class FooBarService {}\n',
96
+ );
97
+ });
98
+ it('should manage path to dasherize', () => {
99
+ const options: ServiceOptions = {
100
+ name: 'barBaz/foo',
101
+ skipImport: true,
102
+ flat: true,
103
+ };
104
+ const tree: UnitTestTree = runner.runSchematic('service', options);
105
+ const files: string[] = tree.files;
106
+ expect(
107
+ files.find(filename => filename === '/bar-baz/foo.service.ts'),
108
+ ).toBeDefined();
109
+ expect(
110
+ files.find(filename => filename === '/bar-baz/foo.service.spec.ts'),
111
+ ).toBeDefined();
112
+ expect(tree.readContent('/bar-baz/foo.service.ts')).toEqual(
113
+ "import { Injectable } from '@nestjs/common';\n" +
114
+ '\n' +
115
+ '@Injectable()\n' +
116
+ 'export class FooService {}\n',
117
+ );
118
+ });
119
+ it('should manage javascript file', () => {
120
+ const options: ServiceOptions = {
121
+ name: 'foo',
122
+ skipImport: true,
123
+ language: 'js',
124
+ flat: true,
125
+ };
126
+ const tree: UnitTestTree = runner.runSchematic('service', options);
127
+ const files: string[] = tree.files;
128
+ expect(
129
+ files.find(filename => filename === '/foo.service.js'),
130
+ ).toBeDefined();
131
+ expect(
132
+ files.find(filename => filename === '/foo.service.spec.js'),
133
+ ).toBeDefined();
134
+ expect(tree.readContent('/foo.service.js')).toEqual(
135
+ "import { Injectable } from '@nestjs/common';\n" +
136
+ '\n' +
137
+ '@Injectable()\n' +
138
+ 'export class FooService {}\n',
139
+ );
140
+ });
141
+ it('should manage declaration in app module', () => {
142
+ const app: ApplicationOptions = {
143
+ name: '',
144
+ };
145
+ let tree: UnitTestTree = runner.runSchematic('application', app);
146
+ const options: ServiceOptions = {
147
+ name: 'foo',
148
+ flat: true,
149
+ };
150
+ tree = runner.runSchematic('service', options, tree);
151
+ expect(tree.readContent(normalize('/src/app.module.ts'))).toEqual(
152
+ "import { Module } from '@nestjs/common';\n" +
153
+ "import { AppController } from './app.controller';\n" +
154
+ "import { AppService } from './app.service';\n" +
155
+ "import { FooService } from './foo.service';\n" +
156
+ '\n' +
157
+ '@Module({\n' +
158
+ ' imports: [],\n' +
159
+ ' controllers: [AppController],\n' +
160
+ ' providers: [AppService, FooService],\n' +
161
+ '})\n' +
162
+ 'export class AppModule {}\n',
163
+ );
164
+ });
165
+ it('should manage declaration in foo module', () => {
166
+ const app: ApplicationOptions = {
167
+ name: '',
168
+ };
169
+ let tree: UnitTestTree = runner.runSchematic('application', app);
170
+ const module: ModuleOptions = {
171
+ name: 'foo',
172
+ };
173
+ tree = runner.runSchematic('module', module, tree);
174
+ const options: ServiceOptions = {
175
+ name: 'foo',
176
+ path: 'foo',
177
+ flat: true,
178
+ };
179
+ tree = runner.runSchematic('service', options, tree);
180
+ expect(tree.readContent(normalize('/src/foo/foo.module.ts'))).toEqual(
181
+ "import { Module } from '@nestjs/common';\n" +
182
+ "import { FooService } from './foo.service';\n" +
183
+ '\n' +
184
+ '@Module({\n' +
185
+ ' providers: [FooService]\n' +
186
+ '})\n' +
187
+ 'export class FooModule {}\n',
188
+ );
189
+ });
190
+ });
@@ -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
+ SchematicsException,
13
+ template,
14
+ Tree,
15
+ url,
16
+ } from '@angular-devkit/schematics';
17
+ import { isNullOrUndefined } from 'util';
18
+ import {
19
+ DeclarationOptions,
20
+ ModuleDeclarator,
21
+ } from '../../utils/module.declarator';
22
+ import { ModuleFinder } from '../../utils/module.finder';
23
+ import { Location, NameParser } from '../../utils/name.parser';
24
+ import { mergeSourceRoot } from '../../utils/source-root.helpers';
25
+ import { ServiceOptions } from './effect.schema';
26
+
27
+ export function main(options: ServiceOptions): Rule {
28
+ options = transform(options);
29
+ return (tree: Tree, context: SchematicContext) => {
30
+ return branchAndMerge(
31
+ chain([
32
+ mergeSourceRoot(options),
33
+ addDeclarationToModule(options),
34
+ mergeWith(generate(options)),
35
+ ]),
36
+ )(tree, context);
37
+ };
38
+ }
39
+
40
+ function transform(source: ServiceOptions): ServiceOptions {
41
+ const target: ServiceOptions = Object.assign({}, source);
42
+ target.metadata = 'effects';
43
+ target.type = 'effect';
44
+
45
+ if (isNullOrUndefined(target.name)) {
46
+ throw new SchematicsException('Option (name) is required.');
47
+ }
48
+ const location: Location = new NameParser().parse(target);
49
+ target.name = strings.dasherize(location.name);
50
+ target.path = strings.dasherize(location.path);
51
+ target.language = target.language !== undefined ? target.language : 'ts';
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: ServiceOptions) {
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: ServiceOptions): 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 ServiceOptions {
4
+ /**
5
+ * The name of the service.
6
+ */
7
+ name: string;
8
+ /**
9
+ * The path to create the service.
10
+ */
11
+ path?: string;
12
+ /**
13
+ * The path to insert the service 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
+ }