@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,117 @@
1
+ import {
2
+ SchematicTestRunner,
3
+ UnitTestTree,
4
+ } from '@angular-devkit/schematics/testing';
5
+ import * as path from 'path';
6
+ import { ResolverOptions } from './resolver.schema';
7
+
8
+ describe('Resolver 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: ResolverOptions = {
15
+ name: 'foo',
16
+ flat: false,
17
+ };
18
+ const tree: UnitTestTree = runner.runSchematic('resolver', options);
19
+ const files: string[] = tree.files;
20
+ expect(
21
+ files.find(filename => filename === '/foo/foo.resolver.ts'),
22
+ ).not.toBeUndefined();
23
+ expect(tree.readContent('/foo/foo.resolver.ts')).toEqual(
24
+ "import { Resolver } from '@nestjs/graphql';\n" +
25
+ '\n' +
26
+ '@Resolver(\'Foo\')\n' +
27
+ 'export class FooResolver {}\n',
28
+ );
29
+ });
30
+ it('should manage name as a path', () => {
31
+ const options: ResolverOptions = {
32
+ name: 'bar/foo',
33
+ flat: false,
34
+ };
35
+ const tree: UnitTestTree = runner.runSchematic('resolver', options);
36
+ const files: string[] = tree.files;
37
+ expect(
38
+ files.find(filename => filename === '/bar/foo/foo.resolver.ts'),
39
+ ).not.toBeUndefined();
40
+ expect(tree.readContent('/bar/foo/foo.resolver.ts')).toEqual(
41
+ "import { Resolver } from '@nestjs/graphql';\n" +
42
+ '\n' +
43
+ '@Resolver(\'Foo\')\n' +
44
+ 'export class FooResolver {}\n',
45
+ );
46
+ });
47
+ it('should manage name and path', () => {
48
+ const options: ResolverOptions = {
49
+ name: 'foo',
50
+ path: 'baz',
51
+ flat: false,
52
+ };
53
+ const tree: UnitTestTree = runner.runSchematic('resolver', options);
54
+ const files: string[] = tree.files;
55
+ expect(
56
+ files.find(filename => filename === '/baz/foo/foo.resolver.ts'),
57
+ ).not.toBeUndefined();
58
+ expect(tree.readContent('/baz/foo/foo.resolver.ts')).toEqual(
59
+ "import { Resolver } from '@nestjs/graphql';\n" +
60
+ '\n' +
61
+ '@Resolver(\'Foo\')\n' +
62
+ 'export class FooResolver {}\n',
63
+ );
64
+ });
65
+ it('should manage name to dasherize', () => {
66
+ const options: ResolverOptions = {
67
+ name: 'fooBar',
68
+ flat: false,
69
+ };
70
+ const tree: UnitTestTree = runner.runSchematic('resolver', options);
71
+ const files: string[] = tree.files;
72
+ expect(
73
+ files.find(filename => filename === '/foo-bar/foo-bar.resolver.ts'),
74
+ ).not.toBeUndefined();
75
+ expect(tree.readContent('/foo-bar/foo-bar.resolver.ts')).toEqual(
76
+ "import { Resolver } from '@nestjs/graphql';\n" +
77
+ '\n' +
78
+ '@Resolver(\'FooBar\')\n' +
79
+ 'export class FooBarResolver {}\n',
80
+ );
81
+ });
82
+ it('should manage path to dasherize', () => {
83
+ const options: ResolverOptions = {
84
+ name: 'barBaz/foo',
85
+ flat: false,
86
+ };
87
+ const tree: UnitTestTree = runner.runSchematic('resolver', options);
88
+ const files: string[] = tree.files;
89
+ expect(
90
+ files.find(filename => filename === '/bar-baz/foo/foo.resolver.ts'),
91
+ ).not.toBeUndefined();
92
+ expect(tree.readContent('/bar-baz/foo/foo.resolver.ts')).toEqual(
93
+ "import { Resolver } from '@nestjs/graphql';\n" +
94
+ '\n' +
95
+ '@Resolver(\'Foo\')\n' +
96
+ 'export class FooResolver {}\n',
97
+ );
98
+ });
99
+ it('should manage javascript file', () => {
100
+ const options: ResolverOptions = {
101
+ name: 'foo',
102
+ language: 'js',
103
+ flat: false,
104
+ };
105
+ const tree: UnitTestTree = runner.runSchematic('resolver', options);
106
+ const files: string[] = tree.files;
107
+ expect(
108
+ files.find(filename => filename === '/foo/foo.resolver.js'),
109
+ ).not.toBeUndefined();
110
+ expect(tree.readContent('/foo/foo.resolver.js')).toEqual(
111
+ "import { Resolver } from '@nestjs/graphql';\n" +
112
+ '\n' +
113
+ '@Resolver(\'Foo\')\n' +
114
+ 'export class FooResolver {}\n',
115
+ );
116
+ });
117
+ });
@@ -0,0 +1,92 @@
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
+ Source,
14
+ template,
15
+ Tree,
16
+ url,
17
+ } from '@angular-devkit/schematics';
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 { ProviderOptions } from '../provider/provider.schema';
26
+ import { ResolverOptions } from './resolver.schema';
27
+
28
+ export function main(options: ResolverOptions): Rule {
29
+ options = transform(options);
30
+ return (tree: Tree, context: SchematicContext) => {
31
+ return branchAndMerge(
32
+ chain([
33
+ mergeSourceRoot(options),
34
+ addDeclarationToModule(options),
35
+ mergeWith(generate(options)),
36
+ ]),
37
+ )(tree, context);
38
+ };
39
+ }
40
+
41
+ function transform(options: ResolverOptions): ResolverOptions {
42
+ const target: ResolverOptions = Object.assign({}, options);
43
+ if (!target.name) {
44
+ throw new SchematicsException('Option (name) is required.');
45
+ }
46
+ target.metadata = 'providers';
47
+ target.type = 'resolver';
48
+
49
+ const location: Location = new NameParser().parse(target);
50
+ target.name = strings.dasherize(location.name);
51
+ target.path = strings.dasherize(location.path);
52
+ target.language = target.language !== undefined ? target.language : 'ts';
53
+
54
+ target.path = target.flat
55
+ ? target.path
56
+ : join(target.path as Path, target.name);
57
+ return target;
58
+ }
59
+
60
+ function generate(options: ResolverOptions): Source {
61
+ return (context: SchematicContext) =>
62
+ apply(url(join('./files' as Path, options.language)), [
63
+ options.spec ? noop() : filter(path => !path.endsWith('.spec.ts')),
64
+ template({
65
+ ...strings,
66
+ ...options,
67
+ }),
68
+ move(options.path),
69
+ ])(context);
70
+ }
71
+
72
+ function addDeclarationToModule(options: ProviderOptions): Rule {
73
+ return (tree: Tree) => {
74
+ if (options.skipImport !== undefined && options.skipImport) {
75
+ return tree;
76
+ }
77
+ options.module = new ModuleFinder(tree).find({
78
+ name: options.name,
79
+ path: options.path as Path,
80
+ });
81
+ if (!options.module) {
82
+ return tree;
83
+ }
84
+ const content = tree.read(options.module).toString();
85
+ const declarator: ModuleDeclarator = new ModuleDeclarator();
86
+ tree.overwrite(
87
+ options.module,
88
+ declarator.declare(content, options as DeclarationOptions),
89
+ );
90
+ return tree;
91
+ };
92
+ }
@@ -0,0 +1,36 @@
1
+ import { Path } from '@angular-devkit/core';
2
+
3
+ export interface ResolverOptions {
4
+ /**
5
+ * The name of the resolver.
6
+ */
7
+ name: string;
8
+ /**
9
+ * The path to create the resolver.
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
+ /**
29
+ * Metadata name affected by declaration insertion.
30
+ */
31
+ metadata?: string;
32
+ /**
33
+ * Nest element type name
34
+ */
35
+ type?: string;
36
+ }
@@ -0,0 +1,39 @@
1
+ {
2
+ "$schema": "http://json-schema.org/schema",
3
+ "id": "SchematicsNestResolver",
4
+ "title": "Nest Resolver Options Schema",
5
+ "type": "object",
6
+ "properties": {
7
+ "name": {
8
+ "type": "string",
9
+ "description": "The name of the resolver.",
10
+ "$default": {
11
+ "$source": "argv",
12
+ "index": 0
13
+ },
14
+ "x-prompt": "What name would you like to use for the resolver?"
15
+ },
16
+ "path": {
17
+ "type": "string",
18
+ "format": "path",
19
+ "description": "The path to create the resolver."
20
+ },
21
+ "language": {
22
+ "type": "string",
23
+ "description": "Nest resolver language (ts/js)."
24
+ },
25
+ "sourceRoot": {
26
+ "type": "string",
27
+ "description": "Nest resolver source root directory."
28
+ },
29
+ "flat": {
30
+ "default": false,
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,4 @@
1
+ import { Injectable } from '@rxdi/core';
2
+
3
+ @Injectable()
4
+ export class <%= classify(name) %>Service {}
@@ -0,0 +1,17 @@
1
+ import 'jest';
2
+ import { Container, createTestBed } from '@gapi/core';
3
+ import { <%= classify(name) %>Service } from './<%= name %>.service';
4
+
5
+ describe('<%= classify(name) %> Service', () => {
6
+ beforeAll(async () => {
7
+ await createTestBed({
8
+ imports: [],
9
+ providers: [<%= classify(name) %>Service]
10
+ }).toPromise();
11
+ });
12
+
13
+ it('should be defined', done => {
14
+ expect(Container.has(<%= classify(name) %>Service)).toBeTruthy();
15
+ done();
16
+ });
17
+ });
@@ -0,0 +1,17 @@
1
+ import 'jest';
2
+ import { Container, createTestBed } from '@gapi/core';
3
+ import { <%= classify(name) %>Service } from './<%= name %>.service';
4
+
5
+ describe('<%= classify(name) %> Service', () => {
6
+ beforeAll(async () => {
7
+ await createTestBed({
8
+ imports: [],
9
+ providers: [<%= classify(name) %>Service]
10
+ }).toPromise();
11
+ });
12
+
13
+ it('should be defined', done => {
14
+ expect(Container.has(<%= classify(name) %>Service)).toBeTruthy();
15
+ done();
16
+ });
17
+ });
@@ -0,0 +1,4 @@
1
+ import { Injectable } from '@rxdi/core';
2
+
3
+ @Injectable()
4
+ export class <%= classify(name) %>Service {}
@@ -0,0 +1,39 @@
1
+ {
2
+ "$schema": "http://json-schema.org/schema",
3
+ "id": "SchematicsNestService",
4
+ "title": "Nest Service Options Schema",
5
+ "type": "object",
6
+ "properties": {
7
+ "name": {
8
+ "type": "string",
9
+ "description": "The name of the service.",
10
+ "$default": {
11
+ "$source": "argv",
12
+ "index": 0
13
+ },
14
+ "x-prompt": "What name would you like to use for the service?"
15
+ },
16
+ "path": {
17
+ "type": "string",
18
+ "format": "path",
19
+ "description": "The path to create the service."
20
+ },
21
+ "language": {
22
+ "type": "string",
23
+ "description": "Nest service language (ts/js)."
24
+ },
25
+ "sourceRoot": {
26
+ "type": "string",
27
+ "description": "Nest service source root directory."
28
+ },
29
+ "flat": {
30
+ "default": false,
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
+ }
@@ -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 = 'providers';
25
25
  target.type = 'service';
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
+ });