@apso/cli 0.0.5 → 0.0.44

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 +100 -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
@@ -1,566 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createModuleExport = exports.createModuleComponent = exports.createModuleService = exports.createModuleOpertions = exports.createModuleReducer = exports.createModuleAction = exports.createModuleModel = exports.createGraphQLActions = exports.createResolver = exports.createRepository = exports.createEntity = exports.createService = exports.createRoutes = exports.createController = void 0;
4
- const path = require('path');
5
- const fs = require("fs");
6
- const createHeader = () => `
7
- /**
8
- * This file generated by Apso.
9
- */
10
- `;
11
- const createFile = (file, content) => {
12
- const dirname = path.dirname(file);
13
- if (!fs.existsSync(dirname)) {
14
- fs.mkdirSync(dirname, { recursive: true });
15
- }
16
- fs.writeFileSync(file, content);
17
- };
18
- const camelCase = (str) => str[0].toLowerCase() + str.slice(1);
19
- const mapTypes = (type) => {
20
- switch (type) {
21
- case 'array':
22
- return 'string[]';
23
- case 'boolean':
24
- return 'boolean';
25
- case 'text':
26
- case 'enum':
27
- default:
28
- return 'string';
29
- }
30
- };
31
- // Server
32
- exports.createController = (apiBaseDir, entityName) => {
33
- const ctrlDir = path.join(apiBaseDir, 'controllers');
34
- const ctrlFile = path.join(ctrlDir, `${entityName}Controller.ts`);
35
- // Dependencies
36
- const svcName = `${entityName}Service`;
37
- const ctrlName = `${entityName}Controller`;
38
- const content = `${createHeader()}
39
- import {HttpServer} from '@apso/server';
40
- import ${svcName} from '../services/${svcName}';
41
-
42
- class ${ctrlName} extends HttpServer.BaseController {
43
- private readonly service: ${svcName};
44
-
45
- public constructor(
46
- /** ${svcName} */service: ${svcName}
47
- ){
48
- super();
49
- this.service = service;
50
- }
51
-
52
- public async list() {
53
- }
54
-
55
- public async create(){
56
- }
57
- }
58
-
59
- export default ${ctrlName}`;
60
- if (fs.existsSync(ctrlFile)) {
61
- return;
62
- }
63
- createFile(ctrlFile, content);
64
- };
65
- exports.createRoutes = (apiBaseDir, entityName) => {
66
- const ctrlDir = path.join(apiBaseDir, 'routes');
67
- const file = path.join(ctrlDir, `${entityName}Routes.ts`);
68
- // Dependencies
69
- const ctrlName = `${entityName}Controller`;
70
- const content = `${createHeader()}
71
- import {Container} from 'sahara';
72
- import {HttpServer} from '@apso/server';
73
- import ${ctrlName} from '../controllers/${ctrlName}';
74
-
75
- export default (container: Container) => {
76
- const router = container.resolveSync<HttpServer.Router>('PublicRouter');
77
-
78
- router.get('/list', ${ctrlName}, 'list');
79
- };`;
80
- if (fs.existsSync(file)) {
81
- return;
82
- }
83
- createFile(file, content);
84
- };
85
- exports.createService = (apiBaseDir, entityName) => {
86
- const ctrlDir = path.join(apiBaseDir, 'services');
87
- const file = path.join(ctrlDir, `${entityName}Service.ts`);
88
- // Dependencies
89
- const svcName = `${entityName}Service`;
90
- const content = `${createHeader()}
91
- export default class ${svcName} {
92
- }`;
93
- if (fs.existsSync(file)) {
94
- return;
95
- }
96
- createFile(file, content);
97
- };
98
- exports.createEntity = (apiBaseDir, entity) => {
99
- const { name, fields = [], associations = [] } = entity;
100
- const Dir = path.join(apiBaseDir, 'entities');
101
- const File = path.join(Dir, `${name}.ts`);
102
- // const camelCase = entityName[0].toLowerCase() + entityName.slice(1)
103
- const columns = fields.map((field) => {
104
- var _a;
105
- let column;
106
- switch (field.type) {
107
- case 'enum':
108
- column = `
109
- @Field()
110
- @Column({
111
- type: '${field.type}',
112
- enum: [${(_a = field.values) === null || _a === void 0 ? void 0 : _a.map(s => `'${s}'`).join(',')}]
113
- })`;
114
- break;
115
- case 'array':
116
- column = `
117
- @Field(type => [String])
118
- @Column("text", {array: true})`;
119
- break;
120
- case 'boolean':
121
- column = `
122
- @Field()
123
- @Column()`;
124
- break;
125
- case 'text':
126
- column = `
127
- @Field()
128
- @Column({
129
- nullable: ${Boolean(field.nullable)}
130
- })`;
131
- break;
132
- }
133
- return `
134
- ${column}
135
- public ${field.name}!: ${mapTypes(field.type)};
136
- `;
137
- });
138
- const relations = associations.map((association) => {
139
- const { type, name } = association;
140
- switch (type) {
141
- case 'OneToMany':
142
- return `
143
- @${type}(type => ${name}, ${camelCase(name)} => ${camelCase(name)}.${camelCase(entity.name)})
144
- ${camelCase(name)}s: ${name}[];
145
- `;
146
- case 'ManyToOne':
147
- return `
148
- @${type}(type => ${name}, ${camelCase(name)} => ${camelCase(name)}.${camelCase(entity.name)}s)
149
- ${camelCase(name)}: ${name};
150
- `;
151
- case 'ManyToMany':
152
- return `
153
- @${type}(type => ${name}, ${camelCase(name)} => ${camelCase(name)}.${camelCase(entity.name)}s)
154
- @JoinTable()
155
- ${camelCase(name)}: ${name};
156
- `;
157
- }
158
- });
159
- const content = `${createHeader()}
160
- import { Database } from '@apso/server'
161
- import {
162
- Column,
163
- Entity,
164
- ${associations
165
- .map(assoc => `${assoc.type},\n`)
166
- .filter((v, i, s) => s.indexOf(v) === i)
167
- .join('')}
168
- ${associations
169
- .map(assoc => (assoc.type === 'ManyToMany' && 'JoinTable,\n') || '')
170
- .filter((v, i, s) => s.indexOf(v) === i)
171
- .join('')}
172
- PrimaryGeneratedColumn,
173
- } from "typeorm";
174
- import { ObjectType, Field, Int, InputType } from "type-graphql";
175
- ${associations.map(assoc => `import ${assoc.name} from './${assoc.name}';`).join('\n')}
176
-
177
- @ObjectType()
178
- @InputType('${name}Input')
179
- @Entity()
180
- export default class ${name} extends Database.TimestampedModel{
181
- // Fields
182
- @Field()
183
- @PrimaryGeneratedColumn()
184
- public id!: number;
185
- ${columns.join('\n')}
186
- // Associations
187
- ${relations.join('\n')}
188
- }`;
189
- if (fs.existsSync(File)) {
190
- return;
191
- }
192
- createFile(File, content);
193
- };
194
- exports.createRepository = (apiBaseDir, entityName) => {
195
- const Dir = path.join(apiBaseDir, 'repositories');
196
- const File = path.join(Dir, `${entityName}Repository.ts`);
197
- const camelCase = entityName[0].toLowerCase() + entityName.slice(1);
198
- const content = `${createHeader()}
199
- import { Database } from '@apso/server'
200
- import {
201
- EntityRepository,
202
- } from "typeorm";
203
- import ${entityName} from "../entities/${entityName}";
204
-
205
- @EntityRepository(${entityName})
206
- export default class ${entityName}Repository extends Database.BaseRepository<${entityName}> {
207
- public setContext() {
208
- this.entity = ${entityName};
209
- this.entityName = '${camelCase}';
210
- }
211
- }`;
212
- if (fs.existsSync(File)) {
213
- return;
214
- }
215
- createFile(File, content);
216
- };
217
- exports.createResolver = (apiBaseDir, entity) => {
218
- const { name: entityName, fields = [] } = entity;
219
- const Dir = path.join(apiBaseDir, 'resolvers');
220
- const File = path.join(Dir, `${entityName}Resolver.ts`);
221
- const columns = fields.map((field) => {
222
- let column;
223
- switch (field.type) {
224
- case 'enum':
225
- column = `
226
- @Field()
227
- `;
228
- break;
229
- case 'array':
230
- column = `
231
- @Field(type => [String])`;
232
- break;
233
- case 'boolean':
234
- column = `
235
- @Field()`;
236
- break;
237
- case 'text':
238
- column = `
239
- @Field()`;
240
- break;
241
- }
242
- return `
243
- ${column}
244
- public ${field.name}!: ${mapTypes(field.type)};
245
- `;
246
- });
247
- const content = `${createHeader()}
248
- import {
249
- Resolver,
250
- Query,
251
- Mutation,
252
- Arg,
253
- InputType,
254
- Field
255
- } from "type-graphql";
256
- import ${entityName} from "../entities/${entityName}";
257
- import ${entityName}Repository from "../repositories/${entityName}Repository";
258
-
259
- @InputType()
260
- class Create${entityName}Input implements Partial<${entityName}> {
261
- ${columns.join('\n')}
262
- }
263
-
264
- @Resolver()
265
- export default class ${entityName}Resolver {
266
- private readonly ${camelCase(entityName)}Repo: ${entityName}Repository
267
-
268
- constructor(
269
- /** ${entityName}Repository */${camelCase(entityName)}Repo: ${entityName}Repository,
270
- ) {
271
- this.${camelCase(entityName)}Repo = ${camelCase(entityName)}Repo;
272
- }
273
-
274
- @Query(() => ${entityName})
275
- get${entityName}(
276
- @Arg("id") id: number
277
- ) {
278
- return this.${camelCase(entityName)}Repo.findById(id)
279
- }
280
-
281
- @Query(() => [${entityName}])
282
- get${entityName}s() {
283
- return this.${camelCase(entityName)}Repo.findAll()
284
- }
285
-
286
- @Mutation(() => ${entityName})
287
- create${entityName}(
288
- @Arg("data") data: Create${entityName}Input
289
- ) {
290
- return this.${camelCase(entityName)}Repo.create(data)
291
- }
292
-
293
- @Mutation(() => ${entityName})
294
- async update${entityName}(
295
- @Arg("data") data: ${entityName}
296
- ) {
297
- if (!data.id) {
298
- throw new Error('missing id')
299
- }
300
-
301
- await this.${camelCase(entityName)}Repo.update(data.id, data)
302
-
303
- return data
304
- }
305
-
306
-
307
- }`;
308
- if (fs.existsSync(File)) {
309
- return;
310
- }
311
- createFile(File, content);
312
- };
313
- // APP
314
- exports.createGraphQLActions = (appBaseDir, entity) => {
315
- const { name: entityName, fields = [] } = entity;
316
- const Dir = path.join(appBaseDir, 'graphql');
317
- const File = path.join(Dir, `${entityName}.graphql`);
318
- const columns = fields.map((field) => {
319
- switch (field.type) {
320
- case 'array':
321
- return `${field.name}: [String]!`;
322
- case 'boolean':
323
- return `${field.name}: Boolean!`;
324
- case 'text':
325
- case 'enum':
326
- default:
327
- return `${field.name}: String!`;
328
- }
329
- });
330
- const content = `type ${entityName}Input {
331
- id: Float!
332
- ${columns.join('\n')}
333
- }
334
-
335
- type Create${entityName}Input {
336
- ${columns.join('\n')}
337
- }
338
-
339
- query Get${entityName}($id: Float!) {
340
- get${entityName}(id: $id) {
341
- ${fields.map((field) => field.name).join('\n')}
342
- }
343
- }
344
-
345
- query Get${entityName}s {
346
- get${entityName}s {
347
- ${fields.map((field) => field.name).join('\n')}
348
- }
349
- }
350
-
351
- mutation Create${entityName}($data: Create${entityName}Input!) {
352
- create${entityName}(data: $data) {
353
- id
354
- ${fields.map((field) => field.name).join('\n')}
355
- }
356
- }
357
-
358
- mutation Update${entityName}($data: ${entityName}Input!) {
359
- update${entityName}(data: $data) {
360
- id
361
- ${fields.map((field) => field.name).join('\n')}
362
- }
363
- }
364
- `;
365
- if (fs.existsSync(File)) {
366
- return;
367
- }
368
- createFile(File, content);
369
- };
370
- exports.createModuleModel = (appBaseDir, entityName) => {
371
- const storeEntityDir = path.join(appBaseDir, 'store');
372
- const file = path.join(storeEntityDir, 'model.ts');
373
- const content = `export interface ${entityName}Model {
374
- }
375
-
376
- export namespace ${entityName}Model {
377
- }
378
-
379
- export interface ${entityName}StateModel {
380
- selected?: ${entityName}Model
381
- collection: ${entityName}Model[]
382
- }`;
383
- if (fs.existsSync(file)) {
384
- return;
385
- }
386
- createFile(file, content);
387
- };
388
- const createCRUDActions = (verb, entityName) =>
389
- // eslint-disable-next-line indent
390
- `export const ${verb}${entityName}Request = createAction(Type.${verb.toUpperCase()}_${entityName.toUpperCase()}_REQUEST);
391
- export const ${verb}${entityName}Response = createAction(Type.${verb.toUpperCase()}_${entityName.toUpperCase()}_RESPONSE);
392
- `;
393
- exports.createModuleAction = (appBaseDir, entityName) => {
394
- const storeEntityDir = path.join(appBaseDir, 'store');
395
- const file = path.join(storeEntityDir, 'actions.ts');
396
- const entityNameAllCaps = `${entityName}`.toUpperCase();
397
- const content = `import { createAction } from 'redux-actions';
398
-
399
- export enum Type {
400
- ADD_${entityNameAllCaps} = 'ADD_${entityNameAllCaps}',
401
- ADD_${entityNameAllCaps}_REQUEST = 'ADD_${entityNameAllCaps}_REQUEST',
402
- ADD_${entityNameAllCaps}_RESPONSE = 'ADD_${entityNameAllCaps}_RESPONSE',
403
- EDIT_${entityNameAllCaps} = 'EDIT_${entityNameAllCaps}',
404
- EDIT_${entityNameAllCaps}_REQUEST = 'EDIT_${entityNameAllCaps}_REQUEST',
405
- EDIT_${entityNameAllCaps}_RESPONSE = 'EDIT_${entityNameAllCaps}_RESPONSE',
406
- DELETE_${entityNameAllCaps} = 'DELETE_${entityNameAllCaps}',
407
- DELETE_${entityNameAllCaps}_REQUEST = 'DELETE_${entityNameAllCaps}_REQUEST',
408
- DELETE_${entityNameAllCaps}_RESPONSE = 'DELETE_${entityNameAllCaps}_RESPONSE',
409
- LIST_${entityNameAllCaps}S = 'LIST_${entityNameAllCaps}S'
410
- LIST_${entityNameAllCaps}S_REQUEST = 'LIST_${entityNameAllCaps}S_REQUEST'
411
- LIST_${entityNameAllCaps}S_RESPONSE = 'LIST_${entityNameAllCaps}S_RESPONSE'
412
- }
413
-
414
- ${createCRUDActions('add', entityName)}
415
- ${createCRUDActions('edit', entityName)}
416
- ${createCRUDActions('delete', entityName)}
417
- ${createCRUDActions('list', `${entityName}s`)}`;
418
- if (fs.existsSync(file)) {
419
- return;
420
- }
421
- createFile(file, content);
422
- };
423
- exports.createModuleReducer = (appBaseDir, entityName) => {
424
- const storeEntityDir = path.join(appBaseDir, 'store');
425
- const file = path.join(storeEntityDir, 'reducer.ts');
426
- const entityNameAllCaps = `${entityName}`.toUpperCase();
427
- const content = `import { handleActions, Action } from 'redux-actions';
428
- import { RootState } from '../state';
429
- import { Type } from './actions';
430
- import { ${entityName}Model, ${entityName}StateModel } from './model';
431
-
432
- const initialState: ${entityName}StateModel = {
433
- collection: []
434
- };
435
-
436
- interface Payload {
437
-
438
- }
439
-
440
- const add${entityName} = (state: RootState.${entityName}State, action: Action<any>): RootState.${entityName}State => {
441
- return state;
442
- }
443
- const delete${entityName} = (state: RootState.${entityName}State, action: Action<Payload>) => {
444
- return state;
445
- }
446
- const edit${entityName} = (state: RootState.${entityName}State, action: Action<Payload>) => {
447
- return state;
448
- }
449
- const list${entityName}s = (state: RootState.${entityName}State, action: Action<Payload>) => {
450
- return {
451
- ...state
452
- }
453
- }
454
-
455
- export const ${entityName}Reducer = handleActions<RootState.${entityName}State, ${entityName}Model>(
456
- {
457
- [Type.ADD_${entityNameAllCaps}]: add${entityName},
458
- [Type.DELETE_${entityNameAllCaps}]: delete${entityName},
459
- [Type.EDIT_${entityNameAllCaps}]: edit${entityName},
460
- [Type.LIST_${entityNameAllCaps}S]: list${entityName}s,
461
- },
462
- initialState
463
- );`;
464
- if (fs.existsSync(file)) {
465
- return;
466
- }
467
- createFile(file, content);
468
- };
469
- exports.createModuleOpertions = (appBaseDir, entityName) => {
470
- const storeEntityDir = path.join(appBaseDir, 'store');
471
- const file = path.join(storeEntityDir, 'operations.ts');
472
- const content = `import { Dispatch, AnyAction } from 'redux';
473
- import {
474
- ${['add', 'edit', 'delete', 'list'].map((verb) => {
475
- switch (verb) {
476
- case 'list':
477
- return `
478
- ${verb}${entityName}sRequest
479
- ${verb}${entityName}sResponse
480
- `;
481
- default:
482
- return `
483
- ${verb}${entityName}Request
484
- ${verb}${entityName}Response
485
- `;
486
- }
487
- })}
488
- } from './actions'
489
- import * as ${entityName}Service from '../service'
490
-
491
- /**
492
- * Add Store Operations here
493
- * e.g.
494
- * export const add${entityName} = (): any =>
495
- (dispatch: Dispatch<AnyAction>) => {
496
- dispatch(add${entityName}Request())
497
- ${entityName}Service
498
- .add()
499
- .then((data: any) => {
500
- dispatch(add${entityName}Response(data))
501
- })
502
- .catch((err: AxiosError) => {
503
- const error = err.response && err.response.data || err;
504
- dispatch(add${entityName}Response({ error }))
505
- });
506
- };
507
- */
508
- `;
509
- if (fs.existsSync(file)) {
510
- return;
511
- }
512
- createFile(file, content);
513
- };
514
- exports.createModuleService = (appBaseDir, entityName) => {
515
- const storeEntityDir = path.join(appBaseDir);
516
- const file = path.join(storeEntityDir, 'service.ts');
517
- const content = `import * as api from '../../sdk/api'
518
-
519
- /**
520
- * Add Service functions
521
- * e.g.
522
- *
523
- export const add = () => api.post('${entityName.toLowerCase()}/add')
524
- */
525
- `;
526
- if (fs.existsSync(file)) {
527
- return;
528
- }
529
- createFile(file, content);
530
- };
531
- exports.createModuleComponent = (appBaseDir, entityName) => {
532
- const storeEntityDir = path.join(appBaseDir, 'components');
533
- const file = path.join(storeEntityDir, 'index.tsx');
534
- const content = `import * as React from 'react';
535
-
536
- function ${entityName}() {
537
- return (
538
- <div>Welcome to the ${entityName} Page</div>
539
- );
540
- }
541
-
542
- export default ${entityName};
543
- `;
544
- if (fs.existsSync(file)) {
545
- return;
546
- }
547
- createFile(file, content);
548
- };
549
- exports.createModuleExport = (appBaseDir, entityName) => {
550
- const storeEntityDir = path.join(appBaseDir);
551
- const file = path.join(storeEntityDir, 'index.ts');
552
- const content = `import ${entityName} from "./components";
553
-
554
- // Components
555
- export {
556
- ${entityName}
557
- }
558
-
559
- // Store
560
- export * from './store'
561
- `;
562
- if (fs.existsSync(file)) {
563
- return;
564
- }
565
- createFile(file, content);
566
- };