@apso/cli 0.0.5 → 0.0.43

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 (194) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +313 -53
  3. package/bin/dev +17 -0
  4. package/bin/dev.cmd +3 -0
  5. package/bin/run +3 -3
  6. package/dist/commands/server/new.d.ts +22 -0
  7. package/dist/commands/server/new.js +105 -0
  8. package/dist/commands/server/scaffold.d.ts +14 -0
  9. package/dist/commands/server/scaffold.js +60 -0
  10. package/dist/index.d.ts +1 -0
  11. package/{lib → dist}/index.js +3 -2
  12. package/dist/lib/apsorc-parser.d.ts +26 -0
  13. package/dist/lib/apsorc-parser.js +65 -0
  14. package/dist/lib/base-command.d.ts +4 -0
  15. package/dist/lib/base-command.js +24 -0
  16. package/dist/lib/controller.d.ts +2 -0
  17. package/dist/lib/controller.js +36 -0
  18. package/dist/lib/dto.d.ts +7 -0
  19. package/dist/lib/dto.js +49 -0
  20. package/dist/lib/entity.d.ts +2 -0
  21. package/dist/lib/entity.js +43 -0
  22. package/dist/lib/enums.d.ts +6 -0
  23. package/dist/lib/enums.js +31 -0
  24. package/dist/lib/gql-dto.d.ts +3 -0
  25. package/dist/lib/gql-dto.js +43 -0
  26. package/dist/lib/index-module.d.ts +2 -0
  27. package/dist/lib/index-module.js +18 -0
  28. package/dist/lib/index.d.ts +10 -0
  29. package/dist/lib/index.js +21 -0
  30. package/dist/lib/module.d.ts +1 -0
  31. package/dist/lib/module.js +28 -0
  32. package/dist/lib/service.d.ts +1 -0
  33. package/dist/lib/service.js +24 -0
  34. package/dist/lib/templates/entities/entity-col-array.eta +12 -0
  35. package/dist/lib/templates/entities/entity-col-bigint.eta +11 -0
  36. package/dist/lib/templates/entities/entity-col-bigserial.eta +12 -0
  37. package/dist/lib/templates/entities/entity-col-boolean.eta +11 -0
  38. package/dist/lib/templates/entities/entity-col-bytea.eta +11 -0
  39. package/dist/lib/templates/entities/entity-col-char.eta +15 -0
  40. package/dist/lib/templates/entities/entity-col-date.eta +8 -0
  41. package/dist/lib/templates/entities/entity-col-decimal.eta +11 -0
  42. package/dist/lib/templates/entities/entity-col-double.eta +11 -0
  43. package/dist/lib/templates/entities/entity-col-enum.eta +12 -0
  44. package/dist/lib/templates/entities/entity-col-float.eta +7 -0
  45. package/dist/lib/templates/entities/entity-col-inet.eta +11 -0
  46. package/dist/lib/templates/entities/entity-col-int4range.eta +34 -0
  47. package/dist/lib/templates/entities/entity-col-integer.eta +11 -0
  48. package/dist/lib/templates/entities/entity-col-interval.eta +11 -0
  49. package/dist/lib/templates/entities/entity-col-json-plain.eta +8 -0
  50. package/dist/lib/templates/entities/entity-col-json.eta +5 -0
  51. package/dist/lib/templates/entities/entity-col-jsonb.eta +5 -0
  52. package/dist/lib/templates/entities/entity-col-money.eta +11 -0
  53. package/dist/lib/templates/entities/entity-col-numeric.eta +11 -0
  54. package/dist/lib/templates/entities/entity-col-point.eta +25 -0
  55. package/dist/lib/templates/entities/entity-col-real.eta +11 -0
  56. package/dist/lib/templates/entities/entity-col-serial.eta +12 -0
  57. package/dist/lib/templates/entities/entity-col-smallint.eta +11 -0
  58. package/dist/lib/templates/entities/entity-col-smallserial.eta +12 -0
  59. package/dist/lib/templates/entities/entity-col-string.eta +23 -0
  60. package/dist/lib/templates/entities/entity-col-text.eta +23 -0
  61. package/dist/lib/templates/entities/entity-col-time.eta +11 -0
  62. package/dist/lib/templates/entities/entity-col-timestamp.eta +4 -0
  63. package/dist/lib/templates/entities/entity-col-timestamptz.eta +4 -0
  64. package/dist/lib/templates/entities/entity-col-timetz.eta +11 -0
  65. package/dist/lib/templates/entities/entity-col-tsvector.eta +11 -0
  66. package/dist/lib/templates/entities/entity-col-uuid.eta +11 -0
  67. package/dist/lib/templates/entities/entity-col-varchar.eta +18 -0
  68. package/dist/lib/templates/entities/entity-col-xml.eta +11 -0
  69. package/dist/lib/templates/entities/entity.eta +116 -0
  70. package/dist/lib/templates/graphql/dto/dto-col-array.eta +4 -0
  71. package/dist/lib/templates/graphql/dto/dto-col-boolean.eta +6 -0
  72. package/dist/lib/templates/graphql/dto/dto-col-date.eta +4 -0
  73. package/dist/lib/templates/graphql/dto/dto-col-enum.eta +5 -0
  74. package/dist/lib/templates/graphql/dto/dto-col-float.eta +4 -0
  75. package/dist/lib/templates/graphql/dto/dto-col-integer.eta +4 -0
  76. package/dist/lib/templates/graphql/dto/dto-col-json-plain.eta +5 -0
  77. package/dist/lib/templates/graphql/dto/dto-col-json.eta +5 -0
  78. package/dist/lib/templates/graphql/dto/dto-col-text.eta +11 -0
  79. package/dist/lib/templates/graphql/dto/dto-col-timestamp.eta +3 -0
  80. package/dist/lib/templates/graphql/dto/dto-col-timestamptz.eta +3 -0
  81. package/dist/lib/templates/graphql/enums-graphql.eta +12 -0
  82. package/dist/lib/templates/graphql/gql-dto-graphql.eta +67 -0
  83. package/dist/lib/templates/graphql/index-module-graphql.eta +26 -0
  84. package/dist/lib/templates/graphql/module-graphql.eta +19 -0
  85. package/dist/lib/templates/header.eta +3 -0
  86. package/dist/lib/templates/rest/controller-rest-spec.eta +77 -0
  87. package/dist/lib/templates/rest/controller-rest.eta +171 -0
  88. package/dist/lib/templates/rest/dto-rest.eta +48 -0
  89. package/dist/lib/templates/rest/enums-rest.eta +7 -0
  90. package/dist/lib/templates/rest/index-module-rest.eta +11 -0
  91. package/dist/lib/templates/rest/module-rest.eta +16 -0
  92. package/dist/lib/templates/rest/ormconfig.eta +9 -0
  93. package/dist/lib/templates/rest/service-rest.eta +25 -0
  94. package/dist/lib/types/constraints.d.ts +4 -0
  95. package/dist/lib/types/constraints.js +2 -0
  96. package/dist/lib/types/entity.d.ts +13 -0
  97. package/dist/lib/types/entity.js +2 -0
  98. package/dist/lib/types/field.d.ts +16 -0
  99. package/dist/lib/types/field.js +2 -0
  100. package/dist/lib/types/index.d.ts +5 -0
  101. package/dist/lib/types/index.js +2 -0
  102. package/dist/lib/types/indices.d.ts +4 -0
  103. package/dist/lib/types/indices.js +2 -0
  104. package/dist/lib/types/json.d.ts +3 -0
  105. package/dist/lib/types/json.js +2 -0
  106. package/dist/lib/types/relationship.d.ts +43 -0
  107. package/dist/lib/types/relationship.js +2 -0
  108. package/dist/lib/utils/casing.d.ts +2 -0
  109. package/dist/lib/utils/casing.js +16 -0
  110. package/dist/lib/utils/field.d.ts +6 -0
  111. package/dist/lib/utils/field.js +65 -0
  112. package/dist/lib/utils/file-system.d.ts +2 -0
  113. package/dist/lib/utils/file-system.js +52 -0
  114. package/dist/lib/utils/relationships/index.d.ts +2 -0
  115. package/dist/lib/utils/relationships/index.js +11 -0
  116. package/dist/lib/utils/relationships/parse-v1.d.ts +4 -0
  117. package/dist/lib/utils/relationships/parse-v1.js +86 -0
  118. package/dist/lib/utils/relationships/parse.d.ts +11 -0
  119. package/dist/lib/utils/relationships/parse.js +192 -0
  120. package/dist/tests/templates/entities/types/array-template.spec.d.ts +1 -0
  121. package/dist/tests/templates/entities/types/array-template.spec.js +82 -0
  122. package/dist/tests/templates/entities/types/bigint-template.spec.d.ts +1 -0
  123. package/dist/tests/templates/entities/types/bigint-template.spec.js +82 -0
  124. package/dist/tests/templates/entities/types/boolean-template.spec.d.ts +1 -0
  125. package/dist/tests/templates/entities/types/boolean-template.spec.js +77 -0
  126. package/dist/tests/templates/entities/types/bytea-template.spec.d.ts +1 -0
  127. package/dist/tests/templates/entities/types/bytea-template.spec.js +68 -0
  128. package/dist/tests/templates/entities/types/char-template.spec.d.ts +1 -0
  129. package/dist/tests/templates/entities/types/char-template.spec.js +68 -0
  130. package/dist/tests/templates/entities/types/date-template.spec.d.ts +1 -0
  131. package/dist/tests/templates/entities/types/date-template.spec.js +56 -0
  132. package/dist/tests/templates/entities/types/decimal-template.spec.d.ts +1 -0
  133. package/dist/tests/templates/entities/types/decimal-template.spec.js +86 -0
  134. package/dist/tests/templates/entities/types/double-template.spec.d.ts +1 -0
  135. package/dist/tests/templates/entities/types/double-template.spec.js +67 -0
  136. package/dist/tests/templates/entities/types/enum-template.spec.d.ts +1 -0
  137. package/dist/tests/templates/entities/types/enum-template.spec.js +85 -0
  138. package/dist/tests/templates/entities/types/float-template.spec.d.ts +1 -0
  139. package/dist/tests/templates/entities/types/float-template.spec.js +67 -0
  140. package/dist/tests/templates/entities/types/inet-template.spec.d.ts +1 -0
  141. package/dist/tests/templates/entities/types/inet-template.spec.js +69 -0
  142. package/dist/tests/templates/entities/types/int4range-template.spec.d.ts +1 -0
  143. package/dist/tests/templates/entities/types/int4range-template.spec.js +60 -0
  144. package/dist/tests/templates/entities/types/integer-template.spec.d.ts +1 -0
  145. package/dist/tests/templates/entities/types/integer-template.spec.js +79 -0
  146. package/dist/tests/templates/entities/types/interval-template.spec.d.ts +1 -0
  147. package/dist/tests/templates/entities/types/interval-template.spec.js +68 -0
  148. package/dist/tests/templates/entities/types/json-plain-template.spec.d.ts +1 -0
  149. package/dist/tests/templates/entities/types/json-plain-template.spec.js +54 -0
  150. package/dist/tests/templates/entities/types/json-template.spec.d.ts +1 -0
  151. package/dist/tests/templates/entities/types/json-template.spec.js +40 -0
  152. package/dist/tests/templates/entities/types/jsonb-template.spec.d.ts +1 -0
  153. package/dist/tests/templates/entities/types/jsonb-template.spec.js +40 -0
  154. package/dist/tests/templates/entities/types/money-template.spec.d.ts +1 -0
  155. package/dist/tests/templates/entities/types/money-template.spec.js +68 -0
  156. package/dist/tests/templates/entities/types/numeric-template.spec.d.ts +1 -0
  157. package/dist/tests/templates/entities/types/numeric-template.spec.js +84 -0
  158. package/dist/tests/templates/entities/types/point-template.spec.d.ts +1 -0
  159. package/dist/tests/templates/entities/types/point-template.spec.js +58 -0
  160. package/dist/tests/templates/entities/types/real-template.spec.d.ts +1 -0
  161. package/dist/tests/templates/entities/types/real-template.spec.js +67 -0
  162. package/dist/tests/templates/entities/types/serial-template.spec.d.ts +1 -0
  163. package/dist/tests/templates/entities/types/serial-template.spec.js +113 -0
  164. package/dist/tests/templates/entities/types/smallint-template.spec.d.ts +1 -0
  165. package/dist/tests/templates/entities/types/smallint-template.spec.js +82 -0
  166. package/dist/tests/templates/entities/types/string-template.spec.d.ts +1 -0
  167. package/dist/tests/templates/entities/types/string-template.spec.js +111 -0
  168. package/dist/tests/templates/entities/types/text-template.spec.d.ts +1 -0
  169. package/dist/tests/templates/entities/types/text-template.spec.js +70 -0
  170. package/dist/tests/templates/entities/types/time-template.spec.d.ts +1 -0
  171. package/dist/tests/templates/entities/types/time-template.spec.js +68 -0
  172. package/dist/tests/templates/entities/types/timestamp-template.spec.d.ts +1 -0
  173. package/dist/tests/templates/entities/types/timestamp-template.spec.js +74 -0
  174. package/dist/tests/templates/entities/types/timetz-template.spec.d.ts +1 -0
  175. package/dist/tests/templates/entities/types/timetz-template.spec.js +68 -0
  176. package/dist/tests/templates/entities/types/tsvector-template.spec.d.ts +1 -0
  177. package/dist/tests/templates/entities/types/tsvector-template.spec.js +55 -0
  178. package/dist/tests/templates/entities/types/uuid-template.spec.d.ts +1 -0
  179. package/dist/tests/templates/entities/types/uuid-template.spec.js +82 -0
  180. package/dist/tests/templates/entities/types/varchar-template.spec.d.ts +1 -0
  181. package/dist/tests/templates/entities/types/varchar-template.spec.js +102 -0
  182. package/dist/tests/templates/entities/types/xml-template.spec.d.ts +1 -0
  183. package/dist/tests/templates/entities/types/xml-template.spec.js +55 -0
  184. package/dist/tests/templates/entities/utils/template-test-utils.d.ts +31 -0
  185. package/dist/tests/templates/entities/utils/template-test-utils.js +50 -0
  186. package/oclif.manifest.json +60 -1
  187. package/package.json +84 -55
  188. package/lib/commands/new.d.ts +0 -22
  189. package/lib/commands/new.js +0 -198
  190. package/lib/commands/scaffold.d.ts +0 -18
  191. package/lib/commands/scaffold.js +0 -106
  192. package/lib/index.d.ts +0 -1
  193. package/lib/lib/scaffold.d.ts +0 -30
  194. package/lib/lib/scaffold.js +0 -566
