@lenne.tech/cli 0.0.125 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/lt +145 -14
- package/build/commands/claude/install-commands.js +332 -0
- package/build/commands/claude/install-skills.js +626 -0
- package/build/commands/config/config.js +25 -0
- package/build/commands/config/help.js +167 -0
- package/build/commands/config/init.js +143 -0
- package/build/commands/config/show.js +68 -0
- package/build/commands/server/add-property.js +163 -46
- package/build/commands/server/create.js +66 -4
- package/build/commands/server/module.js +133 -20
- package/build/commands/server/object.js +23 -15
- package/build/extensions/config.js +157 -0
- package/build/extensions/server.js +194 -63
- package/build/interfaces/lt-config.interface.js +3 -0
- package/build/templates/claude-commands/code-cleanup.md +82 -0
- package/build/templates/claude-commands/mr-description-clipboard.md +48 -0
- package/build/templates/claude-commands/mr-description.md +33 -0
- package/build/templates/claude-commands/sec-review.md +62 -0
- package/build/templates/claude-commands/skill-optimize.md +140 -0
- package/build/templates/claude-commands/test-generate.md +45 -0
- package/build/templates/claude-skills/lt-cli/SKILL.md +190 -259
- package/build/templates/claude-skills/lt-cli/examples.md +433 -203
- package/build/templates/claude-skills/lt-cli/reference.md +400 -226
- package/build/templates/claude-skills/nest-server-generator/SKILL.md +1891 -0
- package/build/templates/claude-skills/nest-server-generator/configuration.md +279 -0
- package/build/templates/claude-skills/nest-server-generator/declare-keyword-warning.md +124 -0
- package/build/templates/claude-skills/nest-server-generator/description-management.md +217 -0
- package/build/templates/claude-skills/nest-server-generator/examples.md +886 -0
- package/build/templates/claude-skills/nest-server-generator/quality-review.md +855 -0
- package/build/templates/claude-skills/nest-server-generator/reference.md +471 -0
- package/build/templates/claude-skills/nest-server-generator/security-rules.md +358 -0
- package/build/templates/claude-skills/story-tdd/SKILL.md +1173 -0
- package/build/templates/claude-skills/story-tdd/code-quality.md +266 -0
- package/build/templates/claude-skills/story-tdd/database-indexes.md +173 -0
- package/build/templates/claude-skills/story-tdd/examples.md +1332 -0
- package/build/templates/claude-skills/story-tdd/reference.md +1180 -0
- package/build/templates/claude-skills/story-tdd/security-review.md +299 -0
- package/build/templates/nest-server-module/inputs/template-create.input.ts.ejs +1 -3
- package/build/templates/nest-server-module/inputs/template.input.ts.ejs +1 -1
- package/build/templates/nest-server-module/template.controller.ts.ejs +24 -13
- package/build/templates/nest-server-module/template.model.ts.ejs +2 -2
- package/build/templates/nest-server-module/template.module.ts.ejs +4 -0
- package/build/templates/nest-server-module/template.service.ts.ejs +6 -6
- package/build/templates/nest-server-object/template.object.ts.ejs +2 -2
- package/package.json +13 -11
- package/build/commands/claude/install-skill.js +0 -93
|
@@ -11,20 +11,73 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
const path_1 = require("path");
|
|
13
13
|
const object_1 = require("./object");
|
|
14
|
+
/**
|
|
15
|
+
* Detect controller type based on existing modules
|
|
16
|
+
* Analyzes project modules (excluding base modules) to determine common pattern
|
|
17
|
+
*/
|
|
18
|
+
function detectControllerType(filesystem, path) {
|
|
19
|
+
const modulesDir = (0, path_1.join)(path, 'src', 'server', 'modules');
|
|
20
|
+
// Check if modules directory exists
|
|
21
|
+
if (!filesystem.exists(modulesDir)) {
|
|
22
|
+
return 'Both'; // Default if no modules exist yet
|
|
23
|
+
}
|
|
24
|
+
// Base modules to exclude from analysis
|
|
25
|
+
const excludeModules = ['auth', 'file', 'meta', 'user'];
|
|
26
|
+
// Get all module directories
|
|
27
|
+
const allModules = filesystem.list(modulesDir) || [];
|
|
28
|
+
const modulesToAnalyze = allModules.filter((module) => !excludeModules.includes(module) && filesystem.isDirectory((0, path_1.join)(modulesDir, module)));
|
|
29
|
+
// If no modules to analyze, use default
|
|
30
|
+
if (modulesToAnalyze.length === 0) {
|
|
31
|
+
return 'Both';
|
|
32
|
+
}
|
|
33
|
+
// Count patterns
|
|
34
|
+
let onlyController = 0;
|
|
35
|
+
let onlyResolver = 0;
|
|
36
|
+
let both = 0;
|
|
37
|
+
for (const module of modulesToAnalyze) {
|
|
38
|
+
const moduleDir = (0, path_1.join)(modulesDir, module);
|
|
39
|
+
const hasController = filesystem.exists((0, path_1.join)(moduleDir, `${module}.controller.ts`));
|
|
40
|
+
const hasResolver = filesystem.exists((0, path_1.join)(moduleDir, `${module}.resolver.ts`));
|
|
41
|
+
if (hasController && hasResolver) {
|
|
42
|
+
both++;
|
|
43
|
+
}
|
|
44
|
+
else if (hasController && !hasResolver) {
|
|
45
|
+
onlyController++;
|
|
46
|
+
}
|
|
47
|
+
else if (!hasController && hasResolver) {
|
|
48
|
+
onlyResolver++;
|
|
49
|
+
}
|
|
50
|
+
// If neither exists, skip (incomplete module)
|
|
51
|
+
}
|
|
52
|
+
// Decision logic
|
|
53
|
+
// If we have clear majority pattern, use it
|
|
54
|
+
if (both > 0) {
|
|
55
|
+
return 'Both'; // If any module uses both, prefer both
|
|
56
|
+
}
|
|
57
|
+
else if (onlyController > 0 && onlyResolver === 0) {
|
|
58
|
+
return 'Rest'; // Only REST controllers found
|
|
59
|
+
}
|
|
60
|
+
else if (onlyResolver > 0 && onlyController === 0) {
|
|
61
|
+
return 'GraphQL'; // Only GraphQL resolvers found
|
|
62
|
+
}
|
|
63
|
+
// Default to Both if mixed or unclear
|
|
64
|
+
return 'Both';
|
|
65
|
+
}
|
|
14
66
|
/**
|
|
15
67
|
* Create a new server module
|
|
16
68
|
*/
|
|
17
69
|
const NewCommand = {
|
|
18
70
|
alias: ['m'],
|
|
19
|
-
description: 'Creates a new server module. Use --name <ModuleName>, --controller (Rest|GraphQL|Both), and property flags --prop-name-X, --prop-type-X, etc. for non-interactive mode.',
|
|
71
|
+
description: 'Creates a new server module. Use --name <ModuleName>, --controller (Rest|GraphQL|Both|auto), and property flags --prop-name-X, --prop-type-X, etc. for non-interactive mode. Use "auto" to auto-detect controller type from existing modules.',
|
|
20
72
|
hidden: false,
|
|
21
73
|
name: 'module',
|
|
22
74
|
run: (toolbox, options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
75
|
+
var _a, _b, _c, _d, _e, _f;
|
|
23
76
|
// Options:
|
|
24
77
|
const { currentItem, preventExitProcess } = Object.assign({ currentItem: '', preventExitProcess: false }, options);
|
|
25
78
|
let { objectsToAdd = [], referencesToAdd = [] } = options || {};
|
|
26
79
|
// Retrieve the tools we need
|
|
27
|
-
const { filesystem, helper, parameters, patching, print: { divider, error, info, spin, success }, prompt: { ask, confirm }, server, strings: { camelCase, kebabCase, pascalCase }, system, template, } = toolbox;
|
|
80
|
+
const { config, filesystem, helper, parameters, patching, print: { divider, error, info, spin, success }, prompt: { ask, confirm }, server, strings: { camelCase, kebabCase, pascalCase }, system, template, } = toolbox;
|
|
28
81
|
// Start timer
|
|
29
82
|
const timer = system.startTimer();
|
|
30
83
|
// Info
|
|
@@ -34,6 +87,10 @@ const NewCommand = {
|
|
|
34
87
|
else {
|
|
35
88
|
info('Create a new server module');
|
|
36
89
|
}
|
|
90
|
+
// Load configuration
|
|
91
|
+
const ltConfig = config.loadConfig();
|
|
92
|
+
const configController = (_c = (_b = (_a = ltConfig === null || ltConfig === void 0 ? void 0 : ltConfig.commands) === null || _a === void 0 ? void 0 : _a.server) === null || _b === void 0 ? void 0 : _b.module) === null || _c === void 0 ? void 0 : _c.controller;
|
|
93
|
+
const configSkipLint = (_f = (_e = (_d = ltConfig === null || ltConfig === void 0 ? void 0 : ltConfig.commands) === null || _d === void 0 ? void 0 : _d.server) === null || _e === void 0 ? void 0 : _e.module) === null || _f === void 0 ? void 0 : _f.skipLint;
|
|
37
94
|
// Parse CLI arguments
|
|
38
95
|
const { controller: cliController, name: cliName, skipLint: cliSkipLint } = parameters.options;
|
|
39
96
|
let name = cliName || currentItem || parameters.first;
|
|
@@ -46,16 +103,6 @@ const NewCommand = {
|
|
|
46
103
|
if (!name) {
|
|
47
104
|
return;
|
|
48
105
|
}
|
|
49
|
-
const controller = cliController || (yield ask({
|
|
50
|
-
choices: ['Rest', 'GraphQL', 'Both'],
|
|
51
|
-
message: 'What controller type?',
|
|
52
|
-
name: 'controller',
|
|
53
|
-
type: 'select',
|
|
54
|
-
})).controller;
|
|
55
|
-
// Set up initial props (to pass into templates)
|
|
56
|
-
const nameCamel = camelCase(name);
|
|
57
|
-
const nameKebab = kebabCase(name);
|
|
58
|
-
const namePascal = pascalCase(name);
|
|
59
106
|
// Check if directory
|
|
60
107
|
const cwd = filesystem.cwd();
|
|
61
108
|
const path = cwd.substr(0, cwd.lastIndexOf('src'));
|
|
@@ -64,6 +111,52 @@ const NewCommand = {
|
|
|
64
111
|
error(`No src directory in "${path}".`);
|
|
65
112
|
return undefined;
|
|
66
113
|
}
|
|
114
|
+
// Determine controller type with priority: CLI > config > auto-detect > interactive
|
|
115
|
+
let controller;
|
|
116
|
+
const detected = detectControllerType(filesystem, path);
|
|
117
|
+
// Priority 1: CLI parameter
|
|
118
|
+
if (cliController) {
|
|
119
|
+
if (cliController.toLowerCase() === 'auto') {
|
|
120
|
+
// Auto-detect without interactive prompt
|
|
121
|
+
info(`Auto-detected controller pattern: ${detected} (based on existing modules)`);
|
|
122
|
+
controller = detected;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// Explicit controller type provided via CLI
|
|
126
|
+
controller = cliController;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Priority 2: Config file
|
|
130
|
+
else if (configController) {
|
|
131
|
+
if (configController.toLowerCase() === 'auto') {
|
|
132
|
+
// Auto-detect from config
|
|
133
|
+
info(`Auto-detected controller pattern: ${detected} (based on existing modules, configured via lt.config.json)`);
|
|
134
|
+
controller = detected;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
// Use config value
|
|
138
|
+
info(`Using controller type from lt.config.json: ${configController}`);
|
|
139
|
+
controller = configController;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Priority 3: Interactive mode with auto-detection
|
|
143
|
+
else {
|
|
144
|
+
// Map detected value to index for initial selection
|
|
145
|
+
const choices = ['Rest', 'GraphQL', 'Both'];
|
|
146
|
+
const initialIndex = choices.indexOf(detected);
|
|
147
|
+
info(`Detected controller pattern: ${detected} (based on existing modules)`);
|
|
148
|
+
controller = (yield ask([{
|
|
149
|
+
choices,
|
|
150
|
+
initial: initialIndex >= 0 ? initialIndex : 2, // Default to 'Both' (index 2)
|
|
151
|
+
message: 'What controller type?',
|
|
152
|
+
name: 'controller',
|
|
153
|
+
type: 'select',
|
|
154
|
+
}])).controller || detected;
|
|
155
|
+
}
|
|
156
|
+
// Set up initial props (to pass into templates)
|
|
157
|
+
const nameCamel = camelCase(name);
|
|
158
|
+
const nameKebab = kebabCase(name);
|
|
159
|
+
const namePascal = pascalCase(name);
|
|
67
160
|
const directory = (0, path_1.join)(path, 'src', 'server', 'modules', nameKebab);
|
|
68
161
|
if (filesystem.exists(directory)) {
|
|
69
162
|
info('');
|
|
@@ -74,10 +167,9 @@ const NewCommand = {
|
|
|
74
167
|
objectsToAdd = newObjects;
|
|
75
168
|
referencesToAdd = newReferences;
|
|
76
169
|
const generateSpinner = spin('Generate files');
|
|
77
|
-
const
|
|
78
|
-
const
|
|
79
|
-
const
|
|
80
|
-
const modelTemplate = server.propsForModel(props, { declare, modelName: name });
|
|
170
|
+
const inputTemplate = server.propsForInput(props, { modelName: name, nullable: true });
|
|
171
|
+
const createTemplate = server.propsForInput(props, { create: true, modelName: name, nullable: false });
|
|
172
|
+
const modelTemplate = server.propsForModel(props, { modelName: name });
|
|
81
173
|
// nest-server-module/inputs/xxx.input.ts
|
|
82
174
|
yield template.generate({
|
|
83
175
|
props: { imports: inputTemplate.imports, nameCamel, nameKebab, namePascal, props: inputTemplate.props },
|
|
@@ -133,7 +225,7 @@ const NewCommand = {
|
|
|
133
225
|
}
|
|
134
226
|
// nest-server-module/xxx.service.ts
|
|
135
227
|
yield template.generate({
|
|
136
|
-
props: { nameCamel, nameKebab, namePascal },
|
|
228
|
+
props: { isGql: controller === 'GraphQL' || controller === 'Both', nameCamel, nameKebab, namePascal },
|
|
137
229
|
target: (0, path_1.join)(directory, `${nameKebab}.service.ts`),
|
|
138
230
|
template: 'nest-server-module/template.service.ts.ejs',
|
|
139
231
|
});
|
|
@@ -157,6 +249,22 @@ const NewCommand = {
|
|
|
157
249
|
after: new RegExp('imports = \\[[^\\]]*', 'm'),
|
|
158
250
|
insert: ` forwardRef(() => ${namePascal}Module),\n `,
|
|
159
251
|
});
|
|
252
|
+
// Ensure forwardRef is imported from @nestjs/common
|
|
253
|
+
const serverModuleContent = filesystem.read(serverModule);
|
|
254
|
+
if (serverModuleContent && !serverModuleContent.includes('forwardRef')) {
|
|
255
|
+
// Add forwardRef to @nestjs/common import
|
|
256
|
+
yield patching.patch(serverModule, {
|
|
257
|
+
insert: '$1, forwardRef$2',
|
|
258
|
+
replace: /from '@nestjs\/common'(.*?)}/,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
else if (serverModuleContent && serverModuleContent.includes('@nestjs/common') && !serverModuleContent.match(/forwardRef.*@nestjs\/common|@nestjs\/common.*forwardRef/)) {
|
|
262
|
+
// forwardRef exists but not in @nestjs/common import - add it
|
|
263
|
+
yield patching.patch(serverModule, {
|
|
264
|
+
insert: '$1, forwardRef$2',
|
|
265
|
+
replace: /(\w+)\s*}\s*from\s+'@nestjs\/common'/,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
160
268
|
}
|
|
161
269
|
// Add comma if necessary
|
|
162
270
|
yield patching.patch(serverModule, {
|
|
@@ -188,8 +296,13 @@ const NewCommand = {
|
|
|
188
296
|
const nextObj = objectsToAdd.shift().object;
|
|
189
297
|
yield object_1.default.run(toolbox, { currentItem: nextObj, objectsToAdd, preventExitProcess: true, referencesToAdd });
|
|
190
298
|
}
|
|
191
|
-
// Lint fix
|
|
192
|
-
|
|
299
|
+
// Lint fix with priority: CLI parameter > config > default (false)
|
|
300
|
+
const skipLint = config.getValue({
|
|
301
|
+
cliValue: cliSkipLint,
|
|
302
|
+
configValue: configSkipLint,
|
|
303
|
+
defaultValue: false,
|
|
304
|
+
});
|
|
305
|
+
if (!skipLint) {
|
|
193
306
|
if (yield confirm('Run lint fix?', true)) {
|
|
194
307
|
yield system.run('npm run lint:fix');
|
|
195
308
|
}
|
|
@@ -209,4 +322,4 @@ const NewCommand = {
|
|
|
209
322
|
}),
|
|
210
323
|
};
|
|
211
324
|
exports.default = NewCommand;
|
|
212
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3NlcnZlci9tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQSwrQkFBNEI7QUFJNUIscUNBQWlDO0FBRWpDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLEdBQTJCO0lBQ3pDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNaLFdBQVcsRUFBRSx5S0FBeUs7SUFDdEwsTUFBTSxFQUFFLEtBQUs7SUFDYixJQUFJLEVBQUUsUUFBUTtJQUNkLEdBQUcsRUFBRSxDQUNILE9BQStCLEVBQy9CLE9BS0MsRUFDRCxFQUFFO1FBRUYsV0FBVztRQUNYLE1BQU0sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsbUJBQ3ZDLFdBQVcsRUFBRSxFQUFFLEVBQ2Ysa0JBQWtCLEVBQUUsS0FBSyxJQUN0QixPQUFPLENBQ1gsQ0FBQztRQUNGLElBQUksRUFBRSxZQUFZLEdBQUcsRUFBRSxFQUFFLGVBQWUsR0FBRyxFQUFFLEVBQUUsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO1FBRWhFLDZCQUE2QjtRQUM3QixNQUFNLEVBQ0osVUFBVSxFQUNWLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxFQUNSLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFDOUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUN4QixNQUFNLEVBQ04sT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFDN0MsTUFBTSxFQUNOLFFBQVEsR0FDVCxHQUFHLE9BQU8sQ0FBQztRQUVaLGNBQWM7UUFDZCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEMsT0FBTztRQUNQLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIs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
|
|
325
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3NlcnZlci9tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQSwrQkFBNEI7QUFJNUIscUNBQWlDO0FBRWpDOzs7R0FHRztBQUNILFNBQVMsb0JBQW9CLENBQUMsVUFBZSxFQUFFLElBQVk7SUFDekQsTUFBTSxVQUFVLEdBQUcsSUFBQSxXQUFJLEVBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFMUQsb0NBQW9DO0lBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDbkMsT0FBTyxNQUFNLENBQUMsQ0FBQyxrQ0FBa0M7SUFDbkQsQ0FBQztJQUVELHdDQUF3QztJQUN4QyxNQUFNLGNBQWMsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRXhELDZCQUE2QjtJQUM3QixNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyRCxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQ3hDLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFBLFdBQUksRUFBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FDekcsQ0FBQztJQUVGLHdDQUF3QztJQUN4QyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsaUJBQWlCO0lBQ2pCLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztJQUN2QixJQUFJLFlBQVksR0FB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
|
|
@@ -12,7 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
const path_1 = require("path");
|
|
13
13
|
const module_1 = require("./module");
|
|
14
14
|
/**
|
|
15
|
-
* Create a new server
|
|
15
|
+
* Create a new server object
|
|
16
16
|
*/
|
|
17
17
|
const NewCommand = {
|
|
18
18
|
alias: ['o'],
|
|
@@ -20,10 +20,11 @@ const NewCommand = {
|
|
|
20
20
|
hidden: false,
|
|
21
21
|
name: 'object',
|
|
22
22
|
run: (toolbox, options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
23
|
+
var _a, _b, _c;
|
|
23
24
|
// Options:
|
|
24
25
|
const { currentItem, objectsToAdd, preventExitProcess, referencesToAdd } = Object.assign({ currentItem: '', objectsToAdd: [], preventExitProcess: false, referencesToAdd: [] }, options);
|
|
25
26
|
// Retrieve the tools we need
|
|
26
|
-
const { filesystem, helper, parameters, print: { divider, error, info, spin, success }, prompt: { confirm }, server, strings: { camelCase, kebabCase, pascalCase }, system, template, } = toolbox;
|
|
27
|
+
const { config, filesystem, helper, parameters, print: { divider, error, info, spin, success }, prompt: { confirm }, server, strings: { camelCase, kebabCase, pascalCase }, system, template, } = toolbox;
|
|
27
28
|
// Start timer
|
|
28
29
|
const timer = system.startTimer();
|
|
29
30
|
// Info
|
|
@@ -33,6 +34,9 @@ const NewCommand = {
|
|
|
33
34
|
else {
|
|
34
35
|
info('Create a new server object (with inputs)');
|
|
35
36
|
}
|
|
37
|
+
// Load configuration
|
|
38
|
+
const ltConfig = config.loadConfig();
|
|
39
|
+
const configSkipLint = (_c = (_b = (_a = ltConfig === null || ltConfig === void 0 ? void 0 : ltConfig.commands) === null || _a === void 0 ? void 0 : _a.server) === null || _b === void 0 ? void 0 : _b.object) === null || _c === void 0 ? void 0 : _c.skipLint;
|
|
36
40
|
// Parse CLI arguments
|
|
37
41
|
const { name: cliName, skipLint: cliSkipLint } = parameters.options;
|
|
38
42
|
// Get name
|
|
@@ -67,10 +71,9 @@ const NewCommand = {
|
|
|
67
71
|
// Parse properties from CLI or interactive mode
|
|
68
72
|
const { props, refsSet, schemaSet } = yield toolbox.parseProperties({ objectsToAdd, referencesToAdd });
|
|
69
73
|
const generateSpinner = spin('Generate files');
|
|
70
|
-
const
|
|
71
|
-
const
|
|
72
|
-
const
|
|
73
|
-
const objectTemplate = server.propsForModel(props, { declare, modelName: name });
|
|
74
|
+
const inputTemplate = server.propsForInput(props, { modelName: name, nullable: true });
|
|
75
|
+
const createTemplate = server.propsForInput(props, { create: true, modelName: name, nullable: false });
|
|
76
|
+
const objectTemplate = server.propsForModel(props, { modelName: name });
|
|
74
77
|
// nest-server-module/inputs/xxx.input.ts
|
|
75
78
|
yield template.generate({
|
|
76
79
|
props: { imports: inputTemplate.imports, nameCamel, nameKebab, namePascal, props: inputTemplate.props },
|
|
@@ -97,8 +100,13 @@ const NewCommand = {
|
|
|
97
100
|
template: 'nest-server-object/template.object.ts.ejs',
|
|
98
101
|
});
|
|
99
102
|
generateSpinner.succeed('Files generated');
|
|
100
|
-
// Lint fix
|
|
101
|
-
|
|
103
|
+
// Lint fix with priority: CLI parameter > config > default (false)
|
|
104
|
+
const skipLint = config.getValue({
|
|
105
|
+
cliValue: cliSkipLint,
|
|
106
|
+
configValue: configSkipLint,
|
|
107
|
+
defaultValue: false,
|
|
108
|
+
});
|
|
109
|
+
if (!skipLint) {
|
|
102
110
|
if (yield confirm('Run lint fix?', true)) {
|
|
103
111
|
yield system.run('npm run lint:fix');
|
|
104
112
|
}
|
|
@@ -107,18 +115,18 @@ const NewCommand = {
|
|
|
107
115
|
info('');
|
|
108
116
|
success(`Generated ${namePascal}Object in ${helper.msToMinutesAndSeconds(timer())}m.`);
|
|
109
117
|
info('');
|
|
110
|
-
// Add additional objects
|
|
111
|
-
if (objectsToAdd.length > 0) {
|
|
112
|
-
divider();
|
|
113
|
-
const nextObj = objectsToAdd.shift().object;
|
|
114
|
-
yield NewCommand.run(toolbox, { currentItem: nextObj, objectsToAdd, preventExitProcess: true, referencesToAdd });
|
|
115
|
-
}
|
|
116
118
|
// Add additional references
|
|
117
119
|
if (referencesToAdd.length > 0) {
|
|
118
120
|
divider();
|
|
119
121
|
const nextRef = referencesToAdd.shift().reference;
|
|
120
122
|
yield module_1.default.run(toolbox, { currentItem: nextRef, objectsToAdd, preventExitProcess: true, referencesToAdd });
|
|
121
123
|
}
|
|
124
|
+
// Add additional objects
|
|
125
|
+
if (objectsToAdd.length > 0) {
|
|
126
|
+
divider();
|
|
127
|
+
const nextObj = objectsToAdd.shift().object;
|
|
128
|
+
yield NewCommand.run(toolbox, { currentItem: nextObj, objectsToAdd, preventExitProcess: true, referencesToAdd });
|
|
129
|
+
}
|
|
122
130
|
// We're done, so show what to do next
|
|
123
131
|
if (!preventExitProcess) {
|
|
124
132
|
if (refsSet || schemaSet) {
|
|
@@ -133,4 +141,4 @@ const NewCommand = {
|
|
|
133
141
|
}),
|
|
134
142
|
};
|
|
135
143
|
exports.default = NewCommand;
|
|
136
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3NlcnZlci9vYmplY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQSwrQkFBNEI7QUFJNUIscUNBQWlDO0FBRWpDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLEdBQTJCO0lBQ3pDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNaLFdBQVcsRUFBRSxvSkFBb0o7SUFDakssTUFBTSxFQUFFLEtBQUs7SUFDYixJQUFJLEVBQUUsUUFBUTtJQUNkLEdBQUcsRUFBRSxDQUNILE9BQStCLEVBQy9CLE9BS0MsRUFDRCxFQUFFOztRQUVGLFdBQVc7UUFDWCxNQUFNLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsbUJBQ3RFLFdBQVcsRUFBRSxFQUFFLEVBQ2YsWUFBWSxFQUFFLEVBQUUsRUFDaEIsa0JBQWtCLEVBQUUsS0FBSyxFQUN6QixlQUFlLEVBQUUsRUFBRSxJQUNoQixPQUFPLENBQ1gsQ0FBQztRQUVGLDZCQUE2QjtRQUM3QixNQUFNLEVBQ0osTUFBTSxFQUNOLFVBQVUsRUFDVixNQUFNLEVBQ04sVUFBVSxFQUNWLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFDOUMsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQ25CLE1BQU0sRUFDTixPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxFQUM3QyxNQUFNLEVBQ04sUUFBUSxHQUNULEdBQUcsT0FBTyxDQUFDO1FBRVosY0FBYztRQUNkLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQyxPQUFPO1FBQ1AsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsZ0RBQWdELFdBQVcsRUFBRSxD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
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Config = void 0;
|
|
4
|
+
const _ = require("lodash");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
/**
|
|
7
|
+
* Config helper functions for loading and merging lt.config.json files
|
|
8
|
+
*/
|
|
9
|
+
class Config {
|
|
10
|
+
constructor(filesystem) {
|
|
11
|
+
this.filesystem = filesystem;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Load configuration from lt.config.json files
|
|
15
|
+
* Searches from current directory up to root, merging configurations
|
|
16
|
+
*
|
|
17
|
+
* Priority (lowest to highest):
|
|
18
|
+
* 1. Default values
|
|
19
|
+
* 2. Config from parent directories (higher up = lower priority)
|
|
20
|
+
* 3. Config from current directory
|
|
21
|
+
* 4. CLI parameters
|
|
22
|
+
* 5. Interactive user input
|
|
23
|
+
*
|
|
24
|
+
* @param startPath - Starting directory (defaults to current working directory)
|
|
25
|
+
* @returns Merged configuration object
|
|
26
|
+
*/
|
|
27
|
+
loadConfig(startPath) {
|
|
28
|
+
const start = startPath || this.filesystem.cwd();
|
|
29
|
+
const configs = [];
|
|
30
|
+
// Search from current directory up to root
|
|
31
|
+
let currentPath = start;
|
|
32
|
+
const root = this.filesystem.separator === '/' ? '/' : /^[A-Z]:\\$/i;
|
|
33
|
+
while (true) {
|
|
34
|
+
const configPath = (0, path_1.join)(currentPath, 'lt.config.json');
|
|
35
|
+
if (this.filesystem.exists(configPath)) {
|
|
36
|
+
try {
|
|
37
|
+
const config = this.filesystem.read(configPath, 'json');
|
|
38
|
+
if (config) {
|
|
39
|
+
// Add to beginning (parent configs have lower priority)
|
|
40
|
+
configs.unshift(config);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
// Invalid JSON, skip this config file
|
|
45
|
+
console.warn(`Warning: Invalid JSON in ${configPath}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Check if we've reached the root
|
|
49
|
+
const parent = this.filesystem.path(currentPath, '..');
|
|
50
|
+
if (parent === currentPath || (typeof root !== 'string' && root.test(currentPath))) {
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
currentPath = parent;
|
|
54
|
+
}
|
|
55
|
+
// Merge all configs (later configs override earlier ones)
|
|
56
|
+
return this.mergeConfigs(...configs);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Merge multiple config objects
|
|
60
|
+
* Later configs override earlier ones
|
|
61
|
+
*
|
|
62
|
+
* Uses lodash mergeWith with custom handling:
|
|
63
|
+
* - Source objects are merged into the destination object
|
|
64
|
+
* - Source objects are applied from left to right
|
|
65
|
+
* - Subsequent sources overwrite property assignments of previous sources
|
|
66
|
+
* - Arrays are not merged but overwrite arrays of previous sources
|
|
67
|
+
*
|
|
68
|
+
* @param configs - Config objects to merge
|
|
69
|
+
* @returns Merged configuration
|
|
70
|
+
*/
|
|
71
|
+
mergeConfigs(...configs) {
|
|
72
|
+
const merged = {};
|
|
73
|
+
// Filter out null/undefined configs
|
|
74
|
+
const validConfigs = configs.filter((c) => c !== null && c !== undefined);
|
|
75
|
+
if (validConfigs.length === 0) {
|
|
76
|
+
return merged;
|
|
77
|
+
}
|
|
78
|
+
// Use lodash mergeWith with array override behavior
|
|
79
|
+
return _.mergeWith(merged, ...validConfigs, (objValue, srcValue) => {
|
|
80
|
+
// If source value is an array, replace rather than merge
|
|
81
|
+
if (Array.isArray(srcValue)) {
|
|
82
|
+
return srcValue;
|
|
83
|
+
}
|
|
84
|
+
// Otherwise, use default merge behavior
|
|
85
|
+
return undefined;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get a configuration value with priority handling
|
|
90
|
+
*
|
|
91
|
+
* Priority (lowest to highest):
|
|
92
|
+
* 1. defaultValue
|
|
93
|
+
* 2. Config file value
|
|
94
|
+
* 3. CLI parameter value
|
|
95
|
+
* 4. Interactive value (if provided)
|
|
96
|
+
*
|
|
97
|
+
* @param options - Configuration options
|
|
98
|
+
* @returns The value according to priority
|
|
99
|
+
*/
|
|
100
|
+
getValue(options) {
|
|
101
|
+
const { cliValue, configValue, defaultValue, interactiveValue } = options;
|
|
102
|
+
// Priority: interactive > cli > config > default
|
|
103
|
+
if (interactiveValue !== undefined && interactiveValue !== null) {
|
|
104
|
+
return interactiveValue;
|
|
105
|
+
}
|
|
106
|
+
if (cliValue !== undefined && cliValue !== null) {
|
|
107
|
+
return cliValue;
|
|
108
|
+
}
|
|
109
|
+
if (configValue !== undefined && configValue !== null) {
|
|
110
|
+
return configValue;
|
|
111
|
+
}
|
|
112
|
+
return defaultValue;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Save configuration to lt.config.json in the specified directory
|
|
116
|
+
*
|
|
117
|
+
* @param config - Configuration to save
|
|
118
|
+
* @param targetPath - Directory to save config in (defaults to current directory)
|
|
119
|
+
*/
|
|
120
|
+
saveConfig(config, targetPath) {
|
|
121
|
+
const path = targetPath || this.filesystem.cwd();
|
|
122
|
+
const configPath = (0, path_1.join)(path, 'lt.config.json');
|
|
123
|
+
this.filesystem.write(configPath, config, { jsonIndent: 2 });
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Update an existing configuration file or create a new one
|
|
127
|
+
* Merges with existing config if it exists
|
|
128
|
+
*
|
|
129
|
+
* @param config - Configuration updates to apply
|
|
130
|
+
* @param targetPath - Directory containing config file (defaults to current directory)
|
|
131
|
+
*/
|
|
132
|
+
updateConfig(config, targetPath) {
|
|
133
|
+
const path = targetPath || this.filesystem.cwd();
|
|
134
|
+
const configPath = (0, path_1.join)(path, 'lt.config.json');
|
|
135
|
+
let existing = {};
|
|
136
|
+
if (this.filesystem.exists(configPath)) {
|
|
137
|
+
try {
|
|
138
|
+
existing = this.filesystem.read(configPath, 'json');
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
// Invalid JSON, will overwrite
|
|
142
|
+
existing = {};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const merged = this.mergeConfigs(existing, config);
|
|
146
|
+
this.saveConfig(merged, path);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
exports.Config = Config;
|
|
150
|
+
/**
|
|
151
|
+
* Extension function to add config helper to toolbox
|
|
152
|
+
*/
|
|
153
|
+
exports.default = (toolbox) => {
|
|
154
|
+
const config = new Config(toolbox.filesystem);
|
|
155
|
+
toolbox.config = config;
|
|
156
|
+
};
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4dGVuc2lvbnMvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDRCQUE0QjtBQUM1QiwrQkFBNEI7QUFJNUI7O0dBRUc7QUFDSCxNQUFhLE1BQU07SUFHakIsWUFBWSxVQUE2QjtRQUN2QyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILFVBQVUsQ0FBQyxTQUFrQjtRQUMzQixNQUFNLEtBQUssR0FBRyxTQUFTLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNqRCxNQUFNLE9BQU8sR0FBZSxFQUFFLENBQUM7UUFFL0IsMkNBQTJDO1FBQzNDLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN4QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO1FBRXJFLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDWixNQUFNLFVBQVUsR0FBRyxJQUFBLFdBQUksRUFBQyxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUV2RCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQztvQkFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFhLENBQUM7b0JBQ3BFLElBQUksTUFBTSxFQUFFLENBQUM7d0JBQ1gsd0RBQXdEO3dCQUN4RCxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMxQixDQUFDO2dCQUNILENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZixz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
|