@lenne.tech/cli 0.0.68 → 0.0.73
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.
- package/build/commands/angular/create.js +65 -82
- package/build/commands/server/module.js +8 -1
- package/build/templates/model.ts.ejs +3 -0
- package/build/templates/nest-server-module/inputs/template-create.input.ts.ejs +21 -0
- package/build/templates/nest-server-module/inputs/template.input.ts.ejs +22 -0
- package/build/templates/nest-server-module/template.model.ts.ejs +63 -0
- package/build/templates/nest-server-module/template.module.ts.ejs +27 -0
- package/build/templates/nest-server-module/template.resolver.ts.ejs +136 -0
- package/build/templates/nest-server-module/template.service.ts.ejs +74 -0
- package/build/templates/nest-server-starter/README.md.ejs +61 -0
- package/build/templates/nest-server-tests/tests.e2e-spec.ts.ejs +165 -0
- package/build/templates/typescript-starter/README.md.ejs +30 -0
- package/package.json +10 -10
|
@@ -19,7 +19,7 @@ const NewCommand = {
|
|
|
19
19
|
hidden: false,
|
|
20
20
|
run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
|
|
21
21
|
// Retrieve the tools we need
|
|
22
|
-
const { filesystem, git, helper, parameters,
|
|
22
|
+
const { filesystem, git, helper, parameters, print: { error, info, spin, success }, prompt: { confirm }, strings: { kebabCase }, system, } = toolbox;
|
|
23
23
|
// Start timer
|
|
24
24
|
const timer = system.startTimer();
|
|
25
25
|
// Info
|
|
@@ -28,12 +28,6 @@ const NewCommand = {
|
|
|
28
28
|
if (!(yield git.gitInstalled())) {
|
|
29
29
|
return;
|
|
30
30
|
}
|
|
31
|
-
// Check ng
|
|
32
|
-
if (!system.which('nx') && (yield confirm(`Install nx global?`))) {
|
|
33
|
-
const nxSpinner = spin('Install nx global');
|
|
34
|
-
yield system.run(`npm i -g @nrwl/cli`);
|
|
35
|
-
nxSpinner.succeed('nx global installed');
|
|
36
|
-
}
|
|
37
31
|
// Get name of the workspace
|
|
38
32
|
const name = yield helper.getInput(parameters.first, {
|
|
39
33
|
name: 'workspace name',
|
|
@@ -50,88 +44,81 @@ const NewCommand = {
|
|
|
50
44
|
error(`There's already a folder named "${projectDir}" here.`);
|
|
51
45
|
return undefined;
|
|
52
46
|
}
|
|
53
|
-
// Get name of the app
|
|
54
|
-
let appName = yield helper.getInput(parameters.second, {
|
|
55
|
-
name: 'app name',
|
|
56
|
-
showError: true,
|
|
57
|
-
});
|
|
58
|
-
if (!appName) {
|
|
59
|
-
appName = 'app';
|
|
60
|
-
}
|
|
61
47
|
// Set preset
|
|
62
48
|
// See https://github.com/nrwl/nx/blob/4bcd25ec01d793ca59e0ebaf1578bae275b6821d/packages/create-nx-workspace/bin/create-nx-workspace.ts#L32
|
|
63
|
-
const preset = parameters.
|
|
49
|
+
const preset = parameters.second === 'true' || (!parameters.second && (yield confirm(`Add API (Nest server)?`)))
|
|
64
50
|
? 'angular-nest'
|
|
65
51
|
: 'angular';
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
52
|
+
let addToGit = yield confirm(`Add workspace to a new git repository?`);
|
|
53
|
+
let gitLink;
|
|
54
|
+
// Check if git init is active
|
|
55
|
+
if (addToGit) {
|
|
56
|
+
// Get name of the app
|
|
57
|
+
gitLink = yield helper.getInput(null, {
|
|
58
|
+
name: 'git repository link',
|
|
59
|
+
showError: true,
|
|
60
|
+
});
|
|
61
|
+
if (!gitLink) {
|
|
62
|
+
addToGit = false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const workspaceSpinner = spin(`Create ${preset} workspace ${projectDir} with ${name} app`);
|
|
66
|
+
// Clone monorepo
|
|
67
|
+
yield system.run(`git clone https://github.com/lenneTech/lt-monorepo.git ${projectDir}`);
|
|
68
|
+
// Check for directory
|
|
70
69
|
if (!filesystem.isDirectory(`./${projectDir}`)) {
|
|
71
70
|
error(`The directory "${projectDir}" could not be created.`);
|
|
72
71
|
return undefined;
|
|
73
72
|
}
|
|
74
|
-
workspaceSpinner.succeed(`Create ${preset} workspace ${projectDir} for ${
|
|
73
|
+
workspaceSpinner.succeed(`Create ${preset} workspace ${projectDir} for ${name} created`);
|
|
75
74
|
// Include example app
|
|
76
75
|
const ngBaseSpinner = spin('Integrate example for Angular');
|
|
77
|
-
//
|
|
78
|
-
yield system.run(`cd ${projectDir} &&
|
|
79
|
-
//
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
76
|
+
// Remove git folder after clone
|
|
77
|
+
yield system.run(`cd ${projectDir} && rm -rf .git`);
|
|
78
|
+
// Check if git init is active
|
|
79
|
+
if (addToGit) {
|
|
80
|
+
yield system.run(`cd ${projectDir} && git init --initial-branch=main`);
|
|
81
|
+
yield system.run(`cd ${projectDir} && git remote add origin ${gitLink}`);
|
|
82
|
+
yield system.run(`cd ${projectDir} && git add .`);
|
|
83
|
+
yield system.run(`cd ${projectDir} && git commit -m "Initial commit"`);
|
|
84
|
+
yield system.run(`cd ${projectDir} && git push -u origin main`);
|
|
85
|
+
}
|
|
86
|
+
// Clone ng-base-starter
|
|
87
|
+
yield system.run(`cd ${projectDir}/projects && git clone https://github.com/lenneTech/ng-base-starter.git app`);
|
|
88
|
+
// Remove gitkeep file
|
|
89
|
+
yield system.run(`cd ${projectDir}/projects && rm .gitkeep`);
|
|
90
|
+
// Remove git folder after clone
|
|
91
|
+
yield system.run(`cd ${projectDir}/projects/app && rm -rf .git`);
|
|
87
92
|
// Integrate files
|
|
88
|
-
if (filesystem.isDirectory(`./${projectDir}/
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
filesystem.remove(`./${projectDir}/temp`);
|
|
95
|
-
// Commit changes
|
|
96
|
-
yield system.run(`cd ${projectDir} && git add . && git commit -am "Angular example integrated"`);
|
|
93
|
+
if (filesystem.isDirectory(`./${projectDir}/projects/app`)) {
|
|
94
|
+
// Check if git init is active
|
|
95
|
+
if (addToGit) {
|
|
96
|
+
// Commit changes
|
|
97
|
+
yield system.run(`cd ${projectDir} && git add . && git commit -am "feat: Angular example integrated" && git push`);
|
|
98
|
+
}
|
|
97
99
|
// Angular example integration done
|
|
98
100
|
ngBaseSpinner.succeed('Example for Angular integrated');
|
|
99
101
|
// Include files from https://github.com/lenneTech/nest-server-starter
|
|
100
102
|
if (preset === 'angular-nest') {
|
|
101
103
|
// Init
|
|
102
104
|
const serverSpinner = spin(`Integrate Nest Server Starter`);
|
|
103
|
-
|
|
104
|
-
yield system.run(`cd ${projectDir} && git clone https://github.com/lenneTech/nest-server-starter
|
|
105
|
+
// Clone api
|
|
106
|
+
yield system.run(`cd ${projectDir}/projects && git clone https://github.com/lenneTech/nest-server-starter api`);
|
|
105
107
|
// Integrate files
|
|
106
|
-
if (filesystem.isDirectory(`./${projectDir}/
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
108
|
+
if (filesystem.isDirectory(`./${projectDir}/projects/api`)) {
|
|
109
|
+
// Remove git folder from clone
|
|
110
|
+
yield system.run(`cd ${projectDir}/projects/api && rm -rf .git`);
|
|
111
|
+
// Prepare meta.json in api
|
|
112
|
+
filesystem.write(`./${projectDir}/projects/api/src/meta.json`, {
|
|
113
|
+
name: `${name}-api-server`,
|
|
114
|
+
description: `API for ${name} app`,
|
|
112
115
|
version: '0.0.0',
|
|
113
116
|
});
|
|
114
|
-
//
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
}
|
|
119
|
-
// Extend ts config
|
|
120
|
-
yield patching.update(`./${projectDir}/apps/api/tsconfig.app.json`, (config) => {
|
|
121
|
-
config.compilerOptions.resolveJsonModule = true;
|
|
122
|
-
return config;
|
|
123
|
-
});
|
|
124
|
-
// Remove temp files
|
|
125
|
-
filesystem.remove(`./${projectDir}/temp`);
|
|
126
|
-
// Add scripts
|
|
127
|
-
yield patching.update(`./${projectDir}/package.json`, (config) => {
|
|
128
|
-
config.scripts['start:app'] = 'npm start';
|
|
129
|
-
config.scripts['start:server'] = 'nx serve api';
|
|
130
|
-
config.scripts['e2e'] = `nx e2e ${appName}-e2e`;
|
|
131
|
-
return config;
|
|
132
|
-
});
|
|
133
|
-
// Commit changes
|
|
134
|
-
yield system.run(`cd ${projectDir} && git add . && git commit -am "Nest Server Starter integrated"`);
|
|
117
|
+
// Check if git init is active
|
|
118
|
+
if (addToGit) {
|
|
119
|
+
// Commit changes
|
|
120
|
+
yield system.run(`cd ${projectDir} && git add . && git commit -am "feat: Nest Server Starter integrated" && git push`);
|
|
121
|
+
}
|
|
135
122
|
// Done
|
|
136
123
|
serverSpinner.succeed('Nest Server Starter integrated');
|
|
137
124
|
}
|
|
@@ -139,27 +126,23 @@ const NewCommand = {
|
|
|
139
126
|
serverSpinner.warn('Nest Server Starter not integrated');
|
|
140
127
|
}
|
|
141
128
|
}
|
|
129
|
+
// Install all packages
|
|
130
|
+
const installSpinner = spin('Install all packages');
|
|
131
|
+
yield system.run(`cd ${projectDir} && npm i && npm run init`);
|
|
132
|
+
installSpinner.succeed('Successfull installed all packages');
|
|
142
133
|
// We're done, so show what to do next
|
|
143
134
|
info(``);
|
|
144
|
-
success(`Generated ${preset} workspace ${projectDir} with ${
|
|
135
|
+
success(`Generated ${preset} workspace ${projectDir} with ${name} app in ${helper.msToMinutesAndSeconds(timer())}m.`);
|
|
145
136
|
info(``);
|
|
146
137
|
info(`Next:`);
|
|
147
|
-
info(` Run ${
|
|
138
|
+
info(` Run ${name}`);
|
|
148
139
|
info(` $ cd ${projectDir}`);
|
|
149
|
-
|
|
150
|
-
info(` $ npm run start:server`);
|
|
151
|
-
info(` $ npm run start:app`);
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
info(` $ npm start`);
|
|
155
|
-
}
|
|
156
|
-
info(``);
|
|
157
|
-
info(`More infos about Nx and Angular: https://nx.dev/angular`);
|
|
140
|
+
info(` $ npm run start`);
|
|
158
141
|
info(``);
|
|
159
142
|
// For tests
|
|
160
|
-
return `new workspace ${projectDir} with ${
|
|
143
|
+
return `new workspace ${projectDir} with ${name}`;
|
|
161
144
|
}
|
|
162
145
|
}),
|
|
163
146
|
};
|
|
164
147
|
exports.default = NewCommand;
|
|
165
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2FuZ3VsYXIvY3JlYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBR0E7O0dBRUc7QUFDSCxNQUFNLFVBQVUsR0FBbUI7SUFDakMsSUFBSSxFQUFFLFFBQVE7SUFDZCxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDWixXQUFXLEVBQUUsNkNBQTZDO0lBQzFELE1BQU0sRUFBRSxLQUFLO0lBQ2IsR0FBRyxFQUFFLENBQU8sT0FBK0IsRUFBRSxFQUFFO1FBQzdDLDZCQUE2QjtRQUM3QixNQUFNLEVBQ0osVUFBVSxFQUNWLEdBQUcsRUFDSCxNQUFNLEVBQ04sVUFBVSxFQUNWLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUNyQyxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFDbkIsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQ3RCLE1BQU0sR0FDUCxHQUFHLE9BQU8sQ0FBQztRQUVaLGNBQWM7UUFDZCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEMsT0FBTztRQUNQLElBQUksQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBRW5ELFlBQVk7UUFDWixJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFO1lBQy9CLE9BQU87U0FDUjtRQUVELDRCQUE0QjtRQUM1QixNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRTtZQUNuRCxJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLFNBQVMsRUFBRSxJQUFJO1NBQ2hCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPO1NBQ1I7UUFFRCx3QkFBd0I7UUFDeEIsTUFBTSxVQUFV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
|
|
@@ -95,14 +95,21 @@ const NewCommand = {
|
|
|
95
95
|
const serverModule = (0, path_1.join)(path, 'src', 'server', 'server.module.ts');
|
|
96
96
|
if (filesystem.exists(serverModule)) {
|
|
97
97
|
const includeSpinner = spin('Include module into server');
|
|
98
|
+
// Import module
|
|
98
99
|
yield patching.patch(serverModule, {
|
|
99
100
|
insert: `import { ${namePascal}Module } from './modules/${nameKebab}/${nameKebab}.module';\n`,
|
|
100
101
|
before: 'import',
|
|
101
102
|
});
|
|
103
|
+
// Add Module
|
|
102
104
|
yield patching.patch(serverModule, {
|
|
103
105
|
insert: ` ${namePascal}Module,\n `,
|
|
104
106
|
after: new RegExp('imports:[^\\]]*', 'm'),
|
|
105
107
|
});
|
|
108
|
+
// Add comma if necessary
|
|
109
|
+
yield patching.patch(serverModule, {
|
|
110
|
+
insert: '$1,$2',
|
|
111
|
+
replace: new RegExp('([^,\\s])(\\s*' + namePascal + 'Module,\\s*\\])'),
|
|
112
|
+
});
|
|
106
113
|
if (filesystem.exists(prettier)) {
|
|
107
114
|
yield system.run(prettier + ' ' + serverModule);
|
|
108
115
|
}
|
|
@@ -123,4 +130,4 @@ const NewCommand = {
|
|
|
123
130
|
}),
|
|
124
131
|
};
|
|
125
132
|
exports.default = NewCommand;
|
|
126
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3NlcnZlci9tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFDQSwrQkFBNEI7QUFHNUI7O0dBRUc7QUFDSCxNQUFNLFVBQVUsR0FBbUI7SUFDakMsSUFBSSxFQUFFLFFBQVE7SUFDZCxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDWixXQUFXLEVBQUUsNkJBQTZCO0lBQzFDLE1BQU0sRUFBRSxLQUFLO0lBQ2IsR0FBRyxFQUFFLENBQU8sT0FBK0IsRUFBRSxFQUFFO1FBQzdDLDZCQUE2QjtRQUM3QixNQUFNLEVBQ0osVUFBVSxFQUNWLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxFQUNSLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUNyQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxFQUM3QyxNQUFNLEVBQ04sUUFBUSxHQUNULEdBQUcsT0FBTyxDQUFDO1FBRVosY0FBYztRQUNkLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQyxPQUFPO1FBQ1AsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFFbkMsV0FBVztRQUNYLE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFO1lBQ25ELElBQUksRUFBRSxhQUFhO1NBQ3BCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPO1NBQ1I7UUFFRCxnREFBZ0Q7UUFDaEQsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FB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
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Field, InputType } from '@nestjs/graphql';
|
|
2
|
+
import { IsOptional } from 'class-validator';
|
|
3
|
+
import { <%= props.namePascal %>Input } from './<%= props.nameKebab %>.input';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* <%= props.namePascal %> create input
|
|
7
|
+
*/
|
|
8
|
+
@InputType({ description: 'Input data to create a new <%= props.namePascal %>' })
|
|
9
|
+
export class <%= props.namePascal %>CreateInput extends <%= props.namePascal %>Input {
|
|
10
|
+
|
|
11
|
+
// ===================================================================================================================
|
|
12
|
+
// Properties
|
|
13
|
+
// ===================================================================================================================
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Description of the property
|
|
17
|
+
*/
|
|
18
|
+
@Field(() => [String], { description: 'Description of the property', nullable: true })
|
|
19
|
+
@IsOptional()
|
|
20
|
+
property?: string[];
|
|
21
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Restricted, RoleEnum } from '@lenne.tech/nest-server';
|
|
2
|
+
import { Field, InputType } from '@nestjs/graphql';
|
|
3
|
+
import { IsOptional } from 'class-validator';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* <%= props.namePascal %> input
|
|
7
|
+
*/
|
|
8
|
+
@InputType({ description: 'Input data to update an existing <%= props.namePascal %>' })
|
|
9
|
+
export class <%= props.namePascal %>Input {
|
|
10
|
+
|
|
11
|
+
// ===================================================================================================================
|
|
12
|
+
// Properties
|
|
13
|
+
// ===================================================================================================================
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Description of the property
|
|
17
|
+
*/
|
|
18
|
+
@Restricted(RoleEnum.ADMIN, RoleEnum.S_CREATOR)
|
|
19
|
+
@Field(() => [String], { description: 'Description of the property', nullable: true })
|
|
20
|
+
@IsOptional()
|
|
21
|
+
property?: string[];
|
|
22
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { mapClasses, Restricted, RoleEnum } from '@lenne.tech/nest-server';
|
|
2
|
+
import { Field, ObjectType } from '@nestjs/graphql';
|
|
3
|
+
import { Prop, Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
|
|
4
|
+
import { Document, Schema } from 'mongoose';
|
|
5
|
+
import { PersistenceModel } from '../../common/models/persistence.model';
|
|
6
|
+
import { User } from '../user/user.model';
|
|
7
|
+
|
|
8
|
+
export type <%= props.namePascal %>Document = <%= props.namePascal %> & Document;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* <%= props.namePascal %> model
|
|
12
|
+
*/
|
|
13
|
+
@ObjectType({ description: '<%= props.namePascal %>' })
|
|
14
|
+
@MongooseSchema({ timestamps: true })
|
|
15
|
+
export class <%= props.namePascal %> extends PersistenceModel {
|
|
16
|
+
|
|
17
|
+
// ===================================================================================================================
|
|
18
|
+
// Properties
|
|
19
|
+
// ===================================================================================================================
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Description of the property
|
|
23
|
+
*/
|
|
24
|
+
@Restricted(RoleEnum.ADMIN, RoleEnum.S_CREATOR)
|
|
25
|
+
@Field(() => [String], { description: 'Properties of <%= props.namePascal %>', nullable: 'items'})
|
|
26
|
+
@Prop([String])
|
|
27
|
+
properties: string[] = undefined;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* User how has tested the <%= props.namePascal %>
|
|
31
|
+
*/
|
|
32
|
+
@Field(() => User, {
|
|
33
|
+
description: 'User who has tested the <%= props.namePascal %>',
|
|
34
|
+
nullable: true,
|
|
35
|
+
})
|
|
36
|
+
@Prop({ type: Schema.Types.ObjectId, ref: 'User' })
|
|
37
|
+
testedBy: User = undefined;
|
|
38
|
+
|
|
39
|
+
// ===================================================================================================================
|
|
40
|
+
// Methods
|
|
41
|
+
// ===================================================================================================================
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Initialize instance with default values instead of undefined
|
|
45
|
+
*/
|
|
46
|
+
init() {
|
|
47
|
+
super.init();
|
|
48
|
+
this.properties = [];
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Map input
|
|
54
|
+
*
|
|
55
|
+
* Hint: Non-primitive variables should always be mapped (see mapClasses / mapClassesAsync in ModelHelper)
|
|
56
|
+
*/
|
|
57
|
+
map(input) {
|
|
58
|
+
super.map(input);
|
|
59
|
+
return mapClasses(input, {user: User}, this);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export const <%= props.namePascal %>Schema = SchemaFactory.createForClass(<%= props.namePascal %>);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { JSON } from '@lenne.tech/nest-server';
|
|
2
|
+
import { Module } from '@nestjs/common';
|
|
3
|
+
import { MongooseModule } from '@nestjs/mongoose';
|
|
4
|
+
import { PubSub } from 'graphql-subscriptions';
|
|
5
|
+
import { UserModule } from '../user/user.module';
|
|
6
|
+
import { <%= props.namePascal %>, <%= props.namePascal %>Schema } from './<%= props.nameKebab %>.model';
|
|
7
|
+
import { <%= props.namePascal %>Resolver } from './<%= props.nameKebab %>.resolver';
|
|
8
|
+
import { <%= props.namePascal %>Service } from './<%= props.nameKebab %>.service';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* <%= props.namePascal %> module
|
|
12
|
+
*/
|
|
13
|
+
@Module({
|
|
14
|
+
imports: [MongooseModule.forFeature([{ name: <%= props.namePascal %>.name, schema: <%= props.namePascal %>Schema }]), UserModule],
|
|
15
|
+
controllers: [],
|
|
16
|
+
providers: [
|
|
17
|
+
<%= props.namePascal %>Resolver,
|
|
18
|
+
<%= props.namePascal %>Service,
|
|
19
|
+
JSON,
|
|
20
|
+
{
|
|
21
|
+
provide: 'PUB_SUB',
|
|
22
|
+
useValue: new PubSub(),
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
exports: [MongooseModule, <%= props.namePascal %>Resolver, <%= props.namePascal %>Service]
|
|
26
|
+
})
|
|
27
|
+
export class <%= props.namePascal %>Module {}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { FilterArgs, GraphQLUser, RoleEnum, Roles } from '@lenne.tech/nest-server';
|
|
2
|
+
import { Inject } from '@nestjs/common';
|
|
3
|
+
import { Args, Info, Mutation, Query, Resolver, Subscription } from '@nestjs/graphql';
|
|
4
|
+
import { GraphQLResolveInfo } from 'graphql';
|
|
5
|
+
import { PubSub } from 'graphql-subscriptions';
|
|
6
|
+
import { User } from '../user/user.model';
|
|
7
|
+
import { <%= props.namePascal %>CreateInput } from './inputs/<%= props.nameKebab %>-create.input';
|
|
8
|
+
import { <%= props.namePascal %>Input } from './inputs/<%= props.nameKebab %>.input';
|
|
9
|
+
import { <%= props.namePascal %> } from './<%= props.nameKebab %>.model';
|
|
10
|
+
import { <%= props.namePascal %>Service } from './<%= props.nameKebab %>.service';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Resolver to process with <%= props.namePascal %> data
|
|
14
|
+
*/
|
|
15
|
+
@Resolver(() => <%= props.namePascal %>)
|
|
16
|
+
export class <%= props.namePascal %>Resolver {
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Import services
|
|
20
|
+
*/
|
|
21
|
+
constructor(
|
|
22
|
+
private readonly <%= props.nameCamel %>Service: <%= props.namePascal %>Service,
|
|
23
|
+
@Inject('PUB_SUB') protected readonly pubSub: PubSub
|
|
24
|
+
) {}
|
|
25
|
+
|
|
26
|
+
// ===========================================================================
|
|
27
|
+
// Queries
|
|
28
|
+
// ===========================================================================
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Get <%= props.namePascal %>s (via filter)
|
|
32
|
+
*/
|
|
33
|
+
@Roles(RoleEnum.S_USER)
|
|
34
|
+
@Query(() => [<%= props.namePascal %>], { description: 'Find <%= props.namePascal %> (via filter)' })
|
|
35
|
+
async find<%= props.namePascal %>s(
|
|
36
|
+
@Info() info: GraphQLResolveInfo,
|
|
37
|
+
@GraphQLUser() user: User,
|
|
38
|
+
@Args() args?: FilterArgs
|
|
39
|
+
) {
|
|
40
|
+
return await this.<%= props.nameCamel %>Service.find(args, {
|
|
41
|
+
currentUser: user,
|
|
42
|
+
fieldSelection: { info, select: 'find<%= props.namePascal %>s' },
|
|
43
|
+
inputType: FilterArgs
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Get <%= props.namePascal %> via ID
|
|
49
|
+
*/
|
|
50
|
+
@Roles(RoleEnum.S_USER)
|
|
51
|
+
@Query(() => <%= props.namePascal %>, { description: 'Get <%= props.namePascal %> with specified ID' })
|
|
52
|
+
async get<%= props.namePascal %>(
|
|
53
|
+
@Info() info: GraphQLResolveInfo,
|
|
54
|
+
@GraphQLUser() user: User,
|
|
55
|
+
@Args('id') id: string,
|
|
56
|
+
): Promise<<%= props.namePascal %>> {
|
|
57
|
+
return await this.<%= props.nameCamel %>Service.get(id, {
|
|
58
|
+
currentUser: user,
|
|
59
|
+
fieldSelection: { info, select: 'get<%= props.namePascal %>' },
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ===========================================================================
|
|
64
|
+
// Mutations
|
|
65
|
+
// ===========================================================================
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Create new <%= props.namePascal %>
|
|
69
|
+
*/
|
|
70
|
+
@Roles(RoleEnum.S_USER)
|
|
71
|
+
@Mutation(() => <%= props.namePascal %>, { description: 'Create a new <%= props.namePascal %>' })
|
|
72
|
+
async create<%= props.namePascal %>(
|
|
73
|
+
@Info() info: GraphQLResolveInfo,
|
|
74
|
+
@GraphQLUser() user: User,
|
|
75
|
+
@Args('input') input: <%= props.namePascal %>CreateInput
|
|
76
|
+
): Promise<<%= props.namePascal %>> {
|
|
77
|
+
return await this.<%= props.nameCamel %>Service.create(input, {
|
|
78
|
+
currentUser: user,
|
|
79
|
+
fieldSelection: { info, select: 'create<%= props.namePascal %>' },
|
|
80
|
+
inputType: <%= props.namePascal %>CreateInput
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Delete existing <%= props.namePascal %>
|
|
86
|
+
*/
|
|
87
|
+
@Roles(RoleEnum.S_USER)
|
|
88
|
+
@Mutation(() => <%= props.namePascal %>, { description: 'Delete existing <%= props.namePascal %>' })
|
|
89
|
+
async delete<%= props.namePascal %>(
|
|
90
|
+
@Info() info: GraphQLResolveInfo,
|
|
91
|
+
@GraphQLUser() user: User,
|
|
92
|
+
@Args('id') id: string
|
|
93
|
+
): Promise<<%= props.namePascal %>> {
|
|
94
|
+
return await this.<%= props.nameCamel %>Service.delete(id, {
|
|
95
|
+
currentUser: user,
|
|
96
|
+
fieldSelection: { info, select: 'delete<%= props.namePascal %>' },
|
|
97
|
+
roles: [RoleEnum.ADMIN, RoleEnum.S_CREATOR]
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Update existing <%= props.namePascal %>
|
|
103
|
+
*/
|
|
104
|
+
@Roles(RoleEnum.S_USER)
|
|
105
|
+
@Mutation(() => <%= props.namePascal %>, { description: 'Update existing <%= props.namePascal %>' })
|
|
106
|
+
async update<%= props.namePascal %>(
|
|
107
|
+
@Info() info: GraphQLResolveInfo,
|
|
108
|
+
@GraphQLUser() user: User,
|
|
109
|
+
@Args('id') id: string,
|
|
110
|
+
@Args('input') input: <%= props.namePascal %>Input
|
|
111
|
+
): Promise<<%= props.namePascal %>> {
|
|
112
|
+
return await this.<%= props.nameCamel %>Service.update(id, input, {
|
|
113
|
+
currentUser: user,
|
|
114
|
+
fieldSelection: { info, select: 'update<%= props.namePascal %>' },
|
|
115
|
+
inputType: <%= props.namePascal %>Input,
|
|
116
|
+
roles: [RoleEnum.ADMIN, RoleEnum.S_CREATOR]
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// ===========================================================================
|
|
121
|
+
// Subscriptions
|
|
122
|
+
// ===========================================================================
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Subscription for create <%= props.namePascal %>
|
|
126
|
+
*/
|
|
127
|
+
@Subscription(() => <%= props.namePascal %>, {
|
|
128
|
+
filter(this: <%= props.namePascal %>Resolver, payload, variables, context) {
|
|
129
|
+
return context?.user?.hasRole?.(RoleEnum.ADMIN);
|
|
130
|
+
},
|
|
131
|
+
resolve: (value) => value,
|
|
132
|
+
})
|
|
133
|
+
async <%= props.nameCamel %>Created() {
|
|
134
|
+
return this.pubSub.asyncIterator('<%= props.nameCamel %>Created');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { assignPlain, CrudService, ServiceOptions } from '@lenne.tech/nest-server';
|
|
2
|
+
import { Inject, Injectable, NotFoundException } from '@nestjs/common';
|
|
3
|
+
import { InjectModel } from '@nestjs/mongoose';
|
|
4
|
+
import { PubSub } from 'graphql-subscriptions';
|
|
5
|
+
import { Model } from 'mongoose';
|
|
6
|
+
import { <%= props.namePascal %>CreateInput } from './inputs/<%= props.nameKebab %>-create.input';
|
|
7
|
+
import { <%= props.namePascal %>, <%= props.namePascal %>Document } from './<%= props.nameKebab %>.model';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* <%= props.namePascal %> service
|
|
11
|
+
*/
|
|
12
|
+
@Injectable()
|
|
13
|
+
export class <%= props.namePascal %>Service extends CrudService<<%= props.namePascal %>> {
|
|
14
|
+
|
|
15
|
+
// ===================================================================================================================
|
|
16
|
+
// Properties
|
|
17
|
+
// ===================================================================================================================
|
|
18
|
+
|
|
19
|
+
// ===================================================================================================================
|
|
20
|
+
// Injections
|
|
21
|
+
// ===================================================================================================================
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Constructor for injecting services
|
|
25
|
+
*/
|
|
26
|
+
constructor(
|
|
27
|
+
@InjectModel('<%= props.namePascal %>') protected readonly <%= props.nameCamel %>Model: Model<<%= props.namePascal %>Document>,
|
|
28
|
+
@Inject('PUB_SUB') protected readonly pubSub: PubSub
|
|
29
|
+
) {
|
|
30
|
+
super({mainDbModel: <%= props.nameCamel %>Model, mainModelConstructor: <%= props.namePascal %>});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// ===================================================================================================================
|
|
34
|
+
// Methods
|
|
35
|
+
// ===================================================================================================================
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Create new <%= props.namePascal %>
|
|
39
|
+
* Overwrites create method from CrudService
|
|
40
|
+
*/
|
|
41
|
+
async create(input: <%= props.namePascal %>CreateInput, serviceOptions?: ServiceOptions): Promise<<%= props.namePascal %>> {
|
|
42
|
+
// Get new <%= props.namePascal %>
|
|
43
|
+
const created<%= props.namePascal %> = await super.create(input, serviceOptions);
|
|
44
|
+
|
|
45
|
+
// Inform subscriber
|
|
46
|
+
if (serviceOptions?.pubSub === undefined || serviceOptions.pubSub) {
|
|
47
|
+
await this.pubSub.publish('<%= props.nameCamel %>Created', <%= props.namePascal %>.map(created<%= props.namePascal %>));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Return created <%= props.namePascal %>
|
|
51
|
+
return created<%= props.namePascal %>;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Example method
|
|
56
|
+
* Extends the CrudService
|
|
57
|
+
*/
|
|
58
|
+
async exampleMethode(id: string, input: Record<string, any>, serviceOptions?: ServiceOptions): Promise<<%= props.namePascal %>> {
|
|
59
|
+
|
|
60
|
+
// Get and check <%= props.namePascal %>
|
|
61
|
+
const <%= props.nameCamel %> = await this.mainDbModel.findById(id).exec();
|
|
62
|
+
if (!<%= props.nameCamel %>) {
|
|
63
|
+
throw new NotFoundException(`<%= props.namePascal %> not found with ID: ${id}`);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Process input and output
|
|
67
|
+
return await this.process(async (data) => {
|
|
68
|
+
|
|
69
|
+
// Update, save and return <%= props.namePascal %>
|
|
70
|
+
return await assignPlain(<%= props.nameCamel %>, data.input).save();
|
|
71
|
+
|
|
72
|
+
}, {input, serviceOptions});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# <%= props.name %>
|
|
2
|
+
<%= props.description %>
|
|
3
|
+
|
|
4
|
+
## Requirements
|
|
5
|
+
|
|
6
|
+
- [Node.js incl. npm](https://nodejs.org):
|
|
7
|
+
the runtime environment for your server
|
|
8
|
+
|
|
9
|
+
- [MongoDB](https://docs.mongodb.com/manual/installation/#mongodb-community-edition-installation-tutorials)
|
|
10
|
+
the database for your objects
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
## Start the server
|
|
14
|
+
|
|
15
|
+
`$ npm run start:dev`
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
## Extend the server
|
|
19
|
+
|
|
20
|
+
This server is based on [lenne.Tech Nest Server](https://github.com/lenneTech/nest-server).
|
|
21
|
+
|
|
22
|
+
Since the lenne.Tech Nest Server is based on [Nest](https://nestjs.com/), you can find all information about extending
|
|
23
|
+
the **<%= props.name %>** in the [documentation of Nest](https://docs.nestjs.com/).
|
|
24
|
+
|
|
25
|
+
The documentation of the extensions and auxiliary classes that the
|
|
26
|
+
[lenne.Tech Nest Server](https://github.com/lenneTech/nest-server) contains is currently under construction.
|
|
27
|
+
As long as this is not yet available,have a look at the
|
|
28
|
+
[source code](https://github.com/lenneTech/nest-server/tree/master/src/core).
|
|
29
|
+
There you will find a lot of things that will help you to extend your server, such as:
|
|
30
|
+
|
|
31
|
+
- [GraphQL scalars](https://github.com/lenneTech/nest-server/tree/master/src/core/common/scalars)
|
|
32
|
+
- [Filter and pagination](https://github.com/lenneTech/nest-server/tree/master/src/core/common/args)
|
|
33
|
+
- [Decorators for restrictions and roles](https://github.com/lenneTech/nest-server/tree/master/src/core/common/decorators)
|
|
34
|
+
- [Authorisation handling](https://github.com/lenneTech/nest-server/tree/master/src/core/modules/auth)
|
|
35
|
+
- [Ready to use user module](https://github.com/lenneTech/nest-server/tree/master/src/core/modules/user)
|
|
36
|
+
- [Common helpers](https://github.com/lenneTech/nest-server/tree/master/src/core/common/helpers) and
|
|
37
|
+
[helpers for tests](https://github.com/lenneTech/nest-server/blob/master/src/test/test.helper.ts)
|
|
38
|
+
- ...
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
## Further information
|
|
42
|
+
|
|
43
|
+
### Running the app
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# Development
|
|
47
|
+
$ npm start
|
|
48
|
+
|
|
49
|
+
# Watch mode
|
|
50
|
+
$ npm run start:dev
|
|
51
|
+
|
|
52
|
+
# Production mode
|
|
53
|
+
$ npm run start:prod
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Test
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# e2e tests
|
|
60
|
+
$ npm run test:e2e
|
|
61
|
+
```
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { RoleEnum, TestGraphQLType, TestHelper } from '@lenne.tech/nest-server';
|
|
2
|
+
import { Test, TestingModule } from '@nestjs/testing';
|
|
3
|
+
import { PubSub } from 'graphql-subscriptions';
|
|
4
|
+
import envConfig from '../src/config.env';
|
|
5
|
+
import { User } from '../src/server/modules/user/user.model';
|
|
6
|
+
import { UserService } from '../src/server/modules/user/user.service';
|
|
7
|
+
import { ServerModule } from '../src/server/server.module';
|
|
8
|
+
import { MongoClient, ObjectId } from 'mongodb';
|
|
9
|
+
|
|
10
|
+
describe('<%= props.namePascal %> (e2e)', () => {
|
|
11
|
+
let app;
|
|
12
|
+
let testHelper: TestHelper;
|
|
13
|
+
|
|
14
|
+
// database
|
|
15
|
+
let connection;
|
|
16
|
+
let db;
|
|
17
|
+
|
|
18
|
+
// Global vars
|
|
19
|
+
let userService: UserService;
|
|
20
|
+
const users: Partial<User & { token: string }>[] = [];
|
|
21
|
+
|
|
22
|
+
// ===================================================================================================================
|
|
23
|
+
// Preparations
|
|
24
|
+
// ===================================================================================================================
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Before all tests
|
|
28
|
+
*/
|
|
29
|
+
beforeAll(async () => {
|
|
30
|
+
try {
|
|
31
|
+
const moduleFixture: TestingModule = await Test.createTestingModule({
|
|
32
|
+
imports: [ServerModule],
|
|
33
|
+
providers: [
|
|
34
|
+
UserService,
|
|
35
|
+
{
|
|
36
|
+
provide: 'PUB_SUB',
|
|
37
|
+
useValue: new PubSub(),
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
}).compile();
|
|
41
|
+
app = moduleFixture.createNestApplication();
|
|
42
|
+
app.setBaseViewsDir(envConfig.templates.path);
|
|
43
|
+
app.setViewEngine(envConfig.templates.engine);
|
|
44
|
+
await app.init();
|
|
45
|
+
testHelper = new TestHelper(app);
|
|
46
|
+
userService = moduleFixture.get<UserService>(UserService);
|
|
47
|
+
|
|
48
|
+
// Connection to database
|
|
49
|
+
connection = await MongoClient.connect(envConfig.mongoose.uri);
|
|
50
|
+
db = await connection.db();
|
|
51
|
+
} catch (e) {
|
|
52
|
+
console.log('beforeAllError', e);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* After all tests are finished
|
|
58
|
+
*/
|
|
59
|
+
afterAll(async () => {
|
|
60
|
+
await connection.close();
|
|
61
|
+
await app.close();
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// ===================================================================================================================
|
|
65
|
+
// Initialization tests
|
|
66
|
+
// ===================================================================================================================
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Create and verify users for testing
|
|
70
|
+
*/
|
|
71
|
+
it('createAndVerifyUsers', async () => {
|
|
72
|
+
const userCount = 2;
|
|
73
|
+
for (let i = 0; i < userCount; i++) {
|
|
74
|
+
const random = Math.random().toString(36).substring(7);
|
|
75
|
+
const input = {
|
|
76
|
+
password: random,
|
|
77
|
+
email: random + '@testusers.com',
|
|
78
|
+
firstName: 'Test' + random,
|
|
79
|
+
lastName: 'User' + random,
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
// Sign up user
|
|
83
|
+
const res: any = await testHelper.graphQl({
|
|
84
|
+
name: 'signUp',
|
|
85
|
+
type: TestGraphQLType.MUTATION,
|
|
86
|
+
arguments: { input },
|
|
87
|
+
fields: [{ user: ['id', 'email', 'firstName', 'lastName'] }],
|
|
88
|
+
});
|
|
89
|
+
res.user.password = input.password;
|
|
90
|
+
users.push(res.user);
|
|
91
|
+
|
|
92
|
+
// Verify user
|
|
93
|
+
await db.collection('users').updateOne({ _id: new ObjectId(res.id) }, { $set: { verified: true } });
|
|
94
|
+
}
|
|
95
|
+
expect(users.length).toBeGreaterThanOrEqual(userCount);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Sign in users
|
|
100
|
+
*/
|
|
101
|
+
it('signInUsers', async () => {
|
|
102
|
+
for (const user of users) {
|
|
103
|
+
const res: any = await testHelper.graphQl({
|
|
104
|
+
name: 'signIn',
|
|
105
|
+
arguments: {
|
|
106
|
+
input: {
|
|
107
|
+
email: user.email,
|
|
108
|
+
password: user.password,
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
fields: ['token', { user: ['id', 'email'] }],
|
|
112
|
+
});
|
|
113
|
+
expect(res.user.id).toEqual(user.id);
|
|
114
|
+
expect(res.user.email).toEqual(user.email);
|
|
115
|
+
user.token = res.token;
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Prepare users
|
|
121
|
+
*/
|
|
122
|
+
it('prepareUsers', async () => {
|
|
123
|
+
await db
|
|
124
|
+
.collection('users')
|
|
125
|
+
.findOneAndUpdate({ _id: new ObjectId(users[0].id) }, { $set: { roles: [RoleEnum.ADMIN] } });
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
// ===================================================================================================================
|
|
129
|
+
// Tests for <%= props.namePascal %>
|
|
130
|
+
// ===================================================================================================================
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Test
|
|
134
|
+
*/
|
|
135
|
+
it('test', async () => {
|
|
136
|
+
console.log('Implement <%= props.namePascal %> test here');
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// ===================================================================================================================
|
|
140
|
+
// Clean up tests
|
|
141
|
+
// ===================================================================================================================
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Delete users
|
|
145
|
+
*/
|
|
146
|
+
it('deleteUsers', async () => {
|
|
147
|
+
// Add admin role to user 2
|
|
148
|
+
await userService.setRoles(users[1].id, ['admin']);
|
|
149
|
+
|
|
150
|
+
for (const user of users) {
|
|
151
|
+
const res: any = await testHelper.graphQl(
|
|
152
|
+
{
|
|
153
|
+
name: 'deleteUser',
|
|
154
|
+
type: TestGraphQLType.MUTATION,
|
|
155
|
+
arguments: {
|
|
156
|
+
id: user.id,
|
|
157
|
+
},
|
|
158
|
+
fields: ['id'],
|
|
159
|
+
},
|
|
160
|
+
{ token: users[1].token }
|
|
161
|
+
);
|
|
162
|
+
expect(res.id).toEqual(user.id);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# <%= props.name %>
|
|
2
|
+
|
|
3
|
+
[](/LICENSE) [](https://circleci.com/gh/<%= props.nameKebab %>/tree/master)
|
|
4
|
+
[](https://david-dm.org/<%= props.nameKebab %>) [](https://david-dm.org/<%= props.nameKebab %>?type=dev)
|
|
5
|
+
|
|
6
|
+
<!--
|
|
7
|
+
[](https://github.com/<%= props.nameKebab %>/fork) [](https://github.com/<%= props.nameKebab %>)
|
|
8
|
+
-->
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
## Requirements
|
|
12
|
+
|
|
13
|
+
- [Node.js incl. npm](https://nodejs.org):
|
|
14
|
+
the runtime environment for your project
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## Scripts
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# Lint
|
|
21
|
+
$ npm run lint
|
|
22
|
+
|
|
23
|
+
# Test
|
|
24
|
+
$ npm test
|
|
25
|
+
$ npm run watch
|
|
26
|
+
$ npm run coverage
|
|
27
|
+
|
|
28
|
+
# Build
|
|
29
|
+
$ npm build
|
|
30
|
+
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lenne.tech/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.73",
|
|
4
4
|
"description": "lenne.Tech CLI: lt",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"lenne.Tech",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"build": "npm run lint && npm run test && npm run clean-build && npm run compile && npm run copy-templates",
|
|
22
22
|
"clean-build": "rimraf ./build",
|
|
23
23
|
"compile": "tsc -p .",
|
|
24
|
-
"copy-templates": "
|
|
24
|
+
"copy-templates": "cp -R ./src/templates ./build/templates",
|
|
25
25
|
"coverage": "jest --coverage",
|
|
26
26
|
"format": "prettier --write 'src/**/*.{js,ts,tsx,json}' '!src/templates/**/*'",
|
|
27
27
|
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix --cache",
|
|
@@ -53,20 +53,20 @@
|
|
|
53
53
|
"find-file-up": "2.0.1",
|
|
54
54
|
"gluegun": "5.1.2",
|
|
55
55
|
"open": "8.4.0",
|
|
56
|
-
"standard-version": "
|
|
57
|
-
"ts-node": "10.
|
|
56
|
+
"standard-version": "9.5.0",
|
|
57
|
+
"ts-node": "10.8.0",
|
|
58
58
|
"typescript": "4.6.4"
|
|
59
59
|
},
|
|
60
60
|
"devDependencies": {
|
|
61
61
|
"@lenne.tech/npm-package-helper": "0.0.12",
|
|
62
|
-
"@types/jest": "27.5.
|
|
63
|
-
"@types/node": "16.11.
|
|
64
|
-
"@typescript-eslint/eslint-plugin": "5.
|
|
65
|
-
"@typescript-eslint/parser": "5.
|
|
62
|
+
"@types/jest": "27.5.1",
|
|
63
|
+
"@types/node": "16.11.36",
|
|
64
|
+
"@typescript-eslint/eslint-plugin": "5.25.0",
|
|
65
|
+
"@typescript-eslint/parser": "5.25.0",
|
|
66
66
|
"cpy-cli": "4.1.0",
|
|
67
|
-
"eslint": "8.
|
|
67
|
+
"eslint": "8.16.0",
|
|
68
68
|
"eslint-config-prettier": "8.5.0",
|
|
69
|
-
"husky": "
|
|
69
|
+
"husky": "8.0.1",
|
|
70
70
|
"jest": "28.1.0",
|
|
71
71
|
"path-exists-cli": "2.0.0",
|
|
72
72
|
"prettier": "2.6.2",
|