@mikemajesty/microservice-crud 0.0.1

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 (44) hide show
  1. package/README.md +92 -0
  2. package/bin/microservice-crud +3 -0
  3. package/package.json +32 -0
  4. package/src/cli.js +314 -0
  5. package/src/scafold/mongo/.gitkeep +0 -0
  6. package/src/scafold/postgres/.gitkeep +0 -0
  7. package/src/templates/mongo/core/entity/entity.js +49 -0
  8. package/src/templates/mongo/core/repository/repository.js +18 -0
  9. package/src/templates/mongo/core/use-cases/__tests__/create.spec.js +63 -0
  10. package/src/templates/mongo/core/use-cases/__tests__/delete.spec.js +74 -0
  11. package/src/templates/mongo/core/use-cases/__tests__/getByID.spec.js +70 -0
  12. package/src/templates/mongo/core/use-cases/__tests__/list.spec.js +80 -0
  13. package/src/templates/mongo/core/use-cases/__tests__/update.spec.js +78 -0
  14. package/src/templates/mongo/core/use-cases/create.js +28 -0
  15. package/src/templates/mongo/core/use-cases/delete.js +37 -0
  16. package/src/templates/mongo/core/use-cases/getByID.js +32 -0
  17. package/src/templates/mongo/core/use-cases/list.js +26 -0
  18. package/src/templates/mongo/core/use-cases/update.js +42 -0
  19. package/src/templates/mongo/modules/adapter.js +42 -0
  20. package/src/templates/mongo/modules/controller.js +95 -0
  21. package/src/templates/mongo/modules/module.js +100 -0
  22. package/src/templates/mongo/modules/repository.js +36 -0
  23. package/src/templates/mongo/modules/schema.js +45 -0
  24. package/src/templates/mongo/modules/swagger.js +91 -0
  25. package/src/templates/mongo/modules/types.js +49 -0
  26. package/src/templates/postgres/core/entity/entity.js +49 -0
  27. package/src/templates/postgres/core/repository/repository.js +18 -0
  28. package/src/templates/postgres/core/use-cases/__tests__/create.spec.js +58 -0
  29. package/src/templates/postgres/core/use-cases/__tests__/delete.spec.js +73 -0
  30. package/src/templates/postgres/core/use-cases/__tests__/getByID.spec.js +69 -0
  31. package/src/templates/postgres/core/use-cases/__tests__/list.spec.js +79 -0
  32. package/src/templates/postgres/core/use-cases/__tests__/update.spec.js +70 -0
  33. package/src/templates/postgres/core/use-cases/create.js +28 -0
  34. package/src/templates/postgres/core/use-cases/delete.js +37 -0
  35. package/src/templates/postgres/core/use-cases/getByID.js +32 -0
  36. package/src/templates/postgres/core/use-cases/list.js +23 -0
  37. package/src/templates/postgres/core/use-cases/update.js +39 -0
  38. package/src/templates/postgres/modules/adapter.js +42 -0
  39. package/src/templates/postgres/modules/controller.js +95 -0
  40. package/src/templates/postgres/modules/module.js +80 -0
  41. package/src/templates/postgres/modules/repository.js +47 -0
  42. package/src/templates/postgres/modules/schema.js +32 -0
  43. package/src/templates/postgres/modules/swagger.js +90 -0
  44. package/src/templates/postgres/modules/types.js +52 -0
