@lenne.tech/cli 0.0.80 → 0.0.84
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 +169 -44
- package/build/commands/deployment/create.js +91 -9
- package/build/commands/server/module.js +67 -5
- package/build/extensions/server.js +234 -0
- package/build/extensions/tools.js +137 -0
- package/build/interfaces/ServerProps.interface.js +3 -0
- package/build/templates/deployment/.gitlab-ci.yml.ejs +6 -12
- package/build/templates/deployment/Dockerfile.app.ejs +2 -2
- package/build/templates/deployment/docker-compose.develop.yml.ejs +1 -1
- package/build/templates/deployment/docker-compose.prod.yml.ejs +1 -1
- package/build/templates/deployment/docker-compose.test.yml.ejs +1 -1
- package/build/templates/nest-server-module/inputs/template-create.input.ts.ejs +5 -8
- package/build/templates/nest-server-module/inputs/template.input.ts.ejs +3 -9
- package/build/templates/nest-server-module/template.model.ts.ejs +4 -21
- package/build/templates/nest-server-module/template.resolver.ts.ejs +2 -1
- package/package.json +5 -5
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Server = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Server helper functions
|
|
6
|
+
*/
|
|
7
|
+
class Server {
|
|
8
|
+
/**
|
|
9
|
+
* Constructor for integration of toolbox
|
|
10
|
+
*/
|
|
11
|
+
constructor(toolbox) {
|
|
12
|
+
this.toolbox = toolbox;
|
|
13
|
+
// Specific imports for default modells
|
|
14
|
+
this.imports = {
|
|
15
|
+
CoreFileInfo: "import { CoreFileInfo } from '@lenne.tech/nest-server';",
|
|
16
|
+
GraphQLUpload: "import * as GraphQLUpload from 'graphql-upload/GraphQLUpload.js';",
|
|
17
|
+
FileUpload: "import type { FileUpload } from 'graphql-upload/processRequest.js';",
|
|
18
|
+
};
|
|
19
|
+
// Specific types for properties in input fields
|
|
20
|
+
this.inputFieldTypes = {
|
|
21
|
+
File: 'GraphQLUpload',
|
|
22
|
+
FileInfo: 'GraphQLUpload',
|
|
23
|
+
Id: 'String',
|
|
24
|
+
ID: 'String',
|
|
25
|
+
ObjectId: 'String',
|
|
26
|
+
Upload: 'GraphQLUpload',
|
|
27
|
+
};
|
|
28
|
+
// Specific types for properties in input classes
|
|
29
|
+
this.inputClassTypes = {
|
|
30
|
+
File: 'FileUpload',
|
|
31
|
+
FileInfo: 'FileUpload',
|
|
32
|
+
Id: 'string',
|
|
33
|
+
ID: 'string',
|
|
34
|
+
ObjectId: 'string',
|
|
35
|
+
Upload: 'FileUpload',
|
|
36
|
+
};
|
|
37
|
+
// Specific types for properties in model fields
|
|
38
|
+
this.modelFieldTypes = {
|
|
39
|
+
File: 'CoreFileInfo',
|
|
40
|
+
FileInfo: 'CoreFileInfo',
|
|
41
|
+
ID: 'String',
|
|
42
|
+
Id: 'String',
|
|
43
|
+
ObjectId: 'String',
|
|
44
|
+
Upload: 'CoreFileInfo',
|
|
45
|
+
};
|
|
46
|
+
// Specific types for properties in model class
|
|
47
|
+
this.modelClassTypes = {
|
|
48
|
+
File: 'CoreFileInfo',
|
|
49
|
+
FileInfo: 'CoreFileInfo',
|
|
50
|
+
ID: 'string',
|
|
51
|
+
Id: 'string',
|
|
52
|
+
ObjectId: 'string',
|
|
53
|
+
Upload: 'CoreFileInfo',
|
|
54
|
+
};
|
|
55
|
+
// Standard types: primitives and default JavaScript classes
|
|
56
|
+
this.standardTypes = ['boolean', 'string', 'number', 'Date'];
|
|
57
|
+
this.camelCase = toolbox.strings.camelCase;
|
|
58
|
+
this.kebabCase = toolbox.strings.kebabCase;
|
|
59
|
+
this.pascalCase = toolbox.strings.pascalCase;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Create template string for properties in model
|
|
63
|
+
*/
|
|
64
|
+
propsForModel(props, options) {
|
|
65
|
+
var _a;
|
|
66
|
+
// Preparations
|
|
67
|
+
const config = Object.assign({ useDefault: true }, options);
|
|
68
|
+
const { modelName, useDefault } = config;
|
|
69
|
+
let result = '';
|
|
70
|
+
// Check parameters
|
|
71
|
+
if (!props || !(typeof props !== 'object') || !Object.keys(props).length) {
|
|
72
|
+
if (!useDefault) {
|
|
73
|
+
return { props: '', imports: '', mappings: 'this;' };
|
|
74
|
+
}
|
|
75
|
+
// Use default
|
|
76
|
+
if (!Object.keys(props).length && useDefault) {
|
|
77
|
+
return {
|
|
78
|
+
props: `
|
|
79
|
+
/**
|
|
80
|
+
* Description of properties
|
|
81
|
+
*/
|
|
82
|
+
@Restricted(RoleEnum.ADMIN, RoleEnum.S_CREATOR)
|
|
83
|
+
@Field(() => [String], { description: 'Properties of ${this.pascalCase(modelName)}', nullable: 'items'})
|
|
84
|
+
@Prop([String])
|
|
85
|
+
properties: string[] = undefined;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* User how has tested the ${this.pascalCase(modelName)}
|
|
89
|
+
*/
|
|
90
|
+
@Field(() => User, {
|
|
91
|
+
description: 'User who has tested the ${this.pascalCase(modelName)}',
|
|
92
|
+
nullable: true,
|
|
93
|
+
})
|
|
94
|
+
@Prop({ type: Schema.Types.ObjectId, ref: 'User' })
|
|
95
|
+
testedBy: User = undefined;
|
|
96
|
+
`,
|
|
97
|
+
imports: '',
|
|
98
|
+
mappings: 'mapClasses(input, {user: User}, this);',
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Process configuration
|
|
103
|
+
const imports = {};
|
|
104
|
+
const mappings = {};
|
|
105
|
+
for (const [name, item] of Object.entries(props)) {
|
|
106
|
+
const propName = this.camelCase(name);
|
|
107
|
+
const reference = ((_a = item.reference) === null || _a === void 0 ? void 0 : _a.trim()) ? this.pascalCase(item.reference.trim()) : '';
|
|
108
|
+
const modelFieldType = this.modelFieldTypes[this.pascalCase(item.type)] || this.pascalCase(item.type);
|
|
109
|
+
const isArray = item.isArray;
|
|
110
|
+
const modelClassType = this.modelClassTypes[this.pascalCase(item.type)] ||
|
|
111
|
+
(this.standardTypes.includes(item.type) ? item.type : this.pascalCase(item.type));
|
|
112
|
+
const type = this.standardTypes.includes(item.type) ? item.type : this.pascalCase(item.type);
|
|
113
|
+
if (!this.standardTypes.includes(type) && type !== 'ObjectId') {
|
|
114
|
+
mappings[propName] = type;
|
|
115
|
+
}
|
|
116
|
+
if (reference) {
|
|
117
|
+
mappings[propName] = reference;
|
|
118
|
+
}
|
|
119
|
+
if (this.imports[modelClassType]) {
|
|
120
|
+
imports[modelClassType] = this.imports[modelClassType];
|
|
121
|
+
}
|
|
122
|
+
result += `
|
|
123
|
+
/**
|
|
124
|
+
* ${propName + (modelName ? ' of ' + this.pascalCase(modelName) : '')}
|
|
125
|
+
*/
|
|
126
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
127
|
+
@Field(() => ${(isArray ? '[' : '') + (reference ? reference : modelFieldType) + (isArray ? ']' : '')}, {
|
|
128
|
+
description: '${propName + (modelName ? ' of ' + this.pascalCase(modelName) : '')}',
|
|
129
|
+
nullable: ${item.nullable},
|
|
130
|
+
})
|
|
131
|
+
@Prop(${reference
|
|
132
|
+
? (isArray ? '[' : '') + `{ type: Schema.Types.ObjectId, ref: '${reference}' }` + (isArray ? ']' : '')
|
|
133
|
+
: ''})
|
|
134
|
+
${propName}: ${modelClassType + (isArray ? '[]' : '') + (reference ? ' | ' + reference + (isArray ? '[]' : '') : '')} = undefined;
|
|
135
|
+
`;
|
|
136
|
+
}
|
|
137
|
+
// Process imports
|
|
138
|
+
let importsResult = '';
|
|
139
|
+
for (const value of Object.values(imports)) {
|
|
140
|
+
importsResult += `\n${value}`;
|
|
141
|
+
}
|
|
142
|
+
// Process mappings
|
|
143
|
+
const mappingsResult = [];
|
|
144
|
+
for (const [key, value] of Object.entries(mappings)) {
|
|
145
|
+
mappingsResult.push(`${key}: ${value}`);
|
|
146
|
+
}
|
|
147
|
+
// Return template data
|
|
148
|
+
return {
|
|
149
|
+
props: result,
|
|
150
|
+
imports: importsResult,
|
|
151
|
+
mappings: mappingsResult.length ? `mapClasses(input, {${mappingsResult.join(', ')}}, this);` : 'this;',
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Create template string for properties in input
|
|
156
|
+
*/
|
|
157
|
+
propsForInput(props, options) {
|
|
158
|
+
// Preparations
|
|
159
|
+
const config = Object.assign({ useDefault: true }, options);
|
|
160
|
+
const { modelName, nullable, useDefault } = config;
|
|
161
|
+
let result = '';
|
|
162
|
+
// Check parameters
|
|
163
|
+
if (!props || !(typeof props !== 'object') || !Object.keys(props).length) {
|
|
164
|
+
if (!useDefault) {
|
|
165
|
+
return { props: '', imports: '' };
|
|
166
|
+
}
|
|
167
|
+
// Use default
|
|
168
|
+
if (!Object.keys(props).length && useDefault) {
|
|
169
|
+
return {
|
|
170
|
+
props: `
|
|
171
|
+
/**
|
|
172
|
+
* Description of properties
|
|
173
|
+
*/
|
|
174
|
+
@Restricted(RoleEnum.ADMIN, RoleEnum.S_CREATOR)
|
|
175
|
+
@Field(() => [String], { description: 'Properties of ${this.pascalCase(modelName)}', nullable: ${config.nullable ? config.nullable : `'items'`}})
|
|
176
|
+
properties: string[] = undefined;
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* User how has tested the ${this.pascalCase(modelName)}
|
|
180
|
+
*/
|
|
181
|
+
@Field(() => User, {
|
|
182
|
+
description: 'User who has tested the ${this.pascalCase(modelName)}',
|
|
183
|
+
nullable: ${config.nullable},
|
|
184
|
+
})
|
|
185
|
+
testedBy: User = undefined;
|
|
186
|
+
`,
|
|
187
|
+
imports: '',
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
// Process configuration
|
|
191
|
+
const imports = {};
|
|
192
|
+
for (const [name, item] of Object.entries(props)) {
|
|
193
|
+
const inputFieldType = this.inputFieldTypes[this.pascalCase(item.type)] || this.pascalCase(item.type);
|
|
194
|
+
const inputClassType = this.inputClassTypes[this.pascalCase(item.type)] ||
|
|
195
|
+
(this.standardTypes.includes(item.type) ? item.type : this.pascalCase(item.type));
|
|
196
|
+
if (this.imports[inputFieldType]) {
|
|
197
|
+
imports[inputFieldType] = this.imports[inputFieldType];
|
|
198
|
+
}
|
|
199
|
+
if (this.imports[inputClassType]) {
|
|
200
|
+
imports[inputClassType] = this.imports[inputClassType];
|
|
201
|
+
}
|
|
202
|
+
result += `
|
|
203
|
+
/**
|
|
204
|
+
* ${this.pascalCase(name) + (modelName ? ' of ' + this.pascalCase(modelName) : '')}
|
|
205
|
+
*/
|
|
206
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
207
|
+
@Field(() => ${(item.isArray ? '[' : '') + inputFieldType + (item.isArray ? ']' : '')}, {
|
|
208
|
+
description: '${this.pascalCase(name) + (modelName ? ' of ' + this.pascalCase(modelName) : '')}',
|
|
209
|
+
nullable: ${nullable || item.nullable},
|
|
210
|
+
})${nullable || item.nullable ? '\n @IsOptional()' : ''}
|
|
211
|
+
${this.camelCase(name)}: ${inputClassType + (item.isArray ? '[]' : '')} = undefined;
|
|
212
|
+
`;
|
|
213
|
+
}
|
|
214
|
+
// Process imports
|
|
215
|
+
let importsResult = '';
|
|
216
|
+
for (const value of Object.values(imports)) {
|
|
217
|
+
importsResult += `\n${value}`;
|
|
218
|
+
}
|
|
219
|
+
// Return template data
|
|
220
|
+
return {
|
|
221
|
+
props: result,
|
|
222
|
+
imports: importsResult,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
exports.Server = Server;
|
|
228
|
+
/**
|
|
229
|
+
* Extend toolbox
|
|
230
|
+
*/
|
|
231
|
+
exports.default = (toolbox) => {
|
|
232
|
+
toolbox.server = new Server(toolbox);
|
|
233
|
+
};
|
|
234
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4dGVuc2lvbnMvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBOztHQUVHO0FBQ0gsTUFBYSxNQUFNO0lBd0RqQjs7T0FFRztJQUNILFlBQXNCLE9BQStCO1FBQS9CLFlBQU8sR0FBUCxPQUFPLENBQXdCO1FBckRyRCx1Q0FBdUM7UUFDdkMsWUFBTyxHQUEyQjtZQUNoQyxZQUFZLEVBQUUseURBQXlEO1lBQ3ZFLGFBQWEsRUFBRSxtRUFBbUU7WUFDbEYsVUFBVSxFQUFFLHFFQUFxRTtTQUNsRixDQUFDO1FBRUYsZ0RBQWdEO1FBQ2hELG9CQUFlLEdBQTJCO1lBQ3hDLElBQUksRUFBRSxlQUFlO1lBQ3JCLFFBQVEsRUFBRSxlQUFlO1lBQ3pCLEVBQUUsRUFBRSxRQUFRO1lBQ1osRUFBRSxFQUFFLFFBQVE7WUFDWixRQUFRLEVBQUUsUUFBUTtZQUNsQixNQUFNLEVBQUUsZUFBZTtTQUN4QixDQUFDO1FBRUYsaURBQWlEO1FBQ2pELG9CQUFlLEdBQTJCO1lBQ3hDLElBQUksRUFBRSxZQUFZO1lBQ2xCLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLEVBQUUsRUFBRSxRQUFRO1lBQ1osRUFBRSxFQUFFLFFBQVE7WUFDWixRQUFRLEVBQUUsUUFBUTtZQUNsQixNQUFNLEVBQUUsWUFBWTtTQUNyQixDQUFDO1FBRUYsZ0RBQWdEO1FBQ2hELG9CQUFlLEdBQTJCO1lBQ3hDLElBQUksRUFBRSxjQUFjO1lBQ3BCLFFBQVEsRUFBRSxjQUFjO1lBQ3hCLEVBQUUsRUFBRSxRQUFRO1lBQ1osRUFBRSxFQUFFLFFBQVE7WUFDWixRQUFRLEVBQUUsUUFBUTtZQUNsQixNQUFNLEVBQUUsY0FBYztTQUN2QixDQUFDO1FBRUYsK0NBQStDO1FBQy9DLG9CQUFlLEdBQTJCO1lBQ3hDLElBQUksRUFBRSxjQUFjO1lBQ3BCLFFBQVEsRUFBRSxjQUFjO1lBQ3hCLEVBQUUsRUFBRSxRQUFR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
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Tools = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const singleComment = Symbol('singleComment');
|
|
6
|
+
const multiComment = Symbol('multiComment');
|
|
7
|
+
const stripWithoutWhitespace = () => '';
|
|
8
|
+
const stripWithWhitespace = (string, start, end) => string.slice(start, end).replace(/\S/g, ' ');
|
|
9
|
+
const isEscaped = (jsonString, quotePosition) => {
|
|
10
|
+
let index = quotePosition - 1;
|
|
11
|
+
let backslashCount = 0;
|
|
12
|
+
while (jsonString[index] === '\\') {
|
|
13
|
+
index -= 1;
|
|
14
|
+
backslashCount += 1;
|
|
15
|
+
}
|
|
16
|
+
return Boolean(backslashCount % 2);
|
|
17
|
+
};
|
|
18
|
+
class Tools {
|
|
19
|
+
/**
|
|
20
|
+
* Constructor for integration of toolbox
|
|
21
|
+
*/
|
|
22
|
+
constructor(toolbox) {
|
|
23
|
+
this.toolbox = toolbox;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Strip and save JSON file
|
|
27
|
+
*/
|
|
28
|
+
stripAndSaveJsonFile(path) {
|
|
29
|
+
const content = this.stripJsonComments((0, fs_1.readFileSync)(path, 'utf8'));
|
|
30
|
+
(0, fs_1.writeFileSync)(path, content);
|
|
31
|
+
return content;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Strip JSON comments from a string
|
|
35
|
+
* Inspired by https://github.com/sindresorhus/strip-json-comments/blob/main/index.js
|
|
36
|
+
*/
|
|
37
|
+
stripJsonComments(jsonString, { whitespace = true, trailingCommas = false } = {}) {
|
|
38
|
+
if (typeof jsonString !== 'string') {
|
|
39
|
+
throw new TypeError(`Expected argument \`jsonString\` to be a \`string\`, got \`${typeof jsonString}\``);
|
|
40
|
+
}
|
|
41
|
+
const strip = whitespace ? stripWithWhitespace : stripWithoutWhitespace;
|
|
42
|
+
let isInsideString = false;
|
|
43
|
+
let isInsideComment = false;
|
|
44
|
+
let offset = 0;
|
|
45
|
+
let buffer = '';
|
|
46
|
+
let result = '';
|
|
47
|
+
let commaIndex = -1;
|
|
48
|
+
for (let index = 0; index < jsonString.length; index++) {
|
|
49
|
+
const currentCharacter = jsonString[index];
|
|
50
|
+
const nextCharacter = jsonString[index + 1];
|
|
51
|
+
if (!isInsideComment && currentCharacter === '"') {
|
|
52
|
+
// Enter or exit string
|
|
53
|
+
const escaped = isEscaped(jsonString, index);
|
|
54
|
+
if (!escaped) {
|
|
55
|
+
isInsideString = !isInsideString;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (isInsideString) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (!isInsideComment && currentCharacter + nextCharacter === '//') {
|
|
62
|
+
// Enter single-line comment
|
|
63
|
+
buffer += jsonString.slice(offset, index);
|
|
64
|
+
offset = index;
|
|
65
|
+
isInsideComment = singleComment;
|
|
66
|
+
index++;
|
|
67
|
+
}
|
|
68
|
+
else if (isInsideComment === singleComment && currentCharacter + nextCharacter === '\r\n') {
|
|
69
|
+
// Exit single-line comment via \r\n
|
|
70
|
+
index++;
|
|
71
|
+
isInsideComment = false;
|
|
72
|
+
buffer += strip(jsonString, offset, index);
|
|
73
|
+
offset = index;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
else if (isInsideComment === singleComment && currentCharacter === '\n') {
|
|
77
|
+
// Exit single-line comment via \n
|
|
78
|
+
isInsideComment = false;
|
|
79
|
+
buffer += strip(jsonString, offset, index);
|
|
80
|
+
offset = index;
|
|
81
|
+
}
|
|
82
|
+
else if (!isInsideComment && currentCharacter + nextCharacter === '/*') {
|
|
83
|
+
// Enter multiline comment
|
|
84
|
+
buffer += jsonString.slice(offset, index);
|
|
85
|
+
offset = index;
|
|
86
|
+
isInsideComment = multiComment;
|
|
87
|
+
index++;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
else if (isInsideComment === multiComment && currentCharacter + nextCharacter === '*/') {
|
|
91
|
+
// Exit multiline comment
|
|
92
|
+
index++;
|
|
93
|
+
isInsideComment = false;
|
|
94
|
+
buffer += strip(jsonString, offset, index + 1);
|
|
95
|
+
offset = index + 1;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
else if (trailingCommas && !isInsideComment) {
|
|
99
|
+
if (commaIndex !== -1) {
|
|
100
|
+
if (currentCharacter === '}' || currentCharacter === ']') {
|
|
101
|
+
// Strip trailing comma
|
|
102
|
+
buffer += jsonString.slice(offset, index);
|
|
103
|
+
result += strip(buffer, 0, 1) + buffer.slice(1);
|
|
104
|
+
buffer = '';
|
|
105
|
+
offset = index;
|
|
106
|
+
commaIndex = -1;
|
|
107
|
+
}
|
|
108
|
+
else if (currentCharacter !== ' ' &&
|
|
109
|
+
currentCharacter !== '\t' &&
|
|
110
|
+
currentCharacter !== '\r' &&
|
|
111
|
+
currentCharacter !== '\n') {
|
|
112
|
+
// Hit non-whitespace following a comma; comma is not trailing
|
|
113
|
+
buffer += jsonString.slice(offset, index);
|
|
114
|
+
offset = index;
|
|
115
|
+
commaIndex = -1;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else if (currentCharacter === ',') {
|
|
119
|
+
// Flush buffer prior to this point, and save new comma index
|
|
120
|
+
result += buffer + jsonString.slice(offset, index);
|
|
121
|
+
buffer = '';
|
|
122
|
+
offset = index;
|
|
123
|
+
commaIndex = index;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return result + buffer + (isInsideComment ? strip(jsonString.slice(offset)) : jsonString.slice(offset));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.Tools = Tools;
|
|
131
|
+
/**
|
|
132
|
+
* Extend toolbox
|
|
133
|
+
*/
|
|
134
|
+
exports.default = (toolbox) => {
|
|
135
|
+
toolbox.tools = new Tools(toolbox);
|
|
136
|
+
};
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXh0ZW5zaW9ucy90b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQkFBaUQ7QUFHakQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQzlDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUU1QyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUN4QyxNQUFNLG1CQUFtQixHQUFHLENBQUMsTUFBTSxFQUFFLEtBQU0sRUFBRSxHQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFFbkcsTUFBTSxTQUFTLEdBQUcsQ0FBQyxVQUFVLEVBQUUsYUFBYSxFQUFFLEVBQUU7SUFDOUMsSUFBSSxLQUFLLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQztJQUM5QixJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFFdkIsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2pDLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDWCxjQUFjLElBQUksQ0FBQyxDQUFDO0tBQ3JCO0lBRUQsT0FBTyxPQUFPLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLENBQUMsQ0FBQztBQUVGLE1BQWEsS0FBSztJQUNoQjs7T0FFRztJQUNILFlBQXNCLE9BQStCO1FBQS9CLFlBQU8sR0FBUCxPQUFPLENBQXdCO0lBQUcsQ0FBQztJQUV6RDs7T0FFRztJQUNILG9CQUFvQixDQUFDLElBQVk7UUFDL0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUEsaUJBQVksRUFBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENB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
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VydmVyUHJvcHMuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludGVyZmFjZXMvU2VydmVyUHJvcHMuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
|
|
@@ -85,12 +85,6 @@ build:test:
|
|
|
85
85
|
- projects/app/dist/
|
|
86
86
|
expire_in: 5 minutes
|
|
87
87
|
script:
|
|
88
|
-
- git config --global user.email $CI_EMAIL
|
|
89
|
-
- git config --global user.name $CI_NAME
|
|
90
|
-
- git config http.sslVerify "false"
|
|
91
|
-
- git config receive.advertisePushOptions true
|
|
92
|
-
- git fetch
|
|
93
|
-
- git pull https://${CI_USER}:${CI_ACCESS_TOKEN}@gitlab.lenne.tech/products/akademie/master-minds.git test:test
|
|
94
88
|
- npm run init
|
|
95
89
|
- npm run build:test
|
|
96
90
|
only:
|
|
@@ -140,7 +134,7 @@ docker_build_push_test:
|
|
|
140
134
|
before_script:
|
|
141
135
|
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
|
|
142
136
|
script:
|
|
143
|
-
- FILE_NAME=$FILE_NAME_TEST STACK_NAME=$STACK_NAME APP_URL=$APP_URL_TEST IMAGE_TAG=test CI_REGISTRY_IMAGE=$CI_REGISTRY_IMAGE sh build-push.sh
|
|
137
|
+
- FILE_NAME=$FILE_NAME_TEST STACK_NAME=$STACK_NAME APP_URL=$APP_URL_TEST IMAGE_TAG=test CI_REGISTRY_IMAGE=$CI_REGISTRY_IMAGE sh ./scripts/build-push.sh
|
|
144
138
|
only:
|
|
145
139
|
- test
|
|
146
140
|
|
|
@@ -148,11 +142,11 @@ deploy_test:
|
|
|
148
142
|
stage: deploy
|
|
149
143
|
image: tiangolo/docker-with-compose
|
|
150
144
|
tags:
|
|
151
|
-
-
|
|
145
|
+
- <%= props.testRunner %>
|
|
152
146
|
before_script:
|
|
153
147
|
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
|
|
154
148
|
script:
|
|
155
|
-
- FILE_NAME=$FILE_NAME_TEST STACK_NAME=$STACK_NAME APP_URL=$APP_URL_TEST IMAGE_TAG=test CI_REGISTRY_IMAGE=$CI_REGISTRY_IMAGE sh deploy.sh
|
|
149
|
+
- FILE_NAME=$FILE_NAME_TEST STACK_NAME=$STACK_NAME APP_URL=$APP_URL_TEST IMAGE_TAG=test CI_REGISTRY_IMAGE=$CI_REGISTRY_IMAGE sh ./scripts/deploy.sh
|
|
156
150
|
environment:
|
|
157
151
|
name: test
|
|
158
152
|
url: https://$APP_URL_TEST
|
|
@@ -167,7 +161,7 @@ docker_build_push_prod:
|
|
|
167
161
|
before_script:
|
|
168
162
|
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
|
|
169
163
|
script:
|
|
170
|
-
- FILE_NAME=$FILE_NAME_PROD STACK_NAME=$STACK_NAME APP_URL=$APP_URL_PROD IMAGE_TAG=production CI_REGISTRY_IMAGE=$CI_REGISTRY_IMAGE sh build-push.sh
|
|
164
|
+
- FILE_NAME=$FILE_NAME_PROD STACK_NAME=$STACK_NAME APP_URL=$APP_URL_PROD IMAGE_TAG=production CI_REGISTRY_IMAGE=$CI_REGISTRY_IMAGE sh ./scripts/build-push.sh
|
|
171
165
|
only:
|
|
172
166
|
- main
|
|
173
167
|
|
|
@@ -175,11 +169,11 @@ deploy_prod:
|
|
|
175
169
|
stage: deploy
|
|
176
170
|
image: tiangolo/docker-with-compose
|
|
177
171
|
tags:
|
|
178
|
-
-
|
|
172
|
+
- <%= props.prodRunner %>
|
|
179
173
|
before_script:
|
|
180
174
|
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
|
|
181
175
|
script:
|
|
182
|
-
- FILE_NAME=$FILE_NAME_PROD STACK_NAME=$STACK_NAME APP_URL=$APP_URL_PROD IMAGE_TAG=production CI_REGISTRY_IMAGE=$CI_REGISTRY_IMAGE sh deploy.sh
|
|
176
|
+
- FILE_NAME=$FILE_NAME_PROD STACK_NAME=$STACK_NAME APP_URL=$APP_URL_PROD IMAGE_TAG=production CI_REGISTRY_IMAGE=$CI_REGISTRY_IMAGE sh ./scripts/deploy.sh
|
|
183
177
|
environment:
|
|
184
178
|
name: production
|
|
185
179
|
url: https://$APP_URL_PROD
|
|
@@ -4,10 +4,10 @@ RUN mkdir -p /var/www
|
|
|
4
4
|
|
|
5
5
|
RUN apk --no-cache add curl
|
|
6
6
|
|
|
7
|
-
COPY ./projects/app/dist
|
|
7
|
+
COPY ./projects/app/dist ./var/www/dist
|
|
8
8
|
|
|
9
9
|
HEALTHCHECK CMD curl --fail http://localhost:4000/ || exit 1
|
|
10
10
|
|
|
11
|
-
WORKDIR /var/www
|
|
11
|
+
WORKDIR /var/www
|
|
12
12
|
|
|
13
13
|
EXPOSE 4000
|
|
@@ -1,21 +1,18 @@
|
|
|
1
|
+
import { Restricted, RoleEnum } from '@lenne.tech/nest-server';
|
|
1
2
|
import { Field, InputType } from '@nestjs/graphql';
|
|
2
3
|
import { IsOptional } from 'class-validator';
|
|
3
|
-
import { <%= props.namePascal %>Input } from './<%= props.nameKebab %>.input'
|
|
4
|
+
import { <%= props.namePascal %>Input } from './<%= props.nameKebab %>.input';<%- props.imports %>
|
|
5
|
+
|
|
4
6
|
|
|
5
7
|
/**
|
|
6
8
|
* <%= props.namePascal %> create input
|
|
7
9
|
*/
|
|
10
|
+
@Restricted(RoleEnum.ADMIN)
|
|
8
11
|
@InputType({ description: 'Input data to create a new <%= props.namePascal %>' })
|
|
9
12
|
export class <%= props.namePascal %>CreateInput extends <%= props.namePascal %>Input {
|
|
10
13
|
|
|
11
14
|
// ===================================================================================================================
|
|
12
15
|
// Properties
|
|
13
16
|
// ===================================================================================================================
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Description of the properties
|
|
17
|
-
*/
|
|
18
|
-
@Field(() => [String], { description: 'Description of the properties', nullable: true })
|
|
19
|
-
@IsOptional()
|
|
20
|
-
properties?: string[];
|
|
17
|
+
<%- props.props %>
|
|
21
18
|
}
|
|
@@ -1,22 +1,16 @@
|
|
|
1
1
|
import { Restricted, RoleEnum } from '@lenne.tech/nest-server';
|
|
2
2
|
import { Field, InputType } from '@nestjs/graphql';
|
|
3
|
-
import { IsOptional } from 'class-validator'
|
|
3
|
+
import { IsOptional } from 'class-validator';<%- props.imports %>
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* <%= props.namePascal %> input
|
|
7
7
|
*/
|
|
8
|
+
@Restricted(RoleEnum.ADMIN)
|
|
8
9
|
@InputType({ description: 'Input data to update an existing <%= props.namePascal %>' })
|
|
9
10
|
export class <%= props.namePascal %>Input {
|
|
10
11
|
|
|
11
12
|
// ===================================================================================================================
|
|
12
13
|
// Properties
|
|
13
14
|
// ===================================================================================================================
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Description of the properties
|
|
17
|
-
*/
|
|
18
|
-
@Restricted(RoleEnum.ADMIN, RoleEnum.S_CREATOR)
|
|
19
|
-
@Field(() => [String], { description: 'Description of the properties', nullable: true })
|
|
20
|
-
@IsOptional()
|
|
21
|
-
properties?: string[];
|
|
15
|
+
<%- props.props %>
|
|
22
16
|
}
|
|
@@ -3,13 +3,13 @@ import { Field, ObjectType } from '@nestjs/graphql';
|
|
|
3
3
|
import { Prop, Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
|
|
4
4
|
import { Document, Schema } from 'mongoose';
|
|
5
5
|
import { PersistenceModel } from '../../common/models/persistence.model';
|
|
6
|
-
import { User } from '../user/user.model';
|
|
7
6
|
|
|
8
7
|
export type <%= props.namePascal %>Document = <%= props.namePascal %> & Document;
|
|
9
8
|
|
|
10
9
|
/**
|
|
11
10
|
* <%= props.namePascal %> model
|
|
12
11
|
*/
|
|
12
|
+
@Restricted(RoleEnum.ADMIN)
|
|
13
13
|
@ObjectType({ description: '<%= props.namePascal %>' })
|
|
14
14
|
@MongooseSchema({ timestamps: true })
|
|
15
15
|
export class <%= props.namePascal %> extends PersistenceModel {
|
|
@@ -17,24 +17,7 @@ export class <%= props.namePascal %> extends PersistenceModel {
|
|
|
17
17
|
// ===================================================================================================================
|
|
18
18
|
// Properties
|
|
19
19
|
// ===================================================================================================================
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Description of properties
|
|
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;
|
|
20
|
+
<%- props.props %>
|
|
38
21
|
|
|
39
22
|
// ===================================================================================================================
|
|
40
23
|
// Methods
|
|
@@ -45,7 +28,7 @@ export class <%= props.namePascal %> extends PersistenceModel {
|
|
|
45
28
|
*/
|
|
46
29
|
init() {
|
|
47
30
|
super.init();
|
|
48
|
-
this.
|
|
31
|
+
// this.xxx = [];
|
|
49
32
|
return this;
|
|
50
33
|
}
|
|
51
34
|
|
|
@@ -56,7 +39,7 @@ export class <%= props.namePascal %> extends PersistenceModel {
|
|
|
56
39
|
*/
|
|
57
40
|
map(input) {
|
|
58
41
|
super.map(input);
|
|
59
|
-
return
|
|
42
|
+
return <%- props.mappings %>
|
|
60
43
|
}
|
|
61
44
|
}
|
|
62
45
|
|
|
@@ -13,6 +13,7 @@ import { <%= props.namePascal %>Service } from './<%= props.nameKebab %>.service
|
|
|
13
13
|
/**
|
|
14
14
|
* Resolver to process with <%= props.namePascal %> data
|
|
15
15
|
*/
|
|
16
|
+
@Roles(RoleEnum.ADMIN)
|
|
16
17
|
@Resolver(() => <%= props.namePascal %>)
|
|
17
18
|
export class <%= props.namePascal %>Resolver {
|
|
18
19
|
|
|
@@ -35,7 +36,7 @@ export class <%= props.namePascal %>Resolver {
|
|
|
35
36
|
@Query(() => FindAndCount<%= props.namePascal %>sResult, { description: 'Find <%= props.namePascal %>s (via filter)' })
|
|
36
37
|
async findAndCount<%= props.namePascal %>s(@Info() info: GraphQLResolveInfo, @Args() args?: FilterArgs) {
|
|
37
38
|
return await this.<%= props.nameCamel %>Service.findAndCount(args, {
|
|
38
|
-
fieldSelection: { info, select: 'findAndCount<%= props.namePascal %>s' },
|
|
39
|
+
fieldSelection: { info, select: 'findAndCount<%= props.namePascal %>s.items' },
|
|
39
40
|
inputType: FilterArgs,
|
|
40
41
|
});
|
|
41
42
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lenne.tech/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.84",
|
|
4
4
|
"description": "lenne.Tech CLI: lt",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"lenne.Tech",
|
|
@@ -61,13 +61,13 @@
|
|
|
61
61
|
"@lenne.tech/npm-package-helper": "0.0.12",
|
|
62
62
|
"@types/jest": "29.2.2",
|
|
63
63
|
"@types/node": "18.11.9",
|
|
64
|
-
"@typescript-eslint/eslint-plugin": "5.42.
|
|
65
|
-
"@typescript-eslint/parser": "5.42.
|
|
64
|
+
"@typescript-eslint/eslint-plugin": "5.42.1",
|
|
65
|
+
"@typescript-eslint/parser": "5.42.1",
|
|
66
66
|
"cpy-cli": "4.2.0",
|
|
67
67
|
"eslint": "8.27.0",
|
|
68
68
|
"eslint-config-prettier": "8.5.0",
|
|
69
|
-
"husky": "8.0.
|
|
70
|
-
"jest": "29.
|
|
69
|
+
"husky": "8.0.2",
|
|
70
|
+
"jest": "29.3.1",
|
|
71
71
|
"path-exists-cli": "2.0.0",
|
|
72
72
|
"prettier": "2.7.1",
|
|
73
73
|
"pretty-quick": "3.1.3",
|