@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.
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXh0ZW5zaW9ucy90b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQkFBaUQ7QUFHakQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQzlDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUU1QyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUN4QyxNQUFNLG1CQUFtQixHQUFHLENBQUMsTUFBTSxFQUFFLEtBQU0sRUFBRSxHQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFFbkcsTUFBTSxTQUFTLEdBQUcsQ0FBQyxVQUFVLEVBQUUsYUFBYSxFQUFFLEVBQUU7SUFDOUMsSUFBSSxLQUFLLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQztJQUM5QixJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFFdkIsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2pDLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDWCxjQUFjLElBQUksQ0FBQyxDQUFDO0tBQ3JCO0lBRUQsT0FBTyxPQUFPLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLENBQUMsQ0FBQztBQUVGLE1BQWEsS0FBSztJQUNoQjs7T0FFRztJQUNILFlBQXNCLE9BQStCO1FBQS9CLFlBQU8sR0FBUCxPQUFPLENBQXdCO0lBQUcsQ0FBQztJQUV6RDs7T0FFRztJQUNILG9CQUFvQixDQUFDLElBQVk7UUFDL0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUEsaUJBQVksRUFBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNuRSxJQUFBLGtCQUFhLEVBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsRUFBRSxVQUFVLEdBQUcsSUFBSSxFQUFFLGNBQWMsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFO1FBQzlFLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxFQUFFO1lBQ2xDLE1BQU0sSUFBSSxTQUFTLENBQUMsOERBQThELE9BQU8sVUFBVSxJQUFJLENBQUMsQ0FBQztTQUMxRztRQUVELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDO1FBRXhFLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLGVBQWUsR0FBcUIsS0FBSyxDQUFDO1FBQzlDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFcEIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDdEQsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztZQUU1QyxJQUFJLENBQUMsZUFBZSxJQUFJLGdCQUFnQixLQUFLLEdBQUcsRUFBRTtnQkFDaEQsdUJBQXVCO2dCQUN2QixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUNaLGNBQWMsR0FBRyxDQUFDLGNBQWMsQ0FBQztpQkFDbEM7YUFDRjtZQUVELElBQUksY0FBYyxFQUFFO2dCQUNsQixTQUFTO2FBQ1Y7WUFFRCxJQUFJLENBQUMsZUFBZSxJQUFJLGdCQUFnQixHQUFHLGFBQWEsS0FBSyxJQUFJLEVBQUU7Z0JBQ2pFLDRCQUE0QjtnQkFDNUIsTUFBTSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMxQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2dCQUNmLGVBQWUsR0FBRyxhQUFhLENBQUM7Z0JBQ2hDLEtBQUssRUFBRSxDQUFDO2FBQ1Q7aUJBQU0sSUFBSSxlQUFlLEtBQUssYUFBYSxJQUFJLGdCQUFnQixHQUFHLGFBQWEsS0FBSyxNQUFNLEVBQUU7Z0JBQzNGLG9DQUFvQztnQkFDcEMsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsZUFBZSxHQUFHLEtBQUssQ0FBQztnQkFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMzQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2dCQUNmLFNBQVM7YUFDVjtpQkFBTSxJQUFJLGVBQWUsS0FBSyxhQUFhLElBQUksZ0JBQWdCLEtBQUssSUFBSSxFQUFFO2dCQUN6RSxrQ0FBa0M7Z0JBQ2xDLGVBQWUsR0FBRyxLQUFLLENBQUM7Z0JBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDM0MsTUFBTSxHQUFHLEtBQUssQ0FBQzthQUNoQjtpQkFBTSxJQUFJLENBQUMsZUFBZSxJQUFJLGdCQUFnQixHQUFHLGFBQWEsS0FBSyxJQUFJLEVBQUU7Z0JBQ3hFLDBCQUEwQjtnQkFDMUIsTUFBTSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMxQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2dCQUNmLGVBQWUsR0FBRyxZQUFZLENBQUM7Z0JBQy9CLEtBQUssRUFBRSxDQUFDO2dCQUNSLFNBQVM7YUFDVjtpQkFBTSxJQUFJLGVBQWUsS0FBSyxZQUFZLElBQUksZ0JBQWdCLEdBQUcsYUFBYSxLQUFLLElBQUksRUFBRTtnQkFDeEYseUJBQXlCO2dCQUN6QixLQUFLLEVBQUUsQ0FBQztnQkFDUixlQUFlLEdBQUcsS0FBSyxDQUFDO2dCQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxNQUFNLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDbkIsU0FBUzthQUNWO2lCQUFNLElBQUksY0FBYyxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUM3QyxJQUFJLFVBQVUsS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDckIsSUFBSSxnQkFBZ0IsS0FBSyxHQUFHLElBQUksZ0JBQWdCLEtBQUssR0FBRyxFQUFFO3dCQUN4RCx1QkFBdUI7d0JBQ3ZCLE1BQU0sSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDMUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ2hELE1BQU0sR0FBRyxFQUFFLENBQUM7d0JBQ1osTUFBTSxHQUFHLEtBQUssQ0FBQzt3QkFDZixVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7cUJBQ2pCO3lCQUFNLElBQ0wsZ0JBQWdCLEtBQUssR0FBRzt3QkFDeEIsZ0JBQWdCLEtBQUssSUFBSTt3QkFDekIsZ0JBQWdCLEtBQUssSUFBSTt3QkFDekIsZ0JBQWdCLEtBQUssSUFBSSxFQUN6Qjt3QkFDQSw4REFBOEQ7d0JBQzlELE1BQU0sSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDMUMsTUFBTSxHQUFHLEtBQUssQ0FBQzt3QkFDZixVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7cUJBQ2pCO2lCQUNGO3FCQUFNLElBQUksZ0JBQWdCLEtBQUssR0FBRyxFQUFFO29CQUNuQyw2REFBNkQ7b0JBQzdELE1BQU0sSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ25ELE1BQU0sR0FBRyxFQUFFLENBQUM7b0JBQ1osTUFBTSxHQUFHLEtBQUssQ0FBQztvQkFDZixVQUFVLEdBQUcsS0FBSyxDQUFDO2lCQUNwQjthQUNGO1NBQ0Y7UUFFRCxPQUFPLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUMxRyxDQUFDO0NBQ0Y7QUFqSEQsc0JBaUhDO0FBRUQ7O0dBRUc7QUFDSCxrQkFBZSxDQUFDLE9BQStCLEVBQUUsRUFBRTtJQUNqRCxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3JDLENBQUMsQ0FBQyJ9
@@ -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
- - docker-swarm
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
- - docker-live
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/app ./var/www
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/server
11
+ WORKDIR /var/www
12
12
 
13
13
  EXPOSE 4000
@@ -96,4 +96,4 @@ services:
96
96
 
97
97
  command:
98
98
  - |
99
- NODE_ENV=develop node main.js
99
+ NODE_ENV=develop node dist/app/server/main.js
@@ -89,4 +89,4 @@ services:
89
89
  - traefik.http.routers.${STACK_NAME?Variable not set}-${IMAGE_TAG}-app-https.middlewares=${STACK_NAME?Variable not set}-${IMAGE_TAG}-redirect
90
90
  command:
91
91
  - |
92
- NODE_ENV="production" node main.js
92
+ NODE_ENV=production node dist/app/server/main.js
@@ -95,4 +95,4 @@ services:
95
95
  - traefik.http.routers.${STACK_NAME?Variable not set}-${IMAGE_TAG}-app-https.middlewares=${STACK_NAME?Variable not set}-${IMAGE_TAG}-redirect
96
96
  command:
97
97
  - |
98
- NODE_ENV=test node main.js
98
+ NODE_ENV=test node dist/app/server/main.js
@@ -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.properties = [];
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 mapClasses(input, {user: User}, this);
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.80",
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.0",
65
- "@typescript-eslint/parser": "5.42.0",
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.1",
70
- "jest": "29.2.2",
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",