package/README.md ADDED
@@ -0,0 +1,92 @@
1
+ # Nestjs CLI monorepo
2
+
3
+ ### [Monorepo](https://github.com/mikemajesty/nestjs-monorepo) CLI
4
+
5
+ ### install
6
+ -
7
+ ```
8
+ $ npm i -g @mikemajesty/microservice-crud
9
+ ```
10
+ ---
11
+ ### Usage
12
+ - 1 - type cli command
13
+ ```bash
14
+ $ microservice-crud
15
+ ```
16
+ - 2 select template type [API, MODULE, TEST]
17
+ <br>[<img alt="mikemajesty" src="https://raw.githubusercontent.com/mikemajesty/microservice-crud/master/img/select-template.png">](https://github.com/mikemajesty)
18
+
19
+
20
+
21
+
22
+ - 3 - type template name
23
+ <br>[<img alt="mikemajesty" src="https://raw.githubusercontent.com/mikemajesty/microservice-crud/master/img/template-name.png">](https://github.com/mikemajesty)
24
+
25
+
26
+
27
+ - 4 - Select path template
28
+ ```bash
29
+ # API must be inside [apps] folder - nestjs-monorepo/apps/
30
+ # MODULE must be inside [api] folder - nestjs-monorepo/apps/auth-api/src/modules/
31
+ # TEST must be inside [*] folder - nestjs-monorepo/*
32
+ ```
33
+
34
+ ---
35
+ ### API skeleton
36
+ ```
37
+ .
38
+ └── main-api
39
+ ├── Dockerfile
40
+ ├── jest.config.js
41
+ ├── package.json
42
+ ├── src
43
+ │   ├── main.ts
44
+ │   └── modules
45
+ │   ├── health
46
+ │   │   ├── adapter.ts
47
+ │   │   ├── controller.ts
48
+ │   │   ├── module.ts
49
+ │   │   ├── service.ts
50
+ │   │   ├── swagger.ts
51
+ │   │   └── __tests__
52
+ │   │   ├── controller.e2e.spec.ts
53
+ │   │   ├── module.spec.ts
54
+ │   │   └── service.spec.ts
55
+ │   └── module.ts
56
+ ├── tests
57
+ │   └── initialization.js
58
+ ├── tsconfig.build.json
59
+ └── tsconfig.json
60
+ ```
61
+
62
+ ### MODULE skeleton
63
+ ```
64
+ .
65
+ └── module
66
+ ├── adapter.ts
67
+ ├── controller.ts
68
+ ├── module.ts
69
+ ├── service.ts
70
+ ├── swagger.ts
71
+ └── __tests__
72
+ ├── controller.e2e.spec.ts
73
+ ├── module.spec.ts
74
+ └── service.spec.ts
75
+ ```
76
+ ### TEST skeleton
77
+ ```
78
+ .
79
+ └── __tests__
80
+ ├── controller.e2e.spec.ts
81
+ ├── module.spec.ts
82
+ └── service.spec.ts
83
+ ```
84
+ ---
85
+ The following is a list of all the people that have contributed Nestjs monorepo CLI. Thanks for your contributions!
86
+
87
+ [<img alt="mikemajesty" src="https://avatars1.githubusercontent.com/u/11630212?s=460&v=4&s=117" width="117">](https://github.com/mikemajesty)
88
+
89
+ ## License
90
+
91
+ It is available under the MIT license.
92
+ [License](https://opensource.org/licenses/mit-license.php)
@@ -0,0 +1,3 @@
1
+ #! /usr/bin/env node
2
+ require = require('esm')(module /*, options */)
3
+ require('../src/cli').cli(process.argv);
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@mikemajesty/microservice-crud",
3
+ "version": "0.0.01",
4
+ "description": "Monorepo CLI",
5
+ "main": "src/cli.js",
6
+ "scripts": {
7
+ "permission": "chmod -R 777 ./bin/*",
8
+ "crud": "node ./bin/microservice-crud"
9
+ },
10
+ "bin": {
11
+ "@mikemajesty/microservice-crud": "bin/microservice-crud",
12
+ "microservice-crud": "bin/microservice-crud"
13
+ },
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "keywords": [
18
+ "cli",
19
+ "microservice-crud"
20
+ ],
21
+ "license": "MIT",
22
+ "dependencies": {
23
+ "arg": "^5.0.1",
24
+ "cli-select": "^1.1.2",
25
+ "colorette": "^2.0.19",
26
+ "esm": "^3.2.25",
27
+ "fs": "^0.0.1-security",
28
+ "fs-extra": "^10.1.0",
29
+ "prompt-sync": "^4.2.0",
30
+ "rimraf": "^3.0.2"
31
+ }
32
+ }
package/src/cli.js ADDED
@@ -0,0 +1,314 @@
1
+ import fs from 'fs';
2
+ import { bold, green, red } from 'colorette';
3
+ const fse = require('fs-extra');
4
+ import path from 'path';
5
+ const { exec } = require('child_process');
6
+ const cliSelect = require('cli-select');
7
+ const prompt = require('prompt-sync')();
8
+
9
+ const { getCoreUsecaseCreateTest } = require('./templates/postgres/core/use-cases/__tests__/create.spec');
10
+ const { getCoreUsecaseUpdateTest } = require('./templates/postgres/core/use-cases/__tests__/update.spec');
11
+ const { getCoreUsecaseDeleteTest } = require('./templates/postgres/core/use-cases/__tests__/delete.spec');
12
+ const { getCoreUsecaseListTest } = require('./templates/postgres/core/use-cases/__tests__/list.spec');
13
+ const { getCoreUsecaseGetByIDTest } = require('./templates/postgres/core/use-cases/__tests__/getByID.spec');
14
+ const { getCoreUsecaseGetByID } = require('./templates/postgres/core/use-cases/getByID');
15
+ const { getCoreUsecaseList } = require('./templates/postgres/core/use-cases/list');
16
+ const { getCoreEntity } = require('./templates/postgres/core/entity/entity');
17
+ const { getCoreRepository } = require('./templates/postgres/core/repository/repository');
18
+ const { getCoreUsecaseCreate } = require('./templates/postgres/core/use-cases/create');
19
+ const { getCoreUsecaseDelete } = require('./templates/postgres/core/use-cases/delete');
20
+ const { getCoreUsecaseUpdate } = require('./templates/postgres/core/use-cases/update');
21
+
22
+ const { getModuleAdapter } = require('./templates/postgres/modules/adapter');
23
+ const { getModuleController } = require('./templates/postgres/modules/controller');
24
+ const { getModule } = require('./templates/postgres/modules/module');
25
+ const { getModuleRepository } = require('./templates/postgres/modules/repository');
26
+ const { getModuleSchema } = require('./templates/postgres/modules/schema');
27
+ const { getModuleSwagger } = require('./templates/postgres/modules/swagger');
28
+ const { getModuleType } = require('./templates/postgres/modules/types');
29
+
30
+ const { getCoreUsecaseCreateTest: getCoreUsecaseCreateMongoTest } = require('./templates/mongo/core/use-cases/__tests__/create.spec');
31
+ const { getCoreUsecaseUpdateTest: getCoreUsecaseUpdateMongoTest } = require('./templates/mongo/core/use-cases/__tests__/update.spec');
32
+ const { getCoreUsecaseDeleteTest: getCoreUsecaseDeleteMongoTest } = require('./templates/mongo/core/use-cases/__tests__/delete.spec');
33
+ const { getCoreUsecaseListTest: getCoreUsecaseListMongoTest } = require('./templates/mongo/core/use-cases/__tests__/list.spec');
34
+ const { getCoreUsecaseGetByIDTest: getCoreUsecaseGetByIDMongoTest } = require('./templates/mongo/core/use-cases/__tests__/getByID.spec');
35
+ const { getCoreUsecaseGetByID: getCoreUsecaseGetByIDMongo } = require('./templates/mongo/core/use-cases/getByID');
36
+ const { getCoreUsecaseList: getCoreUsecaseListMongo } = require('./templates/mongo/core/use-cases/list');
37
+ const { getCoreEntity: getCoreEntityMongo } = require('./templates/mongo/core/entity/entity');
38
+ const { getCoreRepository: getCoreRepositoryMongo } = require('./templates/mongo/core/repository/repository');
39
+ const { getCoreUsecaseCreate: getCoreUsecaseCreateMongo } = require('./templates/mongo/core/use-cases/create');
40
+ const { getCoreUsecaseDelete: getCoreUsecaseDeleteMongo } = require('./templates/mongo/core/use-cases/delete');
41
+ const { getCoreUsecaseUpdate: getCoreUsecaseUpdateMongo } = require('./templates/mongo/core/use-cases/update');
42
+
43
+ const { getModuleAdapter: getModuleAdapterMongo } = require('./templates/mongo/modules/adapter');
44
+ const { getModuleController: getModuleControllerMongo } = require('./templates/mongo/modules/controller');
45
+ const { getModule: getModuleMongo } = require('./templates/mongo/modules/module');
46
+ const { getModuleRepository: getModuleRepositoryMongo } = require('./templates/mongo/modules/repository');
47
+ const { getModuleSchema: getModuleSchemaMongo } = require('./templates/mongo/modules/schema');
48
+ const { getModuleSwagger: getModuleSwaggerMongo } = require('./templates/mongo/modules/swagger');
49
+ const { getModuleType: getModuleTypeMongo } = require('./templates/mongo/modules/types');
50
+
51
+
52
+ const createPostgresCrud = async (name) => {
53
+ if (!name) throw new Error('--name is required')
54
+ name = name.toLowerCase()
55
+
56
+ const dirRoot = `${__dirname}/scafold/postgres/${name}`
57
+
58
+ try {
59
+ if (fs.existsSync(dirRoot)) {
60
+ fs.rmSync(dirRoot, { recursive: true });
61
+ }
62
+
63
+ fs.mkdirSync(dirRoot)
64
+
65
+ fs.mkdirSync(`${dirRoot}/modules`)
66
+
67
+ fs.mkdirSync(`${dirRoot}/core`)
68
+
69
+ const dirCore = `${dirRoot}/core/${name}`;
70
+ fs.mkdirSync(dirCore)
71
+
72
+ const entityPath = `${dirCore}/entity`;
73
+ const repositoryPath = `${dirCore}/repository`;
74
+ const useCasesPath = `${dirCore}/use-cases`;
75
+
76
+ fs.mkdirSync(entityPath)
77
+ fs.mkdirSync(repositoryPath)
78
+ fs.mkdirSync(useCasesPath)
79
+
80
+ fs.writeFileSync(`${entityPath}/${name}.ts`, getCoreEntity(name))
81
+ fs.writeFileSync(`${repositoryPath}/${name}.ts`, getCoreRepository(name))
82
+
83
+
84
+ fs.writeFileSync(`${useCasesPath}/${name}-create.ts`, getCoreUsecaseCreate(name))
85
+ fs.writeFileSync(`${useCasesPath}/${name}-delete.ts`, getCoreUsecaseDelete(name))
86
+ fs.writeFileSync(`${useCasesPath}/${name}-getByID.ts`, getCoreUsecaseGetByID(name))
87
+ fs.writeFileSync(`${useCasesPath}/${name}-list.ts`, getCoreUsecaseList(name))
88
+ fs.writeFileSync(`${useCasesPath}/${name}-update.ts`, getCoreUsecaseUpdate(name))
89
+
90
+ const useCasesPathTest = `${useCasesPath}/__tests__`
91
+ fs.mkdirSync(useCasesPathTest)
92
+
93
+ fs.writeFileSync(`${useCasesPathTest}/${name}-create.spec.ts`, getCoreUsecaseCreateTest(name))
94
+ fs.writeFileSync(`${useCasesPathTest}/${name}-update.spec.ts`, getCoreUsecaseUpdateTest(name))
95
+ fs.writeFileSync(`${useCasesPathTest}/${name}-delete.spec.ts`, getCoreUsecaseDeleteTest(name))
96
+ fs.writeFileSync(`${useCasesPathTest}/${name}-list.spec.ts`, getCoreUsecaseListTest(name))
97
+ fs.writeFileSync(`${useCasesPathTest}/${name}-getByID.spec.ts`, getCoreUsecaseGetByIDTest(name))
98
+
99
+ const modulesPath = `${dirRoot}/modules/${name}`;
100
+ fs.mkdirSync(modulesPath)
101
+
102
+ fs.writeFileSync(`${modulesPath}/adapter.ts`, getModuleAdapter(name))
103
+ fs.writeFileSync(`${modulesPath}/controller.ts`, getModuleController(name))
104
+ fs.writeFileSync(`${modulesPath}/module.ts`, getModule(name))
105
+ fs.writeFileSync(`${modulesPath}/repository.ts`, getModuleRepository(name))
106
+ fs.writeFileSync(`${modulesPath}/schema.ts`, getModuleSchema(name))
107
+ fs.writeFileSync(`${modulesPath}/swagger.ts`, getModuleSwagger(name))
108
+ fs.writeFileSync(`${modulesPath}/types.ts`, getModuleType(name))
109
+
110
+ return `${name}`
111
+ } catch (error) {
112
+ console.log('error', error)
113
+ if (fs.existsSync(dirRoot)) {
114
+ fs.rmSync(dirRoot, { recursive: true });
115
+ }
116
+ return `${name}`
117
+ }
118
+
119
+ }
120
+
121
+ const createMongoCrud = async (name) => {
122
+ if (!name) throw new Error('--name is required')
123
+ name = name.toLowerCase()
124
+
125
+ const dirRoot = `${__dirname}/scafold/mongo/${name}`
126
+
127
+ try {
128
+ if (fs.existsSync(dirRoot)) {
129
+ fs.rmSync(dirRoot, { recursive: true });
130
+ }
131
+
132
+ fs.mkdirSync(dirRoot)
133
+
134
+ fs.mkdirSync(`${dirRoot}/modules`)
135
+
136
+ fs.mkdirSync(`${dirRoot}/core`)
137
+
138
+ const dirCore = `${dirRoot}/core/${name}`;
139
+ fs.mkdirSync(dirCore)
140
+
141
+ const entityPath = `${dirCore}/entity`;
142
+ const repositoryPath = `${dirCore}/repository`;
143
+ const useCasesPath = `${dirCore}/use-cases`;
144
+
145
+ fs.mkdirSync(entityPath)
146
+ fs.mkdirSync(repositoryPath)
147
+ fs.mkdirSync(useCasesPath)
148
+
149
+ fs.writeFileSync(`${entityPath}/${name}.ts`, getCoreEntityMongo(name))
150
+ fs.writeFileSync(`${repositoryPath}/${name}.ts`, getCoreRepositoryMongo(name))
151
+
152
+
153
+ fs.writeFileSync(`${useCasesPath}/${name}-create.ts`, getCoreUsecaseCreateMongo(name))
154
+ fs.writeFileSync(`${useCasesPath}/${name}-delete.ts`, getCoreUsecaseDeleteMongo(name))
155
+ fs.writeFileSync(`${useCasesPath}/${name}-getByID.ts`, getCoreUsecaseGetByIDMongo(name))
156
+ fs.writeFileSync(`${useCasesPath}/${name}-list.ts`, getCoreUsecaseListMongo(name))
157
+ fs.writeFileSync(`${useCasesPath}/${name}-update.ts`, getCoreUsecaseUpdateMongo(name))
158
+
159
+ const useCasesPathTest = `${useCasesPath}/__tests__`
160
+ fs.mkdirSync(useCasesPathTest)
161
+
162
+ fs.writeFileSync(`${useCasesPathTest}/${name}-create.spec.ts`, getCoreUsecaseCreateMongoTest(name))
163
+ fs.writeFileSync(`${useCasesPathTest}/${name}-update.spec.ts`, getCoreUsecaseUpdateMongoTest(name))
164
+ fs.writeFileSync(`${useCasesPathTest}/${name}-delete.spec.ts`, getCoreUsecaseDeleteMongoTest(name))
165
+ fs.writeFileSync(`${useCasesPathTest}/${name}-list.spec.ts`, getCoreUsecaseListMongoTest(name))
166
+ fs.writeFileSync(`${useCasesPathTest}/${name}-getByID.spec.ts`, getCoreUsecaseGetByIDMongoTest(name))
167
+
168
+ const modulesPath = `${dirRoot}/modules/${name}`;
169
+ fs.mkdirSync(modulesPath)
170
+
171
+ fs.writeFileSync(`${modulesPath}/adapter.ts`, getModuleAdapterMongo(name))
172
+ fs.writeFileSync(`${modulesPath}/controller.ts`, getModuleControllerMongo(name))
173
+ fs.writeFileSync(`${modulesPath}/module.ts`, getModuleMongo(name))
174
+ fs.writeFileSync(`${modulesPath}/repository.ts`, getModuleRepositoryMongo(name))
175
+ fs.writeFileSync(`${modulesPath}/schema.ts`, getModuleSchemaMongo(name))
176
+ fs.writeFileSync(`${modulesPath}/swagger.ts`, getModuleSwaggerMongo(name))
177
+ fs.writeFileSync(`${modulesPath}/types.ts`, getModuleTypeMongo(name))
178
+
179
+ return `${name}`
180
+ } catch (error) {
181
+ console.log('error', error)
182
+ if (fs.existsSync(dirRoot)) {
183
+ fs.rmSync(dirRoot, { recursive: true });
184
+ }
185
+ return `${name}`
186
+ }
187
+
188
+ }
189
+
190
+ export const parseArgumentsInoOptions = async (input) => {
191
+ return {
192
+ mongoCrud: input.type === 'mongo:crud' ? await createMongoCrud(input.name) : false,
193
+ postgresCrud: input.type === 'postgres:crud' ? await createPostgresCrud(input.name) : false
194
+ }
195
+ }
196
+
197
+ export async function cli(args) {
198
+
199
+ console.log(bold(green('Selecting template...')))
200
+ const cli = await cliSelect({
201
+ values: [bold('POTGRES:CRUD'), bold('MONGO:CRUD')],
202
+ valueRenderer: (value, selected) => {
203
+ if (selected) {
204
+ return value;
205
+ }
206
+
207
+ return value;
208
+ },
209
+ })
210
+
211
+ const mapSelectType = { 0: 'postgres:crud', 1: 'mongo:crud' }[cli.id]
212
+ const userInput = { name: undefined, type: undefined }
213
+
214
+ userInput.type = mapSelectType
215
+
216
+ if (!userInput.type) {
217
+ console.log(red('Type is required'))
218
+ return
219
+ }
220
+
221
+ const name = prompt(bold(`Type your ${userInput.type.toUpperCase()} name: `));
222
+
223
+ if (!name) {
224
+ console.log(red('Name is required'))
225
+ return
226
+ }
227
+
228
+ userInput.name = name
229
+
230
+ const options = await parseArgumentsInoOptions(userInput)
231
+
232
+ const paths = []
233
+
234
+ for (const key in options) {
235
+ if (options[key]) {
236
+ paths.push(path.resolve(`${__dirname}/../src/scafold/${userInput.type === 'postgres:crud' ? 'postgres' : 'mongo'}/`, options[key]))
237
+ }
238
+ }
239
+
240
+ try {
241
+
242
+ exec('zenity --file-selection --directory --title="Choose your path" --filename=$HOME/', async (err, dest) => {
243
+ const src = paths[0]
244
+
245
+ if (err) {
246
+ if (fs.existsSync(src)) {
247
+ fs.rmSync(src, { recursive: true });
248
+ }
249
+ console.error(err.message)
250
+ return
251
+ }
252
+
253
+ // VALIDATE
254
+ fs.readdir(dest.replace('\n', '') + '/src', function (err, folders) {
255
+ if (err) {
256
+ if (fs.existsSync(src)) {
257
+ fs.rmSync(src, { recursive: true });
258
+ }
259
+ console.error(err.message)
260
+ return
261
+ }
262
+
263
+ for (const folder of ['core', 'modules']) {
264
+ const source = folders.find(f => f === folder)
265
+ if (!source) {
266
+ console.log(bold(red('error')))
267
+ console.error('select nestjs microservice api root')
268
+ return
269
+ }
270
+ }
271
+ });
272
+
273
+
274
+
275
+ // CREATE CRUD
276
+ fs.readdir(src, function (err, folders) {
277
+ if (err) {
278
+ if (fs.existsSync(src)) {
279
+ fs.rmSync(src, { recursive: true });
280
+ }
281
+ console.error(err.message)
282
+ return
283
+ }
284
+
285
+
286
+ for (const folder of folders) {
287
+ const source = `${src}/${folder}`;
288
+ const destination = `${dest}/src/${folder}`.replace('\n', '');
289
+
290
+ fse.copySync(source, destination, { overwrite: true });
291
+
292
+ if (fs.existsSync(source)) {
293
+ fs.rmSync(source, { recursive: true });
294
+ }
295
+ }
296
+ });
297
+
298
+
299
+ // fs.rmSync(src, { recursive: true });
300
+
301
+ // console.log(bold(green('done')))
302
+
303
+ // if (userInput.type === 'api') {
304
+ // console.log(red('!!!!!!!!!!REAMDE!!!!!!!'), bold('https://github.com/mikemajesty/microservice-crud/blob/master/APP.md'))
305
+ // }
306
+ });
307
+
308
+ } catch (error) {
309
+ console.log(error)
310
+ if (fs.existsSync(paths[0])) {
311
+ fs.rmSync(paths[0], { recursive: true });
312
+ }
313
+ }
314
+ }
File without changes
File without changes
@@ -0,0 +1,49 @@
1
+
2
+ function capitalizeFirstLetter(string) {
3
+ return string.charAt(0).toUpperCase() + string.slice(1);
4
+ }
5
+
6
+ const getCoreEntity = (name) => `import { z } from 'zod';
7
+
8
+ import { IEntity, withID } from '@/utils/entity';
9
+
10
+ const ID = z.string().uuid();
11
+ const Name = z.string().min(1).max(200).trim();
12
+ const CreatedAt = z.date().nullish();
13
+ const UpdatedAt = z.date().nullish();
14
+ const DeletedAt = z.date().default(null).nullish();
15
+
16
+ export const ${capitalizeFirstLetter(name)}EntitySchema = z.object({
17
+ id: ID,
18
+ name: Name,
19
+ createdAt: CreatedAt,
20
+ updatedAt: UpdatedAt,
21
+ deletedAt: DeletedAt
22
+ });
23
+
24
+ type ${capitalizeFirstLetter(name)} = z.infer<typeof ${capitalizeFirstLetter(name)}EntitySchema>;
25
+
26
+ export class ${capitalizeFirstLetter(name)}Entity implements IEntity {
27
+ id: string;
28
+
29
+ name: string;
30
+
31
+ deletedAt?: Date;
32
+
33
+ createdAt: Date;
34
+
35
+ updatedAt: Date;
36
+
37
+ constructor(entity: ${capitalizeFirstLetter(name)}) {
38
+ Object.assign(this, ${capitalizeFirstLetter(name)}EntitySchema.parse(withID(entity)));
39
+ }
40
+
41
+ setDelete() {
42
+ this.deletedAt = new Date();
43
+ }
44
+ }
45
+ `
46
+
47
+ module.exports = {
48
+ getCoreEntity
49
+ }
@@ -0,0 +1,18 @@
1
+
2
+ function capitalizeFirstLetter(string) {
3
+ return string.charAt(0).toUpperCase() + string.slice(1);
4
+ }
5
+
6
+ const getCoreRepository = (name) => `import { IRepository } from '@/infra/repository';
7
+ import { ${capitalizeFirstLetter(name)}ListInput, ${capitalizeFirstLetter(name)}ListOutput } from '@/modules/${name}/types';
8
+
9
+ import { ${capitalizeFirstLetter(name)}Entity } from '../entity/${name}';
10
+
11
+ export abstract class I${capitalizeFirstLetter(name)}Repository extends IRepository<${capitalizeFirstLetter(name)}Entity> {
12
+ abstract paginate(input: ${capitalizeFirstLetter(name)}ListInput): Promise<${capitalizeFirstLetter(name)}ListOutput>;
13
+ }
14
+ `
15
+
16
+ module.exports = {
17
+ getCoreRepository
18
+ }
@@ -0,0 +1,63 @@
1
+
2
+ function capitalizeFirstLetter(string) {
3
+ return string.charAt(0).toUpperCase() + string.slice(1);
4
+ }
5
+
6
+ const getCoreUsecaseCreateTest = (name) => `import { Test } from '@nestjs/testing';
7
+
8
+ import { I${capitalizeFirstLetter(name)}CreateAdapter } from '@/modules/${name}/adapter';
9
+ import { ${capitalizeFirstLetter(name)}CreateInput } from '@/modules/${name}/types';
10
+ import { expectZodError } from '@/utils/tests';
11
+
12
+ import { I${capitalizeFirstLetter(name)}Repository } from '../../repository/${name}';
13
+ import { ${capitalizeFirstLetter(name)}CreateUsecase } from '../${name}-create';
14
+
15
+ const ${name} = {
16
+ name: 'dummy'
17
+ } as ${capitalizeFirstLetter(name)}CreateInput;
18
+
19
+ describe('${capitalizeFirstLetter(name)}CreateUsecase', () => {
20
+ let usecase: I${capitalizeFirstLetter(name)}CreateAdapter;
21
+ let repository: I${capitalizeFirstLetter(name)}Repository;
22
+
23
+ beforeEach(async () => {
24
+ const app = await Test.createTestingModule({
25
+ providers: [
26
+ {
27
+ provide: I${capitalizeFirstLetter(name)}Repository,
28
+ useValue: {}
29
+ },
30
+ {
31
+ provide: I${capitalizeFirstLetter(name)}CreateAdapter,
32
+ useFactory: (${name}Repository: I${capitalizeFirstLetter(name)}Repository) => {
33
+ return new ${capitalizeFirstLetter(name)}CreateUsecase(${name}Repository);
34
+ },
35
+ inject: [I${capitalizeFirstLetter(name)}Repository]
36
+ }
37
+ ]
38
+ }).compile();
39
+
40
+ usecase = app.get(I${capitalizeFirstLetter(name)}CreateAdapter);
41
+ repository = app.get(I${capitalizeFirstLetter(name)}Repository);
42
+ });
43
+
44
+ test('should create successfully', async () => {
45
+ repository.findOne = jest.fn().mockResolvedValue(null);
46
+ repository.create = jest.fn().mockResolvedValue(${name});
47
+ await expect(usecase.execute(${name})).resolves.toEqual(${name});
48
+ });
49
+
50
+ test('should throw error when invalid parameters', async () => {
51
+ await expectZodError(
52
+ () => usecase.execute({}),
53
+ (issues) => {
54
+ expect(issues).toEqual([{ message: 'Required', path: 'name' }]);
55
+ }
56
+ );
57
+ });
58
+ });
59
+ `
60
+
61
+ module.exports = {
62
+ getCoreUsecaseCreateTest
63
+ }
@@ -0,0 +1,74 @@
1
+
2
+ function capitalizeFirstLetter(string) {
3
+ return string.charAt(0).toUpperCase() + string.slice(1);
4
+ }
5
+
6
+ const getCoreUsecaseDeleteTest = (name) => `import { Test } from '@nestjs/testing';
7
+
8
+ import { I${capitalizeFirstLetter(name)}DeleteAdapter } from '@/modules/${name}/adapter';
9
+ import { ApiNotFoundException } from '@/utils/exception';
10
+ import { expectZodError, generateUUID } from '@/utils/tests';
11
+
12
+ import { ${capitalizeFirstLetter(name)}Entity } from '../../entity/${name}';
13
+ import { I${capitalizeFirstLetter(name)}Repository } from '../../repository/${name}';
14
+ import { ${capitalizeFirstLetter(name)}DeleteUsecase } from '../${name}-delete';
15
+
16
+ const ${name}Response = {
17
+ id: generateUUID(),
18
+ name: 'dummy'
19
+ } as ${capitalizeFirstLetter(name)}Entity;
20
+
21
+ describe('${capitalizeFirstLetter(name)}DeleteUsecase', () => {
22
+ let usecase: I${capitalizeFirstLetter(name)}DeleteAdapter;
23
+ let repository: I${capitalizeFirstLetter(name)}Repository;
24
+
25
+ beforeEach(async () => {
26
+ const app = await Test.createTestingModule({
27
+ imports: [],
28
+ providers: [
29
+ {
30
+ provide: I${capitalizeFirstLetter(name)}Repository,
31
+ useValue: {}
32
+ },
33
+ {
34
+ provide: I${capitalizeFirstLetter(name)}DeleteAdapter,
35
+ useFactory: (${name}Repository: I${capitalizeFirstLetter(name)}Repository) => {
36
+ return new ${capitalizeFirstLetter(name)}DeleteUsecase(${name}Repository);
37
+ },
38
+ inject: [I${capitalizeFirstLetter(name)}Repository]
39
+ }
40
+ ]
41
+ }).compile();
42
+
43
+ usecase = app.get(I${capitalizeFirstLetter(name)}DeleteAdapter);
44
+ repository = app.get(I${capitalizeFirstLetter(name)}Repository);
45
+ });
46
+
47
+ test('should throw error when invalid parameters', async () => {
48
+ await expectZodError(
49
+ () => usecase.execute({ id: 'uuid' }),
50
+ (issues) => {
51
+ expect(issues).toEqual([{ message: 'Invalid uuid', path: 'id' }]);
52
+ }
53
+ );
54
+ });
55
+
56
+ test('should throw error when ${name} not found', async () => {
57
+ repository.findById = jest.fn().mockResolvedValue(null);
58
+ await expect(usecase.execute({ id: generateUUID() })).rejects.toThrowError(ApiNotFoundException);
59
+ });
60
+
61
+ test('should delete successfully', async () => {
62
+ repository.findById = jest.fn().mockResolvedValue(${name}Response);
63
+ repository.updateOne = jest.fn();
64
+ await expect(usecase.execute({ id: generateUUID() })).resolves.toEqual({
65
+ ...${name}Response,
66
+ deletedAt: expect.any(Date)
67
+ });
68
+ });
69
+ });
70
+ `
71
+
72
+ module.exports = {
73
+ getCoreUsecaseDeleteTest
74
+ }