@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
|
@@ -18,8 +18,9 @@ const NewCommand = {
|
|
|
18
18
|
description: 'Creates a new angular (fullstack) workspace',
|
|
19
19
|
hidden: false,
|
|
20
20
|
run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
|
|
21
|
+
var _a, _b, _c;
|
|
21
22
|
// Retrieve the tools we need
|
|
22
|
-
const { filesystem, git, helper, parameters, print: { error, info, spin, success }, prompt: { confirm }, strings: { kebabCase }, system, } = toolbox;
|
|
23
|
+
const { filesystem, git, helper, parameters, patching, print: { error, info, spin, success }, prompt: { confirm }, strings: { kebabCase }, system, tools, } = toolbox;
|
|
23
24
|
// Start timer
|
|
24
25
|
const timer = system.startTimer();
|
|
25
26
|
// Info
|
|
@@ -44,28 +45,20 @@ const NewCommand = {
|
|
|
44
45
|
error(`There's already a folder named "${projectDir}" here.`);
|
|
45
46
|
return undefined;
|
|
46
47
|
}
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
showError: true,
|
|
62
|
-
});
|
|
63
|
-
if (!gitLink) {
|
|
64
|
-
addToGit = false;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
const workspaceSpinner = spin(`Create ${preset} workspace ${projectDir} with ${name} app`);
|
|
48
|
+
// Localize
|
|
49
|
+
const localize = ((_a = parameters.second) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes('localize')) ||
|
|
50
|
+
(!parameters.second && (yield confirm(`Init localize for Angular?`, true)));
|
|
51
|
+
// Angular Universal
|
|
52
|
+
const angularUniversal = ((_b = parameters.second) === null || _b === void 0 ? void 0 : _b.toLowerCase().includes('universal')) ||
|
|
53
|
+
(!parameters.second && (yield confirm(`Add Angular Universal (SSR)?`, true)));
|
|
54
|
+
// Nest-Server
|
|
55
|
+
const nestServer = ((_c = parameters.second) === null || _c === void 0 ? void 0 : _c.toLowerCase().includes('nest')) ||
|
|
56
|
+
(!parameters.second && (yield confirm(`Add API (Nest-Server)?`, true)));
|
|
57
|
+
const gitLink = (yield helper.getInput(null, {
|
|
58
|
+
name: 'link to an empty repository (e.g. git@gitlab.lenne.tech:group/project.git or leave empty for no linking)',
|
|
59
|
+
showError: false,
|
|
60
|
+
})).trim();
|
|
61
|
+
const workspaceSpinner = spin(`Create workspace ${projectDir} with ${name} app`);
|
|
69
62
|
// Clone monorepo
|
|
70
63
|
yield system.run(`git clone https://github.com/lenneTech/lt-monorepo.git ${projectDir}`);
|
|
71
64
|
// Check for directory
|
|
@@ -73,36 +66,154 @@ const NewCommand = {
|
|
|
73
66
|
error(`The directory "${projectDir}" could not be created.`);
|
|
74
67
|
return undefined;
|
|
75
68
|
}
|
|
76
|
-
workspaceSpinner.succeed(`Create ${preset} workspace ${projectDir} for ${name} created`);
|
|
77
|
-
// Include example app
|
|
78
|
-
const ngBaseSpinner = spin('Integrate example for Angular');
|
|
79
69
|
// Remove git folder after clone
|
|
80
70
|
yield system.run(`cd ${projectDir} && rm -rf .git`);
|
|
71
|
+
// Set project name
|
|
72
|
+
yield filesystem.write(`${projectDir}/lt.json`, JSON.stringify({ name }));
|
|
73
|
+
yield patching.update(`${projectDir}/package.json`, (data) => {
|
|
74
|
+
data.name = kebabCase(name);
|
|
75
|
+
data.version = '0.0.0';
|
|
76
|
+
return data;
|
|
77
|
+
});
|
|
78
|
+
// Install packages
|
|
79
|
+
yield system.run(`cd ${projectDir} && npm i`);
|
|
81
80
|
// Check if git init is active
|
|
82
|
-
|
|
83
|
-
|
|
81
|
+
yield system.run(`cd ${projectDir} && git init --initial-branch=main`);
|
|
82
|
+
if (gitLink) {
|
|
84
83
|
yield system.run(`cd ${projectDir} && git remote add origin ${gitLink}`);
|
|
85
84
|
yield system.run(`cd ${projectDir} && git add .`);
|
|
86
85
|
yield system.run(`cd ${projectDir} && git commit -m "Initial commit"`);
|
|
87
86
|
yield system.run(`cd ${projectDir} && git push -u origin main`);
|
|
88
87
|
}
|
|
89
|
-
|
|
90
|
-
|
|
88
|
+
workspaceSpinner.succeed(`Create workspace ${projectDir} for ${name} created`);
|
|
89
|
+
// Include example app
|
|
90
|
+
const ngBaseSpinner = spin('Integrate example for Angular');
|
|
91
91
|
// Remove gitkeep file
|
|
92
92
|
yield system.run(`cd ${projectDir}/projects && rm .gitkeep`);
|
|
93
|
-
//
|
|
94
|
-
yield system.run(`cd ${projectDir}/projects
|
|
95
|
-
//
|
|
93
|
+
// Clone ng-base-starter
|
|
94
|
+
yield system.run(`cd ${projectDir}/projects && git clone https://github.com/lenneTech/ng-base-starter.git app`);
|
|
95
|
+
// Main version of angular
|
|
96
|
+
let angularVersion = '';
|
|
96
97
|
if (filesystem.isDirectory(`./${projectDir}/projects/app`)) {
|
|
98
|
+
// Get main verion of angular
|
|
99
|
+
yield patching.update(`${projectDir}/projects/app/package.json`, (data) => {
|
|
100
|
+
const version = parseInt(data.dependencies['@angular/core'].split('.')[0]);
|
|
101
|
+
if (version && version > 0) {
|
|
102
|
+
angularVersion = '@' + version;
|
|
103
|
+
}
|
|
104
|
+
return data;
|
|
105
|
+
});
|
|
106
|
+
// Remove git folder after clone
|
|
107
|
+
yield system.run(`cd ${projectDir}/projects/app && rm -rf .git`);
|
|
108
|
+
// Remove husky from app project
|
|
109
|
+
yield system.run(`rm -rf ${projectDir}/projects/app/.husky`);
|
|
110
|
+
yield patching.update(`${projectDir}/projects/app/package.json`, (data) => {
|
|
111
|
+
delete data.scripts.prepare;
|
|
112
|
+
delete data.devDependencies.husky;
|
|
113
|
+
return data;
|
|
114
|
+
});
|
|
115
|
+
if (localize) {
|
|
116
|
+
yield system.run(`cd ${projectDir}/projects/app && ng add @angular/localize --skip-confirmation`);
|
|
117
|
+
}
|
|
118
|
+
// Commit changes
|
|
119
|
+
yield system.run(`cd ${projectDir} && git add . && git commit -am "feat: Angular example integrated"`);
|
|
97
120
|
// Check if git init is active
|
|
98
|
-
if (
|
|
99
|
-
|
|
100
|
-
yield system.run(`cd ${projectDir} && git add . && git commit -am "feat: Angular example integrated" && git push`);
|
|
121
|
+
if (gitLink) {
|
|
122
|
+
`cd ${projectDir} && git push`;
|
|
101
123
|
}
|
|
102
124
|
// Angular example integration done
|
|
103
125
|
ngBaseSpinner.succeed('Example for Angular integrated');
|
|
126
|
+
if (angularUniversal) {
|
|
127
|
+
// Include example app
|
|
128
|
+
const ngUniversalSpinner = spin('Integrate example for Angular');
|
|
129
|
+
yield system.run(`cd ${projectDir}/projects/app && ng add @nguniversal/express-engine${angularVersion} --skip-confirmation`);
|
|
130
|
+
yield system.run(`cd ${projectDir}/projects/app && npm i localstorage-polyfill`);
|
|
131
|
+
yield system.run(`cd ${projectDir}/projects/app && npm i compression`);
|
|
132
|
+
yield system.run(`cd ${projectDir}/projects/app && npm i --save-dev @types/compression`);
|
|
133
|
+
// Add scripts and clean up dependencies
|
|
134
|
+
yield patching.update(`${projectDir}/projects/app/package.json`, (data) => {
|
|
135
|
+
// Add / extend scripts
|
|
136
|
+
data.scripts.build = 'ng build --configuration production && ng run app:server';
|
|
137
|
+
data.scripts['build:test'] = 'ng build --configuration test && ng run app:server';
|
|
138
|
+
// Clean up
|
|
139
|
+
const dependencies = ['dependencies', 'devDependencies'];
|
|
140
|
+
for (const deps of dependencies) {
|
|
141
|
+
for (const dep of Object.keys(data[deps])) {
|
|
142
|
+
data[deps][dep] = data[deps][dep].replace('^', '');
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return data;
|
|
146
|
+
});
|
|
147
|
+
// Set allowSyntheticDefaultImports
|
|
148
|
+
tools.stripAndSaveJsonFile(`${projectDir}/projects/app/tsconfig.json`);
|
|
149
|
+
yield patching.update(`${projectDir}/projects/app/tsconfig.json`, (data) => {
|
|
150
|
+
data.compilerOptions.allowSyntheticDefaultImports = true;
|
|
151
|
+
return data;
|
|
152
|
+
});
|
|
153
|
+
// Pimp server.ts
|
|
154
|
+
let localizeString = '';
|
|
155
|
+
if (localize) {
|
|
156
|
+
localizeString = `\nimport '@angular/localize/init';`;
|
|
157
|
+
}
|
|
158
|
+
const windowAndCo = `
|
|
159
|
+
// ----------------------------------------------
|
|
160
|
+
// window for image lazy loading
|
|
161
|
+
// ----------------------------------------------
|
|
162
|
+
/* eslint-disable */${localizeString}
|
|
163
|
+
import 'reflect-metadata';
|
|
164
|
+
import 'localstorage-polyfill';
|
|
165
|
+
import compression from 'compression';
|
|
166
|
+
import domino from 'domino';
|
|
167
|
+
import { readFileSync } from 'fs';
|
|
168
|
+
const template = readFileSync(join(process.cwd(), 'dist/app/browser/index.html')).toString();
|
|
169
|
+
const win: any = domino.createWindow(template);
|
|
170
|
+
// @ts-ignore
|
|
171
|
+
global['window'] = win;
|
|
172
|
+
global['Node'] = win.Node;
|
|
173
|
+
global['navigator'] = win.navigator;
|
|
174
|
+
global['Event'] = win.Event;
|
|
175
|
+
global['KeyboardEvent'] = win.Event;
|
|
176
|
+
global['MouseEvent'] = win.Event;
|
|
177
|
+
global['Event']['prototype'] = win.Event.prototype;
|
|
178
|
+
global['document'] = win.document;
|
|
179
|
+
global['localStorage'] = localStorage;
|
|
180
|
+
global['WebSocket'] = require('ws');
|
|
181
|
+
/* eslint-enable */
|
|
182
|
+
`;
|
|
183
|
+
yield patching.update(`${projectDir}/projects/app/server.ts`, (str) => {
|
|
184
|
+
const lines = str.split('\n');
|
|
185
|
+
const rest = str.split('\n');
|
|
186
|
+
let back = '';
|
|
187
|
+
for (let i = 0; i < lines.length; i++) {
|
|
188
|
+
// Stop if the line is not empty and does not start with an import
|
|
189
|
+
if (!!lines[i].trim() && !lines[i].trim().startsWith('import')) {
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
back += lines[i] + '\n';
|
|
193
|
+
rest.shift();
|
|
194
|
+
}
|
|
195
|
+
back += windowAndCo + rest.join('\n');
|
|
196
|
+
return back;
|
|
197
|
+
});
|
|
198
|
+
yield patching.replace(`${projectDir}/projects/app/server.ts`, 'const server = express();', `const server = express();\n server.use(compression());`);
|
|
199
|
+
// Commit changes
|
|
200
|
+
yield system.run(`cd ${projectDir} && git add . && git commit -am "feat: Angular Universal integrated"`);
|
|
201
|
+
// Check if git init is active
|
|
202
|
+
if (gitLink) {
|
|
203
|
+
`cd ${projectDir} && git push`;
|
|
204
|
+
}
|
|
205
|
+
// Angular universal integration done
|
|
206
|
+
ngUniversalSpinner.succeed('Angular Universal integrated');
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
yield patching.update(`${projectDir}/projects/app/package.json`, (data) => {
|
|
210
|
+
data.scripts.build = 'ng build --configuration production';
|
|
211
|
+
data.scripts['build:test'] = 'ng build --configuration test';
|
|
212
|
+
return data;
|
|
213
|
+
});
|
|
214
|
+
}
|
|
104
215
|
// Include files from https://github.com/lenneTech/nest-server-starter
|
|
105
|
-
if (
|
|
216
|
+
if (nestServer) {
|
|
106
217
|
// Init
|
|
107
218
|
const serverSpinner = spin(`Integrate Nest Server Starter`);
|
|
108
219
|
// Clone api
|
|
@@ -111,16 +222,24 @@ const NewCommand = {
|
|
|
111
222
|
if (filesystem.isDirectory(`./${projectDir}/projects/api`)) {
|
|
112
223
|
// Remove git folder from clone
|
|
113
224
|
yield system.run(`cd ${projectDir}/projects/api && rm -rf .git`);
|
|
225
|
+
// Remove husky from api project
|
|
226
|
+
yield system.run(`rm -rf ${projectDir}/projects/api/.husky`);
|
|
227
|
+
yield patching.update(`${projectDir}/projects/api/package.json`, (data) => {
|
|
228
|
+
delete data.scripts.prepare;
|
|
229
|
+
delete data.devDependencies.husky;
|
|
230
|
+
return data;
|
|
231
|
+
});
|
|
114
232
|
// Prepare meta.json in api
|
|
115
233
|
filesystem.write(`./${projectDir}/projects/api/src/meta.json`, {
|
|
116
234
|
name: `${name}-api-server`,
|
|
117
235
|
description: `API for ${name} app`,
|
|
118
236
|
version: '0.0.0',
|
|
119
237
|
});
|
|
238
|
+
// Commit changes
|
|
239
|
+
yield system.run(`cd ${projectDir} && git add . && git commit -am "feat: Nest Server Starter integrated"`);
|
|
120
240
|
// Check if git init is active
|
|
121
|
-
if (
|
|
122
|
-
|
|
123
|
-
yield system.run(`cd ${projectDir} && git add . && git commit -am "feat: Nest Server Starter integrated" && git push`);
|
|
241
|
+
if (gitLink) {
|
|
242
|
+
`cd ${projectDir} && git push`;
|
|
124
243
|
}
|
|
125
244
|
// Done
|
|
126
245
|
serverSpinner.succeed('Nest Server Starter integrated');
|
|
@@ -131,11 +250,17 @@ const NewCommand = {
|
|
|
131
250
|
}
|
|
132
251
|
// Install all packages
|
|
133
252
|
const installSpinner = spin('Install all packages');
|
|
134
|
-
yield system.run(`cd ${projectDir} && npm
|
|
135
|
-
|
|
253
|
+
yield system.run(`cd ${projectDir} && npm run init`);
|
|
254
|
+
// Commit changes
|
|
255
|
+
yield system.run(`cd ${projectDir} && git add . && git commit -am "feat: Initialization of workspace done"`);
|
|
256
|
+
// Check if git init is active
|
|
257
|
+
if (gitLink) {
|
|
258
|
+
`cd ${projectDir} && git push`;
|
|
259
|
+
}
|
|
260
|
+
installSpinner.succeed('Successfully installed all packages');
|
|
136
261
|
// We're done, so show what to do next
|
|
137
262
|
info(``);
|
|
138
|
-
success(`Generated
|
|
263
|
+
success(`Generated workspace ${projectDir} with ${name} app in ${helper.msToMinutesAndSeconds(timer())}m.`);
|
|
139
264
|
info(``);
|
|
140
265
|
info(`Next:`);
|
|
141
266
|
info(` Run ${name}`);
|
|
@@ -151,4 +276,4 @@ const NewCommand = {
|
|
|
151
276
|
}),
|
|
152
277
|
};
|
|
153
278
|
exports.default = NewCommand;
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2FuZ3VsYXIvY3JlYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBR0E7O0dBRUc7QUFDSCxNQUFNLFVBQVUsR0FBbUI7SUFDakMsSUFBSSxFQUFFLFFBQVE7SUFDZCxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDWixXQUFXLEVBQUUsNkNBQTZDO0lBQzFELE1BQU0sRUFBRSxLQUFLO0lBQ2IsR0FBRyxFQUFFLENBQU8sT0FBK0IsRUFBRSxFQUFFO1FBQzdDLDZCQUE2QjtRQUM3QixNQUFNLEVBQ0osVUFBVSxFQUNWLEdBQUcsRUFDSCxNQUFNLEVBQ04sVUFBVSxFQUNWLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUNyQyxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFDbkIsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQ3RCLE1BQU0sR0FDUCxHQUFHLE9BQU8sQ0FBQztRQUVaLGNBQWM7UUFDZCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEMsT0FBTztRQUNQLElBQUksQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBRW5ELFlBQVk7UUFDWixJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFO1lBQy9CLE9BQU87U0FDUjtRQUVELDRCQUE0QjtRQUM1QixNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRTtZQUNuRCxJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLFNBQVMsRUFBRSxJQUFJO1NBQ2hCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPO1NBQ1I7UUFFRCx3QkFBd0I7UUFDeEIsTUFBTSxVQUFV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
|
|
279
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2FuZ3VsYXIvY3JlYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBR0E7O0dBRUc7QUFDSCxNQUFNLFVBQVUsR0FBbUI7SUFDakMsSUFBSSxFQUFFLFFBQVE7SUFDZCxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDWixXQUFXLEVBQUUsNkNBQTZDO0lBQzFELE1BQU0sRUFBRSxLQUFLO0lBQ2IsR0FBRyxFQUFFLENBQU8sT0FBK0IsRUFBRSxFQUFFOztRQUM3Qyw2QkFBNkI7UUFDN0IsTUFBTSxFQUNKLFVBQVUsRUFDVixHQUFHLEVBQ0gsTUFBTSxFQUNOLFVBQVUsRUFDVixRQUFRLEVBQ1IsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQ3JDLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUNuQixPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFDdEIsTUFBTSxFQUNOLEtBQUssR0FDTixHQUFHLE9BQU8sQ0FBQztRQUVaLGNBQWM7UUFDZCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEMsT0FBTztRQUNQLElBQUksQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBRW5ELFlBQVk7UUFDWixJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFO1lBQy9CLE9BQU87U0FDUjtRQUVELDRCQUE0QjtRQUM1QixNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRTtZQUNuRCxJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLFNBQVMsRUFBRSxJQUFJO1NBQ2hCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPO1NBQ1I7UUFFRCx3QkFBd0I7UUFDeEIsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRW5DLG9DQUFvQztRQUNwQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ1QsS0FBSyxDQUFDLG1DQUFtQyxVQUFVLFNBQVMsQ0FBQyxDQUFDO1lBQzlELE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBRUQsV0FBVztRQUNYLE1BQU0sUUFBUSxHQUNaLENBQUEsTUFBQSxVQUFVLENBQUMsTUFBTSwwQ0FBRSxXQUFXLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUNyRCxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sT0FBTyxDQUFDLDRCQUE0QixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5RSxvQkFBb0I7UUFDcEIsTUFBTSxnQkFBZ0IsR0FDcEIsQ0FBQSxNQUFBLFVBQVUsQ0FBQyxNQUFNLDBDQUFFLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1lBQ3RELENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxPQUFPLENBQUMsOEJBQThCLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWhGLGNBQWM7UUFDZCxNQUFNLFVBQVUsR0FDZCxDQUFBLE1BQUEsVUFBVSxDQUFDLE1BQU0sMENBQUUsV0FBVyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDakQsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUUsTUFBTSxPQUFPLEdBQUcsQ0FDZCxNQUFNLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO1lBQzFCLElBQUksRUFBRSwwR0FBMEc7WUFDaEgsU0FBUyxFQUFFLEtBQUs7U0FDakIsQ0FBQyxDQUNILENBQUMsSUFBSSxFQUFFLENBQUM7UUFFVCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsVUFBVSxTQUFTLElBQUksTUFBTSxDQUFDLENBQUM7UUFFakYsaUJBQWlCO1FBQ2pCLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQywwREFBMEQsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUV6RixzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxVQUFVLEVBQUUsQ0FBQyxFQUFFO1lBQzlDLEtBQUssQ0FBQyxrQkFBa0IsVUFBVSx5QkFBeUIsQ0FBQyxDQUFDO1lBQzdELE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBRUQsZ0NBQWdDO1FBQ2hDLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLFVBQVUsaUJBQWlCLENBQUMsQ0FBQztRQUVwRCxtQkFBbUI7UUFDbkIsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsVUFBVSxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxRSxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxVQUFVLGVBQWUsRUFBRSxDQUFDLElBQXlCLEVBQUUsRUFBRTtZQUNoRixJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUN2QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBRUgsbUJBQW1CO1FBQ25CLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLFVBQVUsV0FBVyxDQUFDLENBQUM7UUFFOUMsOEJBQThCO1FBQzlCLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLFVBQVUsb0NBQW9DLENBQUMsQ0FBQztRQUN2RSxJQUFJLE9BQU8sRUFBRTtZQUNYLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLFVBQVUsNkJBQTZCLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDekUsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sVUFBVSxlQUFlLENBQUMsQ0FBQztZQUNsRCxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxVQUFVLG9DQUFvQyxDQUFDLENBQUM7WUFDdkUsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sVUFBVSw2QkFBNkIsQ0FBQyxDQUFDO1NBQ2pFO1FBRUQsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLG9CQUFvQixVQUFVLFFBQVEsSUFBSSxVQUFVLENBQUMsQ0FBQztRQUUvRSxzQkFBc0I7UUFDdEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFFNUQsc0JBQXNCO1FBQ3RCLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLFVBQVUsMEJBQTBCLENBQUMsQ0FBQztRQUU3RCx3QkFBd0I7UUFDeEIsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sVUFBVSw2RUFBNkUsQ0FBQyxDQUFDO1FBRWhILDBCQUEwQjtRQUMxQixJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFFeEIsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssVUFBVSxlQUFlLENBQUMsRUFBRTtZQUMxRCw2QkFBNkI7WUFDN0IsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsVUFBVSw0QkFBNEIsRUFBRSxDQUFDLElBQXlCLEVBQUUsRUFBRTtnQkFDN0YsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNFLElBQUksT0FBTyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUU7b0JBQzFCLGNBQWMsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDO2lCQUNoQztnQkFDRCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUMsQ0FBQyxDQUFDO1lBRUgsZ0NBQWdDO1lBQ2hDLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLFVBQVUsOEJBQThCLENBQUMsQ0FBQztZQUVqRSxnQ0FBZ0M7WUFDaEMsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsVUFBVSxzQkFBc0IsQ0FBQyxDQUFDO1lBQzdELE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFVBQVUsNEJBQTRCLEVBQUUsQ0FBQyxJQUF5QixFQUFFLEVBQUU7Z0JBQzdGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7Z0JBQzVCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7Z0JBQ2xDLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLFFBQVEsRUFBRTtnQkFDWixNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxVQUFVLCtEQUErRCxDQUFDLENBQUM7YUFDbkc7WUFFRCxpQkFBaUI7WUFDakIsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sVUFBVSxvRUFBb0UsQ0FBQyxDQUFDO1lBRXZHLDhCQUE4QjtZQUM5QixJQUFJLE9BQU8sRUFBRTtnQkFDWCxNQUFNLFVBQVUsY0FBYyxDQUFDO2FBQ2hDO1lBRUQsbUNBQW1DO1lBQ25DLGFBQWEsQ0FBQyxPQUFPLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztZQUV4RCxJQUFJLGdCQUFnQixFQUFFO2dCQUNwQixzQkFBc0I7Z0JBQ3RCLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUM7Z0JBRWpFLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FDZCxNQUFNLFVBQVUsc0RBQXNELGNBQWMsc0JBQXNCLENBQzNHLENBQUM7Z0JBQ0YsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sVUFBVSw4Q0FBOEMsQ0FBQyxDQUFDO2dCQUNqRixNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxVQUFVLG9DQUFvQyxDQUFDLENBQUM7Z0JBQ3ZFLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLFVBQVUsc0RBQXNELENBQUMsQ0FBQztnQkFFekYsd0NBQXdDO2dCQUN4QyxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxVQUFVLDRCQUE0QixFQUFFLENBQUMsSUFBeUIsRUFBRSxFQUFFO29CQUM3Rix1QkFBdUI7b0JBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLDBEQUEwRCxDQUFDO29CQUNoRixJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLG9EQUFvRCxDQUFDO29CQUVsRixXQUFXO29CQUNYLE1BQU0sWUFBWSxHQUFHLENBQUMsY0FBYyxFQUFFLGlCQUFpQixDQUFDLENBQUM7b0JBQ3pELEtBQUssTUFBTSxJQUFJLElBQUksWUFBWSxFQUFFO3dCQUMvQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7NEJBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQzt5QkFDcEQ7cUJBQ0Y7b0JBRUQsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsbUNBQW1DO2dCQUNuQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsR0FBRyxVQUFVLDZCQUE2QixDQUFDLENBQUM7Z0JBQ3ZFLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFVBQVUsNkJBQTZCLEVBQUUsQ0FBQyxJQUF5QixFQUFFLEVBQUU7b0JBQzlGLElBQUksQ0FBQyxlQUFlLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDO29CQUN6RCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDLENBQUMsQ0FBQztnQkFFSCxpQkFBaUI7Z0JBQ2pCLElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxRQUFRLEVBQUU7b0JBQ1osY0FBYyxHQUFHLG9DQUFvQyxDQUFDO2lCQUN2RDtnQkFDRCxNQUFNLFdBQVcsR0FBRzs7OztzQkFJTixjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztTQW9CM0IsQ0FBQztnQkFDRixNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxVQUFVLHlCQUF5QixFQUFFLENBQUMsR0FBVyxFQUFFLEVBQUU7b0JBQzVFLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzlCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzdCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztvQkFDZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDckMsa0VBQWtFO3dCQUNsRSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFOzRCQUM5RCxNQUFNO3lCQUNQO3dCQUNELElBQUksSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO3dCQUN4QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7cUJBQ2Q7b0JBQ0QsSUFBSSxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN0QyxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDLENBQUMsQ0FBQztnQkFDSCxNQUFNLFFBQVEsQ0FBQyxPQUFPLENBQ3BCLEdBQUcsVUFBVSx5QkFBeUIsRUFDdEMsMkJBQTJCLEVBQzNCLHlEQUF5RCxDQUMxRCxDQUFDO2dCQUVGLGlCQUFpQjtnQkFDakIsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sVUFBVSxzRUFBc0UsQ0FBQyxDQUFDO2dCQUV6Ryw4QkFBOEI7Z0JBQzlCLElBQUksT0FBTyxFQUFFO29CQUNYLE1BQU0sVUFBVSxjQUFjLENBQUM7aUJBQ2hDO2dCQUVELHFDQUFxQztnQkFDckMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLDhCQUE4QixDQUFDLENBQUM7YUFDNUQ7aUJBQU07Z0JBQ0wsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsVUFBVSw0QkFBNEIsRUFBRSxDQUFDLElBQXlCLEVBQUUsRUFBRTtvQkFDN0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcscUNBQXFDLENBQUM7b0JBQzNELElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsK0JBQStCLENBQUM7b0JBQzdELE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxzRUFBc0U7WUFDdEUsSUFBSSxVQUFVLEVBQUU7Z0JBQ2QsT0FBTztnQkFDUCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsK0JBQStCLENBQUMsQ0FBQztnQkFFNUQsWUFBWTtnQkFDWixNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxVQUFVLDZFQUE2RSxDQUFDLENBQUM7Z0JBRWhILGtCQUFrQjtnQkFDbEIsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssVUFBVSxlQUFlLENBQUMsRUFBRTtvQkFDMUQsK0JBQStCO29CQUMvQixNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxVQUFVLDhCQUE4QixDQUFDLENBQUM7b0JBRWpFLGdDQUFnQztvQkFDaEMsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsVUFBVSxzQkFBc0IsQ0FBQyxDQUFDO29CQUM3RCxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxVQUFVLDRCQUE0QixFQUFFLENBQUMsSUFBeUIsRUFBRSxFQUFFO3dCQUM3RixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO3dCQUM1QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO3dCQUNsQyxPQUFPLElBQUksQ0FBQztvQkFDZCxDQUFDLENBQUMsQ0FBQztvQkFFSCwyQkFBMkI7b0JBQzNCLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxVQUFVLDZCQUE2QixFQUFFO3dCQUM3RCxJQUFJLEVBQUUsR0FBRyxJQUFJLGFBQWE7d0JBQzFCLFdBQVcsRUFBRSxXQUFXLElBQUksTUFBTTt3QkFDbEMsT0FBTyxFQUFFLE9BQU87cUJBQ2pCLENBQUMsQ0FBQztvQkFFSCxpQkFBaUI7b0JBQ2pCLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLFVBQVUsd0VBQXdFLENBQUMsQ0FBQztvQkFFM0csOEJBQThCO29CQUM5QixJQUFJLE9BQU8sRUFBRTt3QkFDWCxNQUFNLFVBQVUsY0FBYyxDQUFDO3FCQUNoQztvQkFFRCxPQUFPO29CQUNQLGFBQWEsQ0FBQyxPQUFPLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztpQkFDekQ7cUJBQU07b0JBQ0wsYUFBYSxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO2lCQUMxRDthQUNGO1lBRUQsdUJBQXVCO1lBQ3ZCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLFVBQVUsa0JBQWtCLENBQUMsQ0FBQztZQUVyRCxpQkFBaUI7WUFDakIsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sVUFBVSwwRUFBMEUsQ0FBQyxDQUFDO1lBRTdHLDhCQUE4QjtZQUM5QixJQUFJLE9BQU8sRUFBRTtnQkFDWCxNQUFNLFVBQVUsY0FBYyxDQUFDO2FBQ2hDO1lBRUQsY0FBYyxDQUFDLE9BQU8sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1lBRTlELHNDQUFzQztZQUN0QyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDVCxPQUFPLENBQUMsdUJBQXVCLFVBQVUsU0FBUyxJQUFJLFdBQVcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNULElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLFVBQVUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFVCxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFO2dCQUMvQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDaEI7WUFFRCxZQUFZO1lBQ1osT0FBTyxpQkFBaUIsVUFBVSxTQUFTLElBQUksRUFBRSxDQUFDO1NBQ25EO0lBQ0gsQ0FBQyxDQUFBO0NBQ0YsQ0FBQztBQUVGLGtCQUFlLFVBQVUsQ0FBQyJ9
|
|
@@ -20,27 +20,63 @@ const NewCommand = {
|
|
|
20
20
|
hidden: false,
|
|
21
21
|
run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
|
|
22
22
|
// Retrieve the tools we need
|
|
23
|
-
const { filesystem, helper, parameters, print: { info, spin, success }, strings: { kebabCase, pascalCase, camelCase }, prompt: { confirm }, system, template, } = toolbox;
|
|
23
|
+
const { filesystem, helper, parameters, patching, print: { info, spin, success }, strings: { kebabCase, pascalCase, camelCase }, prompt: { confirm }, system, template, } = toolbox;
|
|
24
24
|
// Start timer
|
|
25
25
|
const timer = system.startTimer();
|
|
26
26
|
// Info
|
|
27
27
|
info('Create a new deployment');
|
|
28
|
+
// Get default project name
|
|
29
|
+
let projectName = '';
|
|
30
|
+
const config = yield filesystem.exists('lt.json');
|
|
31
|
+
if (config) {
|
|
32
|
+
yield patching.update(`lt.json`, (data) => {
|
|
33
|
+
projectName = data.name;
|
|
34
|
+
return data;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
if (!projectName) {
|
|
38
|
+
yield patching.update(`package.json`, (data) => {
|
|
39
|
+
projectName = pascalCase(data.name);
|
|
40
|
+
return data;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
28
43
|
// Get name
|
|
29
44
|
const name = yield helper.getInput(parameters.first, {
|
|
30
|
-
|
|
45
|
+
initial: projectName,
|
|
46
|
+
name: 'project name (e.g. ' + (projectName ? projectName : 'My new project') + ')',
|
|
31
47
|
});
|
|
32
48
|
if (!name) {
|
|
33
49
|
return;
|
|
34
50
|
}
|
|
35
|
-
// Get
|
|
36
|
-
const
|
|
37
|
-
|
|
51
|
+
// Get domain
|
|
52
|
+
const domain = yield helper.getInput(parameters.second, {
|
|
53
|
+
initial: kebabCase(name) + '.lenne.tech',
|
|
54
|
+
name: 'main domain of the project (e.g. ' + kebabCase(name) + '.lenne.tech)',
|
|
38
55
|
});
|
|
39
56
|
if (!name) {
|
|
40
57
|
return;
|
|
41
58
|
}
|
|
42
59
|
const gitHub = yield confirm(`Add GitHub pipeline?`);
|
|
43
60
|
const gitLab = yield confirm(`Add GitLab pipeline?`);
|
|
61
|
+
// GitLab test runner
|
|
62
|
+
let testRunner;
|
|
63
|
+
let prodRunner;
|
|
64
|
+
if (gitLab) {
|
|
65
|
+
testRunner = yield helper.getInput('', {
|
|
66
|
+
initial: 'docker-swarm',
|
|
67
|
+
name: 'runner for test (tag in .gitlab-ci.yml, e.g. docker-swarm)',
|
|
68
|
+
});
|
|
69
|
+
if (!testRunner) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
prodRunner = yield helper.getInput('', {
|
|
73
|
+
initial: 'docker-landing',
|
|
74
|
+
name: 'runner for production (tag in .gitlab-ci.yml, e.g. docker-landing)',
|
|
75
|
+
});
|
|
76
|
+
if (!prodRunner) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
44
80
|
// Set up initial props (to pass into templates)
|
|
45
81
|
const nameCamel = camelCase(name);
|
|
46
82
|
const nameKebab = kebabCase(name);
|
|
@@ -87,26 +123,72 @@ const NewCommand = {
|
|
|
87
123
|
yield template.generate({
|
|
88
124
|
template: 'deployment/.github/workflows/pre-release.yml.ejs',
|
|
89
125
|
target: (0, path_1.join)(cwd, '.github', 'workflows', 'pre-release.yml'),
|
|
90
|
-
props: { nameCamel, nameKebab, namePascal, url },
|
|
126
|
+
props: { nameCamel, nameKebab, namePascal, url: domain },
|
|
91
127
|
});
|
|
92
128
|
yield template.generate({
|
|
93
129
|
template: 'deployment/.github/workflows/release.yml.ejs',
|
|
94
130
|
target: (0, path_1.join)(cwd, '.github', 'workflows', 'release.yml'),
|
|
95
|
-
props: { nameCamel, nameKebab, namePascal, url },
|
|
131
|
+
props: { nameCamel, nameKebab, namePascal, url: domain },
|
|
96
132
|
});
|
|
97
133
|
}
|
|
98
134
|
if (gitLab) {
|
|
99
135
|
yield template.generate({
|
|
100
136
|
template: 'deployment/.gitlab-ci.yml.ejs',
|
|
101
137
|
target: (0, path_1.join)(cwd, '.gitlab-ci.yml'),
|
|
102
|
-
props: { nameCamel, nameKebab, namePascal, url },
|
|
138
|
+
props: { nameCamel, nameKebab, namePascal, url: domain, testRunner, prodRunner },
|
|
103
139
|
});
|
|
104
140
|
}
|
|
105
141
|
generateSpinner.succeed('Files generated');
|
|
142
|
+
const environmentsSpinner = spin('Update app environment files');
|
|
143
|
+
const prodEnv = yield filesystem.exists('projects/app/src/environments/environment.prod.ts');
|
|
144
|
+
if (prodEnv) {
|
|
145
|
+
yield patching.patch('projects/app/src/environments/environment.prod.ts', {
|
|
146
|
+
replace: new RegExp('http://127.0.0.1:3000', 'g'),
|
|
147
|
+
insert: 'https://api.' + domain,
|
|
148
|
+
});
|
|
149
|
+
yield patching.patch('projects/app/src/environments/environment.prod.ts', {
|
|
150
|
+
replace: new RegExp('ws://127.0.0.1:3000', 'g'),
|
|
151
|
+
insert: 'wss://api.' + domain,
|
|
152
|
+
});
|
|
153
|
+
yield patching.patch('projects/app/src/environments/environment.prod.ts', {
|
|
154
|
+
replace: new RegExp('http://127.0.0.1:4200', 'g'),
|
|
155
|
+
insert: 'https://' + domain,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
info('Missing projects/app/src/environments/environment.prod.ts');
|
|
160
|
+
}
|
|
161
|
+
const testEnv = yield filesystem.exists('projects/app/src/environments/environment.test.ts');
|
|
162
|
+
if (testEnv) {
|
|
163
|
+
yield patching.patch('projects/app/src/environments/environment.test.ts', {
|
|
164
|
+
replace: new RegExp('http://127.0.0.1:3000', 'g'),
|
|
165
|
+
insert: 'https://api.test.' + domain,
|
|
166
|
+
});
|
|
167
|
+
yield patching.patch('projects/app/src/environments/environment.test.ts', {
|
|
168
|
+
replace: new RegExp('ws://127.0.0.1:3000', 'g'),
|
|
169
|
+
insert: 'wss://api.test.' + domain,
|
|
170
|
+
});
|
|
171
|
+
yield patching.patch('projects/app/src/environments/environment.test.ts', {
|
|
172
|
+
replace: new RegExp('http://127.0.0.1:4200', 'g'),
|
|
173
|
+
insert: 'https://test.' + domain,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
info('Missing projects/app/src/environments/environment.test.ts');
|
|
178
|
+
}
|
|
179
|
+
environmentsSpinner.succeed('App environment files updated');
|
|
106
180
|
// We're done, so show what to do next
|
|
107
181
|
info(``);
|
|
108
182
|
success(`Generated deployment for ${namePascal} in ${helper.msToMinutesAndSeconds(timer())}m.`);
|
|
109
183
|
info(``);
|
|
184
|
+
// Hint for CI/CD
|
|
185
|
+
const subDomains = ['www', 'api', 'test', 'www.test', 'api.test'];
|
|
186
|
+
let urlStr = '\n- ' + domain;
|
|
187
|
+
for (const sub of subDomains) {
|
|
188
|
+
urlStr += '\n- ' + sub + '.' + domain;
|
|
189
|
+
}
|
|
190
|
+
success(`HINT: please initialize following Domains before running the CI/CD pipeline:${urlStr}`);
|
|
191
|
+
info(``);
|
|
110
192
|
if (!toolbox.parameters.options.fromGluegunMenu) {
|
|
111
193
|
process.exit();
|
|
112
194
|
}
|
|
@@ -115,4 +197,4 @@ const NewCommand = {
|
|
|
115
197
|
}),
|
|
116
198
|
};
|
|
117
199
|
exports.default = NewCommand;
|
|
118
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
200
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2RlcGxveW1lbnQvY3JlYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0EsK0JBQTRCO0FBRzVCOztHQUVHO0FBQ0gsTUFBTSxVQUFVLEdBQW1CO0lBQ2pDLElBQUksRUFBRSxRQUFRO0lBQ2QsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ2IsV0FBVyxFQUFFLDhDQUE4QztJQUMzRCxNQUFNLEVBQUUsS0FBSztJQUNiLEdBQUcsRUFBRSxDQUFPLE9BQStCLEVBQUUsRUFBRTtRQUM3Qyw2QkFBNkI7UUFDN0IsTUFBTSxFQUNKLFVBQVUsRUFDVixNQUFNLEVBQ04sVUFBVSxFQUNWLFFBQVEsRUFDUixLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUM5QixPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxFQUM3QyxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFDbkIsTUFBTSxFQUNOLFFBQVEsR0FDVCxHQUFHLE9BQU8sQ0FBQztRQUVaLGNBQWM7UUFDZCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEMsT0FBTztRQUNQLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBRWhDLDJCQUEyQjtRQUMzQixJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDckIsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELElBQUksTUFBTSxFQUFFO1lBQ1YsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQXlCLEVBQUUsRUFBRTtnQkFDN0QsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3hCLE9BQU8sSUFBSSxDQUFDO1lBQ2Qs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
|
|
@@ -20,7 +20,7 @@ const NewCommand = {
|
|
|
20
20
|
hidden: false,
|
|
21
21
|
run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
|
|
22
22
|
// Retrieve the tools we need
|
|
23
|
-
const { filesystem, helper, parameters, patching, print: { error, info, spin, success }, strings: { kebabCase, pascalCase, camelCase }, system, template, } = toolbox;
|
|
23
|
+
const { filesystem, helper, parameters, patching, print: { error, info, spin, success }, prompt: { ask, confirm }, server, strings: { kebabCase, pascalCase, camelCase }, system, template, } = toolbox;
|
|
24
24
|
// Start timer
|
|
25
25
|
const timer = system.startTimer();
|
|
26
26
|
// Info
|
|
@@ -50,18 +50,69 @@ const NewCommand = {
|
|
|
50
50
|
error(`Module directory "${moduleDir}" already exists.`);
|
|
51
51
|
return undefined;
|
|
52
52
|
}
|
|
53
|
+
// Set props
|
|
54
|
+
const props = {};
|
|
55
|
+
const setProps = true;
|
|
56
|
+
let refsSet = false;
|
|
57
|
+
while (setProps) {
|
|
58
|
+
const name = (yield ask({
|
|
59
|
+
type: 'input',
|
|
60
|
+
name: 'input',
|
|
61
|
+
message: `Enter property name (e.g. myProperty) to create new property or leave empty (ENTER)`,
|
|
62
|
+
})).input;
|
|
63
|
+
if (!name.trim()) {
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
let type = (yield ask([
|
|
67
|
+
{
|
|
68
|
+
type: 'select',
|
|
69
|
+
name: 'input',
|
|
70
|
+
message: 'Choose property type',
|
|
71
|
+
choices: ['boolean', 'string', 'number', 'ObjectId / Reference', 'Date', 'Use own'],
|
|
72
|
+
},
|
|
73
|
+
])).input;
|
|
74
|
+
if (type === 'ObjectId / Reference') {
|
|
75
|
+
type = 'ObjectId';
|
|
76
|
+
}
|
|
77
|
+
if (type === 'Use own')
|
|
78
|
+
type = (yield ask({
|
|
79
|
+
type: 'input',
|
|
80
|
+
name: 'input',
|
|
81
|
+
message: `Enter property type (e.g. MyClass or MyClass[])`,
|
|
82
|
+
})).input;
|
|
83
|
+
let reference;
|
|
84
|
+
if (type === 'ObjectId') {
|
|
85
|
+
reference = (yield ask({
|
|
86
|
+
type: 'input',
|
|
87
|
+
name: 'input',
|
|
88
|
+
initial: pascalCase(name),
|
|
89
|
+
message: `Enter reference for ObjectId`,
|
|
90
|
+
})).input;
|
|
91
|
+
if (reference) {
|
|
92
|
+
refsSet = true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const arrayEnding = type.endsWith('[]');
|
|
96
|
+
type = type.replace('[]', '');
|
|
97
|
+
const isArray = arrayEnding || (yield confirm(`Array?`));
|
|
98
|
+
const nullable = yield confirm(`Nullable?`, true);
|
|
99
|
+
props[name] = { name, nullable, isArray, type, reference };
|
|
100
|
+
}
|
|
53
101
|
const generateSpinner = spin('Generate files');
|
|
102
|
+
const inputTemplate = server.propsForInput(props, { modelName: name, nullable: true });
|
|
103
|
+
const createTemplate = server.propsForInput(props, { modelName: name, nullable: false });
|
|
104
|
+
const modelTemplate = server.propsForModel(props, { modelName: name });
|
|
54
105
|
// nest-server-module/inputs/xxx.input.ts
|
|
55
106
|
yield template.generate({
|
|
56
107
|
template: 'nest-server-module/inputs/template.input.ts.ejs',
|
|
57
108
|
target: (0, path_1.join)(moduleDir, 'inputs', nameKebab + '.input.ts'),
|
|
58
|
-
props: { nameCamel, nameKebab, namePascal },
|
|
109
|
+
props: { nameCamel, nameKebab, namePascal, props: inputTemplate.props, imports: inputTemplate.imports },
|
|
59
110
|
});
|
|
60
111
|
// nest-server-module/inputs/xxx-create.input.ts
|
|
61
112
|
yield template.generate({
|
|
62
113
|
template: 'nest-server-module/inputs/template-create.input.ts.ejs',
|
|
63
114
|
target: (0, path_1.join)(moduleDir, 'inputs', nameKebab + '-create.input.ts'),
|
|
64
|
-
props: { nameCamel, nameKebab, namePascal },
|
|
115
|
+
props: { nameCamel, nameKebab, namePascal, props: createTemplate.props, imports: createTemplate.imports },
|
|
65
116
|
});
|
|
66
117
|
// nest-server-module/output/find-and-count-xxxs-result.output.ts
|
|
67
118
|
yield template.generate({
|
|
@@ -73,7 +124,14 @@ const NewCommand = {
|
|
|
73
124
|
yield template.generate({
|
|
74
125
|
template: 'nest-server-module/template.model.ts.ejs',
|
|
75
126
|
target: (0, path_1.join)(moduleDir, nameKebab + '.model.ts'),
|
|
76
|
-
props: {
|
|
127
|
+
props: {
|
|
128
|
+
nameCamel,
|
|
129
|
+
nameKebab,
|
|
130
|
+
namePascal,
|
|
131
|
+
props: modelTemplate.props,
|
|
132
|
+
imports: modelTemplate.imports,
|
|
133
|
+
mappings: modelTemplate.mappings,
|
|
134
|
+
},
|
|
77
135
|
});
|
|
78
136
|
// nest-server-module/xxx.module.ts
|
|
79
137
|
yield template.generate({
|
|
@@ -128,6 +186,10 @@ const NewCommand = {
|
|
|
128
186
|
info(``);
|
|
129
187
|
success(`Generated ${namePascal}Module in ${helper.msToMinutesAndSeconds(timer())}m.`);
|
|
130
188
|
info(``);
|
|
189
|
+
// We're done, so show what to do next
|
|
190
|
+
if (refsSet) {
|
|
191
|
+
success(`HINT: References have been added, so it is necessary to add the corresponding imports!`);
|
|
192
|
+
}
|
|
131
193
|
if (!toolbox.parameters.options.fromGluegunMenu) {
|
|
132
194
|
process.exit();
|
|
133
195
|
}
|
|
@@ -136,4 +198,4 @@ const NewCommand = {
|
|
|
136
198
|
}),
|
|
137
199
|
};
|
|
138
200
|
exports.default = NewCommand;
|
|
139
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
201
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3NlcnZlci9tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFDQSwrQkFBNEI7QUFJNUI7O0dBRUc7QUFDSCxNQUFNLFVBQVUsR0FBbUI7SUFDakMsSUFBSSxFQUFFLFFBQVE7SUFDZCxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDWixXQUFXLEVBQUUsNkJBQTZCO0lBQzFDLE1BQU0sRUFBRSxLQUFLO0lBQ2IsR0FBRyxFQUFFLENBQU8sT0FBK0IsRUFBRSxFQUFFO1FBQzdDLDZCQUE2QjtRQUM3QixNQUFNLEVBQ0osVUFBVSxFQUNWLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxFQUNSLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUNyQyxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQ3hCLE1BQU0sRUFDTixPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxFQUM3QyxNQUFNLEVBQ04sUUFBUSxHQUNULEdBQUcsT0FBTyxDQUFDO1FBRVosY0FBYztRQUNkLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQyxPQUFPO1FBQ1AsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFFbkMsV0FBVztRQUNYLE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFO1lBQ25ELElBQUksRUFBRSxhQUFhO1NBQ3BCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPO1NBQ1I7UUFFRCxnREFBZ0Q7UUFDaEQsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sU0FB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
|