@@ -0,0 +1,77 @@
1
+ <%~ includeFile('./header.eta') %>
2
+
3
+ import { Test, TestingModule } from '@nestjs/testing';
4
+ import {<%= it.entityName %>, <%= it.entityName %>Create} from './dtos/<%= it.entityName%>.dto'
5
+ import {<%= it.ctrlName %>} from "./<%= it.entityName %>.controller";
6
+ import {<%= it.svcName %>} from "./<%= it.entityName %>.service";
7
+ import { CrudRequest } from '@nestjsx/crud';
8
+
9
+ const baseRequest: CrudRequest = {
10
+ parsed: {
11
+ fields: [],
12
+ paramsFilter: [],
13
+ search: {},
14
+ filter: [],
15
+ or: [],
16
+ join: [],
17
+ sort: [],
18
+ authPersist: undefined,
19
+ limit: 10,
20
+ offset: 0,
21
+ page: 1,
22
+ cache: undefined,
23
+ },
24
+ options: {}
25
+ }
26
+
27
+ describe('<%= it.ctrlName%>', () => {
28
+ let controller: <%= it.ctrlName%>;
29
+ let spyService: <%= it.svcName %>;
30
+
31
+ beforeEach(async () => {
32
+ const ApiServiceProvider = {
33
+ provide: <%= it.svcName %>,
34
+ useFactory: () => ({
35
+ createOne: jest.fn(() => []),
36
+ getOne: jest.fn(() => { }),
37
+ })
38
+ }
39
+ const module: TestingModule = await Test.createTestingModule({
40
+ controllers: [<%= it.ctrlName%>],
41
+ providers: [<%= it.svcName %>, ApiServiceProvider]
42
+ }).compile();
43
+
44
+ controller = module.get<<%= it.ctrlName%>>(<%= it.ctrlName%>);
45
+ spyService = module.get<<%= it.svcName %>>(<%= it.svcName %>);
46
+ });
47
+
48
+ it('should be defined', () => {
49
+ expect(controller).toBeDefined();
50
+ });
51
+
52
+ it('should call <%= it.ctrlName%> get method', () => {
53
+ const req: CrudRequest = { ...baseRequest }
54
+ expect(controller.get(req)).not.toEqual(null);
55
+ expect(spyService.getOne).toHaveBeenCalled();
56
+ });
57
+
58
+ it('should call <%= it.ctrlName%> create method', () => {
59
+ const req: CrudRequest = { ...baseRequest }
60
+
61
+ const dto = new <%= it.entityName %>();
62
+ controller.create(req, dto);
63
+ expect(controller.create(req, dto)).not.toEqual(null);
64
+ expect(spyService.createOne).toHaveBeenCalled();
65
+ });
66
+
67
+ // Add your tests here
68
+ <% /* getMany(req: CrudRequest): Promise<GetManyDefaultResponse<T> | T[]>;
69
+ getOne(req: CrudRequest): Promise<T>;
70
+ createOne(req: CrudRequest, dto: DeepPartial<T>): Promise<T>;
71
+ createMany(req: CrudRequest, dto: CreateManyDto<DeepPartial<T>>): Promise<T[]>;
72
+ updateOne(req: CrudRequest, dto: DeepPartial<T>): Promise<T>;
73
+ recoverOne(req: CrudRequest): Promise<T>;
74
+ replaceOne(req: CrudRequest, dto: DeepPartial<T>): Promise<T>;
75
+ deleteOne(req: CrudRequest): Promise<void | T>; */ %>
76
+ });
77
+
@@ -0,0 +1,171 @@
1
+ <%~ includeFile('./header.eta') %>
2
+
3
+ import { Controller } from "@nestjs/common";
4
+ import { Crud, CrudController, Override, ParsedRequest, CrudRequest, ParsedBody, CreateManyDto } from '@nestjsx/crud';
5
+ import { ApiTags, ApiResponse, ApiOperation, ApiBody } from '@nestjs/swagger';
6
+ import {<%= it.entityName %>, <%= it.entityName %>Create} from './dtos/<%= it.entityName%>.dto'
7
+ import {<%= it.svcName %>} from './<%= it.entityName %>.service';
8
+
9
+ @Crud({
10
+ model: {
11
+ type: <%= it.entityName %>
12
+ },
13
+ dto: {
14
+ create: <%= it.entityName %>Create,
15
+ update: <%= it.entityName %>,
16
+ replace: <%= it.entityName %>,
17
+ },
18
+ query: {
19
+ /**
20
+ * commenting out limit and pagination because of an issue with Crud lib: https://github.com/nestjsx/crud/issues/777
21
+ */
22
+ // TODO: make limit env driven?
23
+ limit: 5,
24
+ alwaysPaginate: true,
25
+ <% if (it.associations.length) { %>
26
+ join: {
27
+ <% it.associations.forEach((assoc) => { %>
28
+ <% if (assoc.type === 'OneToMany') { %>
29
+ <%= assoc.pluralizedRelationshipName %>: { eager: false },
30
+ <% } else if (assoc.type === 'ManyToOne') { %>
31
+ <%= assoc.relationshipName %>: { eager: false },
32
+ <% } else if (assoc.type === 'ManyToMany') { %>
33
+ <%= assoc.pluralizedRelationshipName %>: { eager: false },
34
+ <% } else if (assoc.type === 'OneToOne') { %>
35
+ <%= assoc.relationshipName %>: { eager: false },
36
+ <% } %>
37
+ <% }) %>
38
+ <% if (it.nestedAssociations.length) {%>
39
+ <% it.nestedAssociations.forEach((assoc) => { %>
40
+ "<%= assoc %>": { eager: false },
41
+ <% }) %>
42
+ <% }%>
43
+ },
44
+ <% } %>
45
+ }
46
+ })
47
+
48
+ @Controller('<%= it.pluralEntityName %>')
49
+ @ApiTags('<%= it.pluralEntityName %>')
50
+ export class <%= it.ctrlName %> implements CrudController<<%= it.entityName %>>{
51
+ constructor(public service: <%= it.svcName %>) {}
52
+
53
+ <% /* https://github.com/nestjsx/crud/wiki/Controllers#routes-override */ %>
54
+ <% /* Override the core controller methods:
55
+
56
+ getManyBase(
57
+ @ParsedRequest() req: CrudRequest,
58
+ ): Promise<GetManyDefaultResponse<T> | T[]>;
59
+
60
+ getOneBase(
61
+ @ParsedRequest() req: CrudRequest,
62
+ ): Promise<T>;
63
+
64
+ createOneBase(
65
+ @ParsedRequest() req: CrudRequest,
66
+ @ParsedBody() dto: T,
67
+ ): Promise<T>;
68
+
69
+ createManyBase(
70
+ @ParsedRequest() req: CrudRequest,
71
+ @ParsedBody() dto: CreateManyDto<T>,
72
+ ): Promise<T>;
73
+
74
+ updateOneBase(
75
+ @ParsedRequest() req: CrudRequest,
76
+ @ParsedBody() dto: T,
77
+ ): Promise<T>;
78
+
79
+ replaceOneBase(
80
+ @ParsedRequest() req: CrudRequest,
81
+ @ParsedBody() dto: T,
82
+ ): Promise<T>;
83
+
84
+ deleteOneBase(
85
+ @ParsedRequest() req: CrudRequest,
86
+ ): Promise<void | T>;
87
+ */ %>
88
+
89
+ get base(): CrudController<<%= it.entityName %>> {
90
+ return this;
91
+ }
92
+
93
+ @Override('getManyBase')
94
+ @ApiOperation({ summary: 'Retrieve multiple <%= it.pluralEntityName %>' })
95
+ getMany(
96
+ @ParsedRequest() req: CrudRequest,
97
+ ) {
98
+ return this.base.getManyBase(req);
99
+ }
100
+
101
+ @Override('getOneBase')
102
+ @ApiOperation({ summary: 'Retrieve a single <%= it.entityName %>' })
103
+ get(
104
+ @ParsedRequest() req: CrudRequest,
105
+ ) {
106
+ return this.base.getOneBase(req);
107
+ }
108
+
109
+ @Override('createOneBase')
110
+ @ApiOperation({ summary: 'Create a single <%= it.entityName %>' })
111
+ <% /* @ApiResponse({ status: 200, description: 'description goes here', schema: <%= it.entityName %>Create }) */ %>
112
+ @ApiBody({
113
+ type: <%= it.entityName %>Create ,
114
+ description: "The Description for the Post Body. Please look into the DTO. You will see the @ApiOptionalProperty used to define the Schema.",
115
+ <% /* examples: {
116
+ a: {
117
+ summary: "Empty Body",
118
+ description: "Description for when an empty body is used",
119
+ value: {} as <%= it.entityName %>Create
120
+ },
121
+ b: {
122
+ summary: "Hello Body",
123
+ description: "Hello is used as the greeting",
124
+ value: {greeting: "Hello"} as <%= it.entityName %>Create
125
+ }
126
+ } */ %>
127
+
128
+ })
129
+ create(
130
+ @ParsedRequest() req: CrudRequest,
131
+ @ParsedBody() dto: <%= it.entityName %>,
132
+ ) {
133
+ return this.base.createOneBase(req, dto);
134
+ }
135
+
136
+ @Override('createManyBase')
137
+ @ApiOperation({ summary: 'Create multiple<%= it.pluralEntityName %>' })
138
+ createMany(
139
+ @ParsedRequest() req: CrudRequest,
140
+ @ParsedBody() dto: CreateManyDto<<%= it.entityName %>>
141
+ ) {
142
+ return this.base.createManyBase(req, dto);
143
+ }
144
+
145
+ @Override('updateOneBase')
146
+ @ApiOperation({ summary: 'Update a single <%= it.entityName %>' })
147
+ update(
148
+ @ParsedRequest() req: CrudRequest,
149
+ @ParsedBody() dto: <%= it.entityName %>,
150
+ ) {
151
+ return this.base.updateOneBase(req, dto);
152
+ }
153
+
154
+ @Override('replaceOneBase')
155
+ @ApiOperation({ summary: 'Replace a single <%= it.entityName %>' })
156
+ replace(
157
+ @ParsedRequest() req: CrudRequest,
158
+ @ParsedBody() dto: <%= it.entityName %>,
159
+ ) {
160
+ return this.base.replaceOneBase(req, dto);
161
+ }
162
+
163
+ @Override('deleteOneBase')
164
+ @ApiOperation({ summary: 'Delete a single <%= it.entityName %>' })
165
+ delete(
166
+ @ParsedRequest() req: CrudRequest,
167
+ ) {
168
+ return this.base.deleteOneBase(req);
169
+ }
170
+ }
171
+
@@ -0,0 +1,48 @@
1
+ import { ApiProperty } from '@nestjs/swagger';
2
+ <%~ includeFile('./header.eta') %>
3
+
4
+ <% if (it.importEnums) { %>
5
+ import * as enums from '../../enums';
6
+ <% } %>
7
+
8
+ export class <%= it.name %>Create {
9
+ <% it.columns.forEach((field) => { %>
10
+ @ApiProperty()
11
+ <%if (field.dataType.includes("Enum")) {%>
12
+ <%= field.name %>: enums.<%= field.dataType %>;
13
+ <%} else if (field.type === 'json' || field.type === 'json-plain') {%>
14
+ <%= field.name %>: JSON;
15
+ <%} else if (field.type === 'timestamp' || field.type === 'timestamptz') {%>
16
+ <%= field.name %>: Date;
17
+ <%} else {%>
18
+ <%= field.name %>: <%= field.dataType %>;
19
+ <% } %>
20
+ <% }) %>
21
+ };
22
+
23
+ export class <%= it.name %> {
24
+ <% if (it.addDefaultPKProperty) { %>
25
+ @ApiProperty()
26
+ id: number;
27
+ <% } %>
28
+ <% it.columns.forEach((field) => { %>
29
+ @ApiProperty()
30
+ <%if (field.dataType.includes("Enum")) {%>
31
+ <%= field.name %>: enums.<%= field.dataType %>;
32
+ <%} else if (field.type === 'json' || field.type === 'json-plain') {%>
33
+ <%= field.name %>: JSON;
34
+ <%} else if (field.type === 'timestamp' || field.type === 'timestamptz') {%>
35
+ <%= field.name %>: Date;
36
+ <%} else {%>
37
+ <%= field.name %>: <%= field.dataType %>;
38
+ <% } %>
39
+ <% }) %>
40
+ <% if (it.createdAt) { %>
41
+ @ApiProperty()
42
+ created_at: Date;
43
+ <% } %>
44
+ <% if (it.updatedAt) { %>
45
+ @ApiProperty()
46
+ updated_at: Date;
47
+ <% } %>
48
+ };
@@ -0,0 +1,7 @@
1
+ <%~ includeFile('./header.eta') %>
2
+
3
+ <% it.allEnumsFields.forEach((enumType) => { %>
4
+ export enum <%= enumType.name %> {
5
+ <%~ enumType.values.map((enumValue) => `${enumValue} = '${enumValue}'`).join(', ') %>
6
+ }
7
+ <% }) %>
@@ -0,0 +1,11 @@
1
+ <%~ includeFile('./header.eta') %>
2
+
3
+ <% it.entities.forEach((entity) => { %>
4
+ import {<%= entity.name %>Module} from './<%= entity.name %>/<%= entity.name %>.module'
5
+ <%}) %>
6
+
7
+ export default [
8
+ <% it.entities.forEach((entity) => { %>
9
+ <%= entity.name %>Module,
10
+ <%}) %>
11
+ ]
@@ -0,0 +1,16 @@
1
+ <%~ includeFile('./header.eta') %>
2
+
3
+ import { Module } from "@nestjs/common";
4
+ import {<%= it.entityName %>} from './<%= it.entityName%>.entity'
5
+ import { TypeOrmModule } from "@nestjs/typeorm";
6
+ import {<%= it.svcName %>} from "./<%= it.entityName %>.service";
7
+ import {<%= it.ctrlName %>} from "./<%= it.entityName %>.controller";
8
+
9
+ @Module({
10
+ imports: [TypeOrmModule.forFeature([<%= it.entityName %>])],
11
+ providers: [<%= it.svcName %>],
12
+ exports: [<%= it.svcName %>],
13
+ controllers: [<%= it.ctrlName %>],
14
+ })
15
+ export class <%= it.modName %> {}
16
+
@@ -0,0 +1,9 @@
1
+ <% it.entities.forEach((entity) => { %>
2
+ import {<%= entity.name %>} from './autogen/<%= entity.name %>/<%= entity.name %>.entity'
3
+ <%}) %>
4
+
5
+ const entities = [
6
+ <% it.entities.forEach((entity) => { %>
7
+ <%= entity.name %>,
8
+ <%}) %>
9
+ ]
@@ -0,0 +1,25 @@
1
+ <%~ includeFile('./header.eta') %>
2
+
3
+ import { Injectable } from "@nestjs/common";
4
+ import { InjectRepository } from "@nestjs/typeorm";
5
+ import { TypeOrmCrudService } from "@nestjsx/crud-typeorm";
6
+ import { QueryOptions } from '@nestjsx/crud';
7
+ import { ParsedRequestParams } from '@nestjsx/crud-request';
8
+
9
+ import {<%= it.entityName %>} from './<%= it.entityName%>.entity'
10
+
11
+ @Injectable()
12
+ export class <%= it.svcName %> extends TypeOrmCrudService<<%= it.entityName %>> {
13
+ constructor(@InjectRepository(<%= it.entityName %>) repo) {
14
+ super(repo);
15
+ }
16
+
17
+ /**
18
+ *
19
+ * Solves https://github.com/nestjsx/crud/issues/777
20
+ */
21
+ getSelect(query: ParsedRequestParams, options: QueryOptions) {
22
+ return [...new Set(super.getSelect(query, options))]
23
+ }
24
+ }
25
+
@@ -0,0 +1,4 @@
1
+ export interface Unique {
2
+ fields: string[];
3
+ name?: string;
4
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,13 @@
1
+ import { Unique } from "./constraints";
2
+ import { Field } from "./field";
3
+ import { Index } from "./indices";
4
+ import { Association } from "./relationship";
5
+ export interface Entity {
6
+ name: string;
7
+ created_at?: boolean;
8
+ updated_at?: boolean;
9
+ fields?: Field[];
10
+ indexes?: Index[];
11
+ uniques?: Unique[];
12
+ associations?: Association[];
13
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,16 @@
1
+ export type FieldType = "text" | "boolean" | "array" | "enum" | "integer" | "float" | "date" | "json" | "json-plain";
2
+ export interface Field {
3
+ name: string;
4
+ type: FieldType;
5
+ values?: string[];
6
+ nullable?: boolean;
7
+ index?: boolean;
8
+ primary?: boolean;
9
+ unique?: boolean;
10
+ default?: string | null;
11
+ length?: number;
12
+ is_email?: boolean;
13
+ }
14
+ export interface ComputedField extends Field {
15
+ dataType: string;
16
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,5 @@
1
+ export { Entity } from "./entity";
2
+ export { FieldType, Field, ComputedField } from "./field";
3
+ export { Index } from "./indices";
4
+ export { JSONValue } from "./json";
5
+ export { RelationshipType, Association, ApsorcRelationship, Relationship, RelationshipForTemplate, RelationshipMap, } from "./relationship";
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,4 @@
1
+ export interface Index {
2
+ fields: string[];
3
+ unique?: boolean;
4
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,3 @@
1
+ export type JSONValue = string | number | boolean | undefined | {
2
+ [x: string]: JSONValue;
3
+ } | Array<JSONValue>;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,43 @@
1
+ export type RelationshipType = "OneToMany" | "ManyToOne" | "ManyToMany" | "OneToOne";
2
+ export interface ApsorcRelationship {
3
+ from: string;
4
+ to: string;
5
+ type: RelationshipType;
6
+ to_name?: string;
7
+ nullable?: boolean;
8
+ bi_directional?: boolean;
9
+ cascadeDelete?: boolean;
10
+ index?: boolean;
11
+ }
12
+ export interface Relationship {
13
+ name: string;
14
+ type: RelationshipType;
15
+ referenceName?: string | null;
16
+ nullable?: boolean;
17
+ join?: boolean;
18
+ biDirectional?: boolean;
19
+ cascadeDelete?: boolean;
20
+ index?: boolean;
21
+ }
22
+ export interface RelationshipForTemplate extends Relationship {
23
+ relationshipName: string;
24
+ pluralizedRelationshipName: string;
25
+ pluralizedName: string;
26
+ camelCasedName: string;
27
+ camelCasedId: string;
28
+ entityName: string;
29
+ joinTable: boolean;
30
+ biDirectional: boolean;
31
+ }
32
+ export type RelationshipMap = {
33
+ [key: string]: Relationship[];
34
+ };
35
+ export interface Association {
36
+ name: string;
37
+ type: RelationshipType;
38
+ join_table?: boolean;
39
+ reference_name?: string;
40
+ nested?: boolean;
41
+ nullable?: boolean;
42
+ index?: boolean;
43
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ export declare const camelCase: (str: string, firstUpper?: boolean) => string;
2
+ export declare const snakeCase: (str: string) => string;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.snakeCase = exports.camelCase = void 0;
4
+ const camelCase = (str, firstUpper) => {
5
+ const firstLetter = firstUpper ? str[0].toUpperCase() : str[0].toLowerCase();
6
+ const restOfLetters = str
7
+ .slice(1)
8
+ .replace(/_[A-Za-z]/g, (underLetter) => underLetter[1].toUpperCase());
9
+ return `${firstLetter}${restOfLetters}`;
10
+ };
11
+ exports.camelCase = camelCase;
12
+ const snakeCase = (str) => str[0].toLowerCase() +
13
+ str
14
+ .slice(1, str.length)
15
+ .replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
16
+ exports.snakeCase = snakeCase;
@@ -0,0 +1,6 @@
1
+ import { FieldType, Field, ComputedField, Entity } from "../types";
2
+ export declare const getJsTypeFromFieldType: (type: FieldType) => string;
3
+ export declare const getDefaultValueForField: (field: Field) => string | null;
4
+ export declare const getFieldForTemplate: (fields: Field[], entityName: string) => ComputedField[];
5
+ export declare const fieldToEnumType: (fieldName: string, entityName: string) => string;
6
+ export declare const typeExistsInEntity: (entity: Entity, type: string) => number;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.typeExistsInEntity = exports.fieldToEnumType = exports.getFieldForTemplate = exports.getDefaultValueForField = exports.getJsTypeFromFieldType = void 0;
4
+ const casing_1 = require("./casing");
5
+ const getJsTypeFromFieldType = (type) => {
6
+ switch (type) {
7
+ case "array":
8
+ return "string[]";
9
+ case "boolean":
10
+ return "boolean";
11
+ case "integer":
12
+ return "number";
13
+ case "float":
14
+ return "number";
15
+ case "text":
16
+ case "enum":
17
+ default:
18
+ return "string";
19
+ }
20
+ };
21
+ exports.getJsTypeFromFieldType = getJsTypeFromFieldType;
22
+ const getDefaultValueForField = (field) => {
23
+ var _a, _b;
24
+ switch (field.type) {
25
+ case "enum":
26
+ if (field.default === null) {
27
+ return null;
28
+ }
29
+ if (typeof field.default !== "undefined") {
30
+ if (!((_a = field.values) === null || _a === void 0 ? void 0 : _a.includes(field.default))) {
31
+ throw new Error(`${field.name}: Invalid default value '${field.default}' (Valid options are: '${(_b = field.values) === null || _b === void 0 ? void 0 : _b.join("', '")}')`);
32
+ }
33
+ return field.default;
34
+ }
35
+ if (typeof field.values !== "undefined") {
36
+ return field.values[0];
37
+ }
38
+ return null;
39
+ case "boolean":
40
+ if (typeof field.default !== "undefined") {
41
+ return field.default;
42
+ }
43
+ return "false";
44
+ default:
45
+ if (typeof field.default !== "undefined") {
46
+ return field.default;
47
+ }
48
+ return null;
49
+ }
50
+ };
51
+ exports.getDefaultValueForField = getDefaultValueForField;
52
+ const getFieldForTemplate = (fields, entityName) => fields.map((field) => ({
53
+ ...field,
54
+ default: (0, exports.getDefaultValueForField)(field),
55
+ dataType: field.type === "enum"
56
+ ? (0, exports.fieldToEnumType)(field.name, entityName)
57
+ : (0, exports.getJsTypeFromFieldType)(field.type),
58
+ }));
59
+ exports.getFieldForTemplate = getFieldForTemplate;
60
+ const fieldToEnumType = (fieldName, entityName) => `${(0, casing_1.camelCase)(entityName, true)}${(0, casing_1.camelCase)(fieldName, true)}Enum`;
61
+ exports.fieldToEnumType = fieldToEnumType;
62
+ const typeExistsInEntity = (entity, type) => (entity === null || entity === void 0 ? void 0 : entity.fields)
63
+ ? entity === null || entity === void 0 ? void 0 : entity.fields.findIndex((field) => field.type === type)
64
+ : -1;
65
+ exports.typeExistsInEntity = typeExistsInEntity;
@@ -0,0 +1,2 @@
1
+ export declare const createFile: (file: string, content: string) => void;
2
+ export declare const createDirectoryContents: (templatePath: string, newProjectPath: string, apiType: string) => void;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDirectoryContents = exports.createFile = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const path = tslib_1.__importStar(require("path"));
6
+ const fs = tslib_1.__importStar(require("fs"));
7
+ const createDir = (dirname) => {
8
+ if (!fs.existsSync(dirname)) {
9
+ fs.mkdirSync(dirname, { recursive: true });
10
+ }
11
+ };
12
+ const createFile = (file, content) => {
13
+ const dirname = path.dirname(file);
14
+ createDir(dirname);
15
+ fs.writeFileSync(file, content);
16
+ };
17
+ exports.createFile = createFile;
18
+ const createDirectoryContents = (templatePath, newProjectPath, apiType) => {
19
+ const filesToCreate = fs.readdirSync(templatePath);
20
+ const CURR_DIR = process.cwd();
21
+ filesToCreate.forEach((file) => {
22
+ const origFilePath = `${templatePath}/${file}`;
23
+ // get stats about the current file
24
+ const stats = fs.statSync(origFilePath);
25
+ if (stats.isFile()) {
26
+ writeFile(file, origFilePath, `${CURR_DIR}/${newProjectPath}`, stats.mode, apiType);
27
+ }
28
+ else if (stats.isDirectory()) {
29
+ fs.mkdirSync(`${CURR_DIR}/${newProjectPath}/${file}`);
30
+ // recursive call
31
+ (0, exports.createDirectoryContents)(`${templatePath}/${file}`, `${newProjectPath}/${file}`, apiType);
32
+ }
33
+ });
34
+ };
35
+ exports.createDirectoryContents = createDirectoryContents;
36
+ /* eslint-disable max-params */
37
+ const writeFile = (fileName, origFilePath, writePath, mode, apiType) => {
38
+ const contents = fs.readFileSync(origFilePath, "utf8");
39
+ if (fileName.startsWith("app.module") && fileName.includes(apiType)) {
40
+ fileName = "app.module.ts";
41
+ const fileWritePath = `${writePath}/${fileName}`;
42
+ fs.writeFileSync(fileWritePath, contents, "utf8");
43
+ fs.chmodSync(fileWritePath, mode);
44
+ }
45
+ else if (!fileName.startsWith("app.module")) {
46
+ if (fileName === ".npmignore")
47
+ fileName = ".gitignore";
48
+ const fileWritePath = `${writePath}/${fileName}`;
49
+ fs.writeFileSync(fileWritePath, contents, "utf8");
50
+ fs.chmodSync(fileWritePath, mode);
51
+ }
52
+ };
@@ -0,0 +1,2 @@
1
+ export { parseRelationships, getRelationshipsForImport, getRelationshipForTemplate, getNestedRelationships, getRelationshipIdField, } from "./parse";
2
+ export { parseV1Relationships } from "./parse-v1";