@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,8 @@
1
+ import { Injectable } from '@rxdi/core';
2
+
3
+ @Injectable()
4
+ export class <%= classify(name) %>Pipe {
5
+ transform(value: any) {
6
+ return value;
7
+ }
8
+ }
@@ -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,13 +21,13 @@ 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
- options.spec ? schematics_1.noop() : schematics_1.filter(path => !path.endsWith('.spec.ts')),
30
- schematics_1.template(Object.assign(Object.assign({}, core_1.strings), options)),
31
- schematics_1.move(options.path),
28
+ return (context) => (0, schematics_1.apply)((0, schematics_1.url)((0, core_1.join)('./files', options.language)), [
29
+ options.spec ? (0, schematics_1.noop)() : (0, schematics_1.filter)(path => !path.endsWith('.spec.ts')),
30
+ (0, schematics_1.template)(Object.assign(Object.assign({}, core_1.strings), options)),
31
+ (0, schematics_1.move)(options.path),
32
32
  ])(context);
33
33
  }
@@ -0,0 +1,141 @@
1
+ import {
2
+ SchematicTestRunner,
3
+ UnitTestTree,
4
+ } from '@angular-devkit/schematics/testing';
5
+ import * as path from 'path';
6
+ import { PipeOptions } from './pipe.schema';
7
+
8
+ describe('Pipe 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: PipeOptions = {
15
+ name: 'foo',
16
+ flat: false,
17
+ };
18
+ const tree: UnitTestTree = runner.runSchematic('pipe', options);
19
+ const files: string[] = tree.files;
20
+ expect(
21
+ files.find(filename => filename === '/foo/foo.pipe.ts'),
22
+ ).not.toBeUndefined();
23
+ expect(tree.readContent('/foo/foo.pipe.ts')).toEqual(
24
+ "import { ArgumentMetadata, Injectable, PipeTransform } from '@nestjs/common';\n" +
25
+ '\n' +
26
+ '@Injectable()\n' +
27
+ 'export class FooPipe implements PipeTransform {\n' +
28
+ ' transform(value: any, metadata: ArgumentMetadata) {\n' +
29
+ ' return value;\n' +
30
+ ' }\n' +
31
+ '}\n',
32
+ );
33
+ });
34
+ it('should manage name as a path', () => {
35
+ const options: PipeOptions = {
36
+ name: 'bar/foo',
37
+ flat: false,
38
+ };
39
+ const tree: UnitTestTree = runner.runSchematic('pipe', options);
40
+ const files: string[] = tree.files;
41
+ expect(
42
+ files.find(filename => filename === '/bar/foo/foo.pipe.ts'),
43
+ ).not.toBeUndefined();
44
+ expect(tree.readContent('/bar/foo/foo.pipe.ts')).toEqual(
45
+ "import { ArgumentMetadata, Injectable, PipeTransform } from '@nestjs/common';\n" +
46
+ '\n' +
47
+ '@Injectable()\n' +
48
+ 'export class FooPipe implements PipeTransform {\n' +
49
+ ' transform(value: any, metadata: ArgumentMetadata) {\n' +
50
+ ' return value;\n' +
51
+ ' }\n' +
52
+ '}\n',
53
+ );
54
+ });
55
+ it('should manage name and path', () => {
56
+ const options: PipeOptions = {
57
+ name: 'foo',
58
+ path: 'baz',
59
+ flat: false,
60
+ };
61
+ const tree: UnitTestTree = runner.runSchematic('pipe', options);
62
+ const files: string[] = tree.files;
63
+ expect(
64
+ files.find(filename => filename === '/baz/foo/foo.pipe.ts'),
65
+ ).not.toBeUndefined();
66
+ expect(tree.readContent('/baz/foo/foo.pipe.ts')).toEqual(
67
+ "import { ArgumentMetadata, Injectable, PipeTransform } from '@nestjs/common';\n" +
68
+ '\n' +
69
+ '@Injectable()\n' +
70
+ 'export class FooPipe implements PipeTransform {\n' +
71
+ ' transform(value: any, metadata: ArgumentMetadata) {\n' +
72
+ ' return value;\n' +
73
+ ' }\n' +
74
+ '}\n',
75
+ );
76
+ });
77
+ it('should manage name to dasherize', () => {
78
+ const options: PipeOptions = {
79
+ name: 'fooBar',
80
+ flat: false,
81
+ };
82
+ const tree: UnitTestTree = runner.runSchematic('pipe', options);
83
+ const files: string[] = tree.files;
84
+ expect(
85
+ files.find(filename => filename === '/foo-bar/foo-bar.pipe.ts'),
86
+ ).not.toBeUndefined();
87
+ expect(tree.readContent('/foo-bar/foo-bar.pipe.ts')).toEqual(
88
+ "import { ArgumentMetadata, Injectable, PipeTransform } from '@nestjs/common';\n" +
89
+ '\n' +
90
+ '@Injectable()\n' +
91
+ 'export class FooBarPipe implements PipeTransform {\n' +
92
+ ' transform(value: any, metadata: ArgumentMetadata) {\n' +
93
+ ' return value;\n' +
94
+ ' }\n' +
95
+ '}\n',
96
+ );
97
+ });
98
+ it('should manage path to dasherize', () => {
99
+ const options: PipeOptions = {
100
+ name: 'barBaz/foo',
101
+ flat: false,
102
+ };
103
+ const tree: UnitTestTree = runner.runSchematic('pipe', options);
104
+ const files: string[] = tree.files;
105
+ expect(
106
+ files.find(filename => filename === '/bar-baz/foo/foo.pipe.ts'),
107
+ ).not.toBeUndefined();
108
+ expect(tree.readContent('/bar-baz/foo/foo.pipe.ts')).toEqual(
109
+ "import { ArgumentMetadata, Injectable, PipeTransform } from '@nestjs/common';\n" +
110
+ '\n' +
111
+ '@Injectable()\n' +
112
+ 'export class FooPipe implements PipeTransform {\n' +
113
+ ' transform(value: any, metadata: ArgumentMetadata) {\n' +
114
+ ' return value;\n' +
115
+ ' }\n' +
116
+ '}\n',
117
+ );
118
+ });
119
+ it('should manage javascript file', () => {
120
+ const options: PipeOptions = {
121
+ name: 'foo',
122
+ language: 'js',
123
+ flat: false,
124
+ };
125
+ const tree: UnitTestTree = runner.runSchematic('pipe', options);
126
+ const files: string[] = tree.files;
127
+ expect(
128
+ files.find(filename => filename === '/foo/foo.pipe.js'),
129
+ ).not.toBeUndefined();
130
+ expect(tree.readContent('/foo/foo.pipe.js')).toEqual(
131
+ "import { Injectable } from '@nestjs/common';\n" +
132
+ '\n' +
133
+ '@Injectable()\n' +
134
+ 'export class FooPipe {\n' +
135
+ ' transform(value, metadata) {\n' +
136
+ ' return value;\n' +
137
+ ' }\n' +
138
+ '}\n',
139
+ );
140
+ });
141
+ });
@@ -0,0 +1,51 @@
1
+ import { join, Path, strings } from '@angular-devkit/core';
2
+ import {
3
+ apply,
4
+ chain,
5
+ filter,
6
+ mergeWith,
7
+ move,
8
+ noop,
9
+ Rule,
10
+ SchematicContext,
11
+ SchematicsException,
12
+ Source,
13
+ template,
14
+ url,
15
+ } from '@angular-devkit/schematics';
16
+ import { Location, NameParser } from '../../utils/name.parser';
17
+ import { mergeSourceRoot } from '../../utils/source-root.helpers';
18
+ import { PipeOptions } from './pipe.schema';
19
+
20
+ export function main(options: PipeOptions): Rule {
21
+ options = transform(options);
22
+ return chain([mergeSourceRoot(options), mergeWith(generate(options))]);
23
+ }
24
+
25
+ function transform(options: PipeOptions): PipeOptions {
26
+ const target: PipeOptions = Object.assign({}, options);
27
+ if (!target.name) {
28
+ throw new SchematicsException('Option (name) is required.');
29
+ }
30
+ const location: Location = new NameParser().parse(target);
31
+ target.name = strings.dasherize(location.name);
32
+ target.path = strings.dasherize(location.path);
33
+ target.language = target.language !== undefined ? target.language : 'ts';
34
+
35
+ target.path = target.flat
36
+ ? target.path
37
+ : join(target.path as Path, target.name);
38
+ return target;
39
+ }
40
+
41
+ function generate(options: PipeOptions): Source {
42
+ return (context: SchematicContext) =>
43
+ apply(url(join('./files' as Path, options.language)), [
44
+ options.spec ? noop() : filter(path => !path.endsWith('.spec.ts')),
45
+ template({
46
+ ...strings,
47
+ ...options,
48
+ }),
49
+ move(options.path),
50
+ ])(context);
51
+ }
@@ -0,0 +1,28 @@
1
+ import { Path } from '@angular-devkit/core';
2
+
3
+ export interface PipeOptions {
4
+ /**
5
+ * The name of the pipe.
6
+ */
7
+ name: string;
8
+ /**
9
+ * The path to create the pipe.
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
+ * Specifies if a spec file is generated.
22
+ */
23
+ spec?: boolean;
24
+ /**
25
+ * Flag to indicate if a directory is created.
26
+ */
27
+ flat?: boolean;
28
+ }
@@ -0,0 +1,39 @@
1
+ {
2
+ "$schema": "http://json-schema.org/schema",
3
+ "id": "SchematicsNestPipe",
4
+ "title": "Nest Pipe Options Schema",
5
+ "type": "object",
6
+ "properties": {
7
+ "name": {
8
+ "type": "string",
9
+ "description": "The name of the pipe.",
10
+ "$default": {
11
+ "$source": "argv",
12
+ "index": 0
13
+ },
14
+ "x-prompt": "What name would you like to use for the pipe?"
15
+ },
16
+ "path": {
17
+ "type": "string",
18
+ "format": "path",
19
+ "description": "The path to create the pipe."
20
+ },
21
+ "language": {
22
+ "type": "string",
23
+ "description": "Nest pipe language (ts/js)."
24
+ },
25
+ "sourceRoot": {
26
+ "type": "string",
27
+ "description": "Nest pipe source root directory."
28
+ },
29
+ "flat": {
30
+ "default": true,
31
+ "description": "Flag to indicate if a directory is created."
32
+ },
33
+ "spec": {
34
+ "default": true,
35
+ "description": "Specifies if a spec file is generated."
36
+ }
37
+ },
38
+ "required": ["name"]
39
+ }
@@ -0,0 +1,28 @@
1
+
2
+
3
+ import { Plugin, PluginInterface, Inject } from '@rxdi/core';
4
+ import { HAPI_SERVER } from '@rxdi/hapi';
5
+ import { Server } from 'hapi';
6
+
7
+ @Plugin()
8
+ export class <%= classify(name) %>Plugin implements PluginInterface {
9
+ name = 'MyPlugin';
10
+ version = '1.0.0';
11
+
12
+ constructor(
13
+ @Inject(HAPI_SERVER) private server: Server
14
+ ) {}
15
+
16
+ async register() {
17
+ this.server.route({
18
+ method: '<%= classify(method) %>',
19
+ path: '/<%= dasherize(name) %>',
20
+ handler: this.handler.bind(this)
21
+ });
22
+ }
23
+
24
+ async handler(request, h) {
25
+ return 'Hello world';
26
+ }
27
+
28
+ }
@@ -0,0 +1,7 @@
1
+ import { <%= classify(name) %>Middleware } from './<%= name %>.middleware';
2
+
3
+ describe('<%= classify(name) %>Middleware', () => {
4
+ it('should be defined', () => {
5
+ expect(new <%= classify(name) %>Middleware()).toBeDefined();
6
+ });
7
+ });
@@ -0,0 +1,7 @@
1
+ import { <%= classify(name) %>Plugin } from './<%= name %>.plugin';
2
+
3
+ describe('<%= classify(name) %>Plugin', () => {
4
+ it('should be defined', () => {
5
+ expect(new <%= classify(name) %>Plugin()).toBeDefined();
6
+ });
7
+ });
@@ -0,0 +1,28 @@
1
+
2
+
3
+ import { Plugin, PluginInterface, Inject } from '@rxdi/core';
4
+ import { HAPI_SERVER } from '@rxdi/hapi';
5
+ import { Server } from 'hapi';
6
+
7
+ @Plugin()
8
+ export class <%= classify(name) %>Plugin implements PluginInterface {
9
+ name = 'MyPlugin';
10
+ version = '1.0.0';
11
+
12
+ constructor(
13
+ @Inject(HAPI_SERVER) private server: Server
14
+ ) {}
15
+
16
+ async register() {
17
+ this.server.route({
18
+ method: '<%= classify(method) %>',
19
+ path: '/<%= dasherize(name) %>',
20
+ handler: this.handler.bind(this)
21
+ });
22
+ }
23
+
24
+ async handler(request, h) {
25
+ return 'Hello world';
26
+ }
27
+
28
+ }
@@ -1,3 +1,3 @@
1
1
  import { Rule } from '@angular-devkit/schematics';
2
- import { PluginOptions } from './plugin.schema';
3
- export declare function main(options: PluginOptions): Rule;
2
+ import { ControllerOptions } from './controller.schema';
3
+ export declare function main(options: ControllerOptions): Rule;
@@ -1,6 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.main = void 0;
4
3
  const core_1 = require("@angular-devkit/core");
5
4
  const schematics_1 = require("@angular-devkit/schematics");
6
5
  const module_declarator_1 = require("../../utils/module.declarator");
@@ -38,7 +37,7 @@ function transform(source) {
38
37
  function generate(options) {
39
38
  return (context) => schematics_1.apply(schematics_1.url(core_1.join('./files', options.language)), [
40
39
  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)),
40
+ schematics_1.template(Object.assign({}, core_1.strings, options)),
42
41
  schematics_1.move(options.path),
43
42
  ])(context);
44
43
  }
@@ -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 './controller.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 { Controller } from '@nestjs/common';\n" +
34
+ '\n' +
35
+ "@Controller('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 { PluginOptions } from './plugin.schema';
25
+
26
+ const ELEMENT_METADATA = 'plugins';
27
+ const ELEMENT_TYPE = 'plugin';
28
+
29
+ export function main(options: PluginOptions): 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: PluginOptions): PluginOptions {
43
+ const target: PluginOptions = 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: PluginOptions) {
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: PluginOptions): 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
+ }