@azure-net/cli 5.1.1 → 6.0.0-next.3
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/README.md +201 -0
- package/bin/azure-net.js +236 -221
- package/dist/bin/azure-net.d.ts +2 -0
- package/dist/src/checks/architecture.d.ts +20 -0
- package/dist/src/checks/checkDomain.d.ts +1 -0
- package/dist/src/checks/checkFoldersStructure.d.ts +1 -0
- package/dist/src/checks/checkHooks.d.ts +1 -0
- package/dist/src/checks/checkImports.d.ts +1 -0
- package/dist/src/checks/checkInternal.d.ts +1 -0
- package/dist/src/checks/checkLayerBoundaries.d.ts +1 -0
- package/dist/src/checks/checkLayerImports.d.ts +1 -0
- package/dist/src/checks/checkPresenterNames.d.ts +1 -0
- package/dist/src/checks/checkProject.d.ts +1 -0
- package/dist/src/checks/checkProviderGraph.d.ts +1 -0
- package/dist/src/checks/checkProviderNames.d.ts +1 -0
- package/dist/src/generate/layers/generateRepository.d.ts +1 -0
- package/dist/src/generate/layers/generateRepositoryMethod.d.ts +1 -0
- package/dist/src/generate/layers/generateUseCases.d.ts +1 -0
- package/dist/src/generate/module/generateDomain.d.ts +8 -0
- package/dist/src/generate/module/generateModule.d.ts +1 -0
- package/dist/src/generate/module/generateModulePreset.d.ts +1 -0
- package/dist/src/generate/module/generatePresenter.d.ts +29 -0
- package/dist/src/generate/module/generateRepository.d.ts +15 -0
- package/dist/src/generate/module/generateRepositoryMethod.d.ts +2 -0
- package/dist/src/generate/module/generateSchemaFromType.d.ts +9 -0
- package/dist/src/generate/module/generateStore.d.ts +1 -0
- package/dist/src/generate/module/generateTypesJson.d.ts +2 -0
- package/dist/src/generate/module/generateUseCases.d.ts +1 -0
- package/dist/src/generate/module/repositoryModuleShared.d.ts +89 -0
- package/dist/src/generate/routes/generateRoutes.d.ts +14 -0
- package/dist/src/generate/ui/generateComponent.d.ts +1 -0
- package/dist/src/generate/ui/generateDesignComponent.d.ts +1 -0
- package/dist/src/generate/ui/generateWidget.d.ts +1 -0
- package/dist/src/git/commit.d.ts +23 -0
- package/dist/src/git/push.d.ts +11 -0
- package/dist/src/git/runGit.d.ts +2 -0
- package/dist/src/init/initAliases.d.ts +12 -0
- package/dist/src/init/initEdges.d.ts +2 -0
- package/dist/src/init/initStructure.d.ts +1 -0
- package/dist/src/install/configureCommitTools.d.ts +1 -0
- package/dist/src/install/installFresh.d.ts +1 -0
- package/dist/src/migrate/migrate.d.ts +22 -0
- package/dist/src/migrate/presenterFactories.d.ts +9 -0
- package/dist/src/migrate/presenters.d.ts +13 -0
- package/dist/src/migrate/translations.d.ts +8 -0
- package/dist/src/plugins/addLint.d.ts +5 -0
- package/dist/src/scaffolds/createCoreSchema.d.ts +1 -0
- package/dist/src/scaffolds/createDatasource.d.ts +1 -0
- package/dist/src/scaffolds/createProgram.d.ts +1 -0
- package/dist/src/scaffolds/createResponse.d.ts +1 -0
- package/dist/src/scaffolds/createSchemaRule.d.ts +1 -0
- package/dist/src/scaffolds/createTranslationManager.d.ts +1 -0
- package/{src/scaffolds/index.ts → dist/src/scaffolds/index.d.ts} +0 -2
- package/dist/src/scaffolds/registerDatasource.d.ts +2 -0
- package/dist/src/scaffolds/updateDefaultFactoryConfig.d.ts +1 -0
- package/dist/src/utils/architecture.d.ts +31 -0
- package/dist/src/utils/contextUtils.d.ts +6 -0
- package/dist/src/utils/fileUtils.d.ts +5 -0
- package/dist/src/utils/flattenConfig.d.ts +2 -0
- package/dist/src/utils/legacyAliases.d.ts +1 -0
- package/dist/src/utils/loadConfig.d.ts +16 -0
- package/dist/src/utils/packageImports.d.ts +4 -0
- package/dist/src/utils/sharedFoundation.d.ts +20 -0
- package/dist/src/utils/viteConfig.d.ts +9 -0
- package/package.json +17 -7
- package/src/checks/architecture.js +154 -0
- package/src/checks/checkDomain.js +124 -154
- package/src/checks/checkFoldersStructure.js +64 -52
- package/src/checks/checkHooks.js +12 -12
- package/src/checks/checkImports.js +26 -142
- package/src/checks/checkInternal.js +27 -24
- package/src/checks/checkLayerBoundaries.js +22 -197
- package/src/checks/checkLayerImports.js +14 -134
- package/src/checks/checkPresenterNames.js +156 -143
- package/src/checks/checkProject.js +27 -26
- package/src/checks/checkProviderGraph.js +182 -166
- package/src/checks/checkProviderNames.js +123 -112
- package/src/generate/layers/generateRepository.js +1 -109
- package/src/generate/layers/generateRepositoryMethod.js +1 -90
- package/src/generate/layers/generateUseCases.js +1 -44
- package/src/generate/module/generateDomain.js +81 -105
- package/src/generate/module/generateModule.js +34 -68
- package/src/generate/module/generateModulePreset.js +188 -248
- package/src/generate/module/generatePresenter.js +441 -369
- package/src/generate/module/generateRepository.js +102 -121
- package/src/generate/module/generateRepositoryMethod.js +117 -0
- package/src/generate/module/generateSchemaFromType.js +283 -280
- package/src/generate/module/generateStore.js +41 -0
- package/src/generate/module/generateTypesJson.js +196 -195
- package/src/generate/module/generateUseCases.js +47 -55
- package/src/generate/module/repositoryModuleShared.js +480 -459
- package/src/generate/routes/generateRoutes.js +4 -7
- package/src/generate/ui/generateComponent.js +44 -64
- package/src/generate/ui/generateDesignComponent.js +21 -41
- package/src/generate/ui/generateWidget.js +21 -41
- package/src/git/commit.js +67 -0
- package/src/git/push.js +19 -0
- package/src/git/runGit.js +11 -0
- package/src/init/initAliases.js +19 -135
- package/src/init/initEdges.js +79 -54
- package/src/init/initStructure.js +31 -145
- package/src/install/configureCommitTools.js +1 -0
- package/src/install/installFresh.js +39 -68
- package/src/migrate/migrate.js +1027 -0
- package/src/migrate/presenterFactories.js +189 -0
- package/src/migrate/presenters.js +373 -0
- package/src/migrate/translations.js +213 -0
- package/src/plugins/addLint.js +52 -219
- package/src/scaffolds/createCoreSchema.js +65 -91
- package/src/scaffolds/createDatasource.js +67 -101
- package/src/scaffolds/createProgram.js +8 -8
- package/src/scaffolds/createResponse.js +29 -29
- package/src/scaffolds/createSchemaRule.js +19 -19
- package/src/scaffolds/createTranslationManager.js +84 -37
- package/src/scaffolds/index.js +0 -2
- package/src/scaffolds/registerDatasource.js +59 -0
- package/src/scaffolds/updateDefaultFactoryConfig.js +31 -0
- package/src/utils/architecture.js +145 -0
- package/src/utils/contextUtils.js +32 -65
- package/src/utils/fileUtils.js +69 -50
- package/src/utils/flattenConfig.js +38 -0
- package/src/utils/legacyAliases.js +75 -0
- package/src/utils/loadConfig.js +76 -40
- package/src/utils/packageImports.js +63 -0
- package/src/utils/sharedFoundation.js +36 -42
- package/src/utils/viteConfig.js +295 -0
- package/.prettierrc +0 -7
- package/bin/azure-net.ts +0 -308
- package/eslint.config.js +0 -34
- package/src/checks/checkDomain.ts +0 -223
- package/src/checks/checkFoldersStructure.ts +0 -85
- package/src/checks/checkHooks.ts +0 -22
- package/src/checks/checkImports.ts +0 -193
- package/src/checks/checkInternal.ts +0 -48
- package/src/checks/checkLayerBoundaries.ts +0 -255
- package/src/checks/checkLayerImports.ts +0 -185
- package/src/checks/checkPresenterNames.ts +0 -203
- package/src/checks/checkProject.ts +0 -45
- package/src/checks/checkProviderGraph.ts +0 -234
- package/src/checks/checkProviderNames.ts +0 -165
- package/src/generate/layers/generateRepository.ts +0 -123
- package/src/generate/layers/generateRepositoryMethod.ts +0 -102
- package/src/generate/layers/generateUseCases.ts +0 -50
- package/src/generate/layers/repositoryShared.js +0 -506
- package/src/generate/layers/repositoryShared.ts +0 -662
- package/src/generate/module/generateDomain.ts +0 -147
- package/src/generate/module/generateModule.ts +0 -84
- package/src/generate/module/generateModulePreset.ts +0 -338
- package/src/generate/module/generatePresenter.ts +0 -498
- package/src/generate/module/generateRepository.ts +0 -158
- package/src/generate/module/generateSchemaFromType.ts +0 -368
- package/src/generate/module/generateTypesJson.ts +0 -259
- package/src/generate/module/generateUseCases.ts +0 -67
- package/src/generate/module/repositoryModuleShared.ts +0 -669
- package/src/generate/routes/generateRoutes.ts +0 -275
- package/src/generate/ui/generateComponent.ts +0 -100
- package/src/generate/ui/generateDesignComponent.ts +0 -71
- package/src/generate/ui/generateWidget.ts +0 -71
- package/src/init/initAliases.ts +0 -172
- package/src/init/initEdges.ts +0 -74
- package/src/init/initStructure.ts +0 -172
- package/src/install/installFresh.ts +0 -93
- package/src/plugins/addLint.ts +0 -274
- package/src/scaffolds/createCoreSchema.ts +0 -130
- package/src/scaffolds/createDatasource.ts +0 -161
- package/src/scaffolds/createDatasourceProvider.js +0 -127
- package/src/scaffolds/createDatasourceProvider.ts +0 -161
- package/src/scaffolds/createPresenterFactory.js +0 -83
- package/src/scaffolds/createPresenterFactory.ts +0 -102
- package/src/scaffolds/createProgram.ts +0 -19
- package/src/scaffolds/createResponse.ts +0 -66
- package/src/scaffolds/createSchemaRule.ts +0 -44
- package/src/scaffolds/createTranslationManager.ts +0 -80
- package/src/utils/contextUtils.ts +0 -88
- package/src/utils/fileUtils.ts +0 -74
- package/src/utils/loadConfig.ts +0 -68
- package/src/utils/sharedFoundation.ts +0 -70
- package/tsconfig.json +0 -19
- /package/{src/checks/index.ts → dist/src/checks/index.d.ts} +0 -0
- /package/{src/plugins/index.ts → dist/src/plugins/index.d.ts} +0 -0
|
@@ -1,211 +1,212 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import prompts from 'prompts';
|
|
4
|
+
import ts from 'typescript';
|
|
4
5
|
import { selectContext } from './repositoryModuleShared.js';
|
|
5
6
|
const isValidIdentifier = (value) => /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(value);
|
|
6
|
-
const toPropertyName = (key) => (isValidIdentifier(key) ? key :
|
|
7
|
+
const toPropertyName = (key) => (isValidIdentifier(key) ? key : JSON.stringify(key));
|
|
7
8
|
const getIndent = (level) => '\t'.repeat(level);
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
9
|
+
export const parseObjectInput = (rawValue) => {
|
|
10
|
+
let input = String(rawValue ?? '')
|
|
11
|
+
.trim()
|
|
12
|
+
.replace(/;$/, '');
|
|
13
|
+
if (!input)
|
|
14
|
+
throw new Error('Input is empty');
|
|
15
|
+
const scanner = ts.createScanner(ts.ScriptTarget.Latest, true, ts.LanguageVariant.Standard, input);
|
|
16
|
+
const stack = [];
|
|
17
|
+
for (let token = scanner.scan(); token !== ts.SyntaxKind.EndOfFileToken; token = scanner.scan()) {
|
|
18
|
+
if (token === ts.SyntaxKind.OpenBraceToken || token === ts.SyntaxKind.OpenBracketToken)
|
|
19
|
+
stack.push(token);
|
|
20
|
+
if (token === ts.SyntaxKind.CloseBraceToken || token === ts.SyntaxKind.CloseBracketToken) {
|
|
21
|
+
const expected = token === ts.SyntaxKind.CloseBraceToken ? ts.SyntaxKind.OpenBraceToken : ts.SyntaxKind.OpenBracketToken;
|
|
22
|
+
if (stack.pop() !== expected)
|
|
23
|
+
throw new Error('Unbalanced object');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
input += stack
|
|
27
|
+
.reverse()
|
|
28
|
+
.map((token) => (token === ts.SyntaxKind.OpenBraceToken ? '}' : ']'))
|
|
29
|
+
.join('');
|
|
30
|
+
const source = ts.createSourceFile('Input.ts', 'const input = (' + input + ');', ts.ScriptTarget.Latest, true);
|
|
31
|
+
const diagnostics = ts.transpileModule(source.text, { reportDiagnostics: true }).diagnostics ?? [];
|
|
32
|
+
if (diagnostics.length || source.statements.length !== 1)
|
|
33
|
+
throw new Error('Invalid object literal');
|
|
34
|
+
const statement = source.statements[0];
|
|
35
|
+
if (!statement || !ts.isVariableStatement(statement))
|
|
36
|
+
throw new Error('Invalid object literal');
|
|
37
|
+
const parseValue = (node) => {
|
|
38
|
+
if (!node)
|
|
39
|
+
throw new Error('Missing value');
|
|
40
|
+
if (ts.isParenthesizedExpression(node))
|
|
41
|
+
return parseValue(node.expression);
|
|
42
|
+
if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node))
|
|
43
|
+
return node.text;
|
|
44
|
+
if (ts.isNumericLiteral(node))
|
|
45
|
+
return Number(node.text);
|
|
46
|
+
if (ts.isPrefixUnaryExpression(node) &&
|
|
47
|
+
ts.isNumericLiteral(node.operand) &&
|
|
48
|
+
[ts.SyntaxKind.MinusToken, ts.SyntaxKind.PlusToken].includes(node.operator))
|
|
49
|
+
return Number(node.operand.text) * (node.operator === ts.SyntaxKind.MinusToken ? -1 : 1);
|
|
50
|
+
if (node.kind === ts.SyntaxKind.TrueKeyword)
|
|
51
|
+
return true;
|
|
52
|
+
if (node.kind === ts.SyntaxKind.FalseKeyword)
|
|
53
|
+
return false;
|
|
54
|
+
if (node.kind === ts.SyntaxKind.NullKeyword)
|
|
55
|
+
return null;
|
|
56
|
+
if (ts.isIdentifier(node) && node.text === 'undefined')
|
|
57
|
+
return undefined;
|
|
58
|
+
if (ts.isArrayLiteralExpression(node))
|
|
59
|
+
return node.elements.map((element) => parseValue(element));
|
|
60
|
+
if (ts.isObjectLiteralExpression(node)) {
|
|
61
|
+
const value = Object.create(null);
|
|
62
|
+
for (const property of node.properties) {
|
|
63
|
+
if (!ts.isPropertyAssignment(property) ||
|
|
64
|
+
(!ts.isIdentifier(property.name) && !ts.isStringLiteral(property.name) && !ts.isNumericLiteral(property.name)))
|
|
65
|
+
throw new Error('Only data properties are supported');
|
|
66
|
+
value[property.name.text] = parseValue(property.initializer);
|
|
67
|
+
}
|
|
68
|
+
return value;
|
|
69
|
+
}
|
|
70
|
+
throw new Error('Only JSON/JS data literals are supported; executable code is not allowed');
|
|
71
|
+
};
|
|
72
|
+
const result = parseValue(statement.declarationList.declarations[0]?.initializer);
|
|
73
|
+
if (!result || typeof result !== 'object' || Array.isArray(result))
|
|
74
|
+
throw new Error('Input root must be an object');
|
|
75
|
+
return result;
|
|
39
76
|
};
|
|
40
77
|
const stringifyType = (value, level = 1) => {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
78
|
+
if (value === null)
|
|
79
|
+
return 'null';
|
|
80
|
+
const valueType = typeof value;
|
|
81
|
+
if (valueType === 'string')
|
|
82
|
+
return 'string';
|
|
83
|
+
if (valueType === 'number')
|
|
84
|
+
return Number.isFinite(value) ? 'number' : 'unknown';
|
|
85
|
+
if (valueType === 'boolean')
|
|
86
|
+
return 'boolean';
|
|
87
|
+
if (valueType === 'bigint')
|
|
88
|
+
return 'bigint';
|
|
89
|
+
if (valueType === 'undefined')
|
|
90
|
+
return 'undefined';
|
|
91
|
+
if (Array.isArray(value)) {
|
|
92
|
+
if (!value.length)
|
|
93
|
+
return 'unknown[]';
|
|
94
|
+
const itemTypes = Array.from(new Set(value.map((item) => stringifyType(item, level + 1))));
|
|
95
|
+
if (itemTypes.length === 1) {
|
|
96
|
+
const single = itemTypes[0] ?? 'unknown';
|
|
97
|
+
if (single.includes('\n'))
|
|
98
|
+
return `Array<${single}>`;
|
|
99
|
+
return `${single}[]`;
|
|
100
|
+
}
|
|
101
|
+
const union = itemTypes.join(' | ');
|
|
102
|
+
if (union.includes('\n'))
|
|
103
|
+
return `Array<${union}>`;
|
|
104
|
+
return `(${union})[]`;
|
|
105
|
+
}
|
|
106
|
+
if (valueType === 'object') {
|
|
107
|
+
const entries = Object.entries(value);
|
|
108
|
+
if (!entries.length)
|
|
109
|
+
return 'Record<string, unknown>';
|
|
110
|
+
const lines = entries.map(([entryKey, entryValue]) => {
|
|
111
|
+
const propertyType = stringifyType(entryValue, level + 1);
|
|
112
|
+
return `${getIndent(level + 1)}${toPropertyName(entryKey)}: ${propertyType};`;
|
|
113
|
+
});
|
|
114
|
+
return `{\n${lines.join('\n')}\n${getIndent(level)}}`;
|
|
115
|
+
}
|
|
116
|
+
return 'unknown';
|
|
70
117
|
};
|
|
71
118
|
const findInterfaceDeclaration = (content) => {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
for (let index = openBraceIndex; index < content.length; index += 1) {
|
|
80
|
-
const char = content[index];
|
|
81
|
-
if (char === '{') depth += 1;
|
|
82
|
-
if (char === '}') {
|
|
83
|
-
depth -= 1;
|
|
84
|
-
if (depth === 0) {
|
|
85
|
-
closeBraceIndex = index;
|
|
86
|
-
break;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
if (closeBraceIndex === -1) return null;
|
|
91
|
-
const body = content.slice(openBraceIndex + 1, closeBraceIndex);
|
|
92
|
-
return {
|
|
93
|
-
name,
|
|
94
|
-
openBraceIndex,
|
|
95
|
-
closeBraceIndex,
|
|
96
|
-
body
|
|
97
|
-
};
|
|
119
|
+
const source = ts.createSourceFile('Model.ts', content, ts.ScriptTarget.Latest, true);
|
|
120
|
+
const declaration = source.statements.find(ts.isInterfaceDeclaration);
|
|
121
|
+
if (!declaration)
|
|
122
|
+
return null;
|
|
123
|
+
const openBraceIndex = declaration.members.pos - 1;
|
|
124
|
+
const closeBraceIndex = declaration.end - 1;
|
|
125
|
+
return { name: declaration.name.text, openBraceIndex, closeBraceIndex, body: content.slice(openBraceIndex + 1, closeBraceIndex) };
|
|
98
126
|
};
|
|
99
127
|
const extractExistingRootKeys = (body) => {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
if (key) keys.add(key);
|
|
106
|
-
}
|
|
107
|
-
return keys;
|
|
108
|
-
};
|
|
109
|
-
const listDomains = async (contextName) => {
|
|
110
|
-
const domainRoot = path.join(process.cwd(), 'src', 'app', contextName, 'layers', 'domain');
|
|
111
|
-
try {
|
|
112
|
-
const items = await fs.readdir(domainRoot, { withFileTypes: true });
|
|
113
|
-
return items.filter((item) => item.isDirectory()).map((item) => item.name);
|
|
114
|
-
} catch {
|
|
115
|
-
return [];
|
|
116
|
-
}
|
|
128
|
+
const source = ts.createSourceFile('Model.ts', 'interface IModel {' + body + '}', ts.ScriptTarget.Latest, true);
|
|
129
|
+
const declaration = source.statements.find(ts.isInterfaceDeclaration);
|
|
130
|
+
return new Set(declaration?.members.flatMap((member) => member.name && (ts.isIdentifier(member.name) || ts.isStringLiteral(member.name) || ts.isNumericLiteral(member.name))
|
|
131
|
+
? [member.name.text]
|
|
132
|
+
: []) ?? []);
|
|
117
133
|
};
|
|
118
|
-
const listModelFiles = async (contextName
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
134
|
+
const listModelFiles = async (contextName) => {
|
|
135
|
+
const modelRoot = path.join(process.cwd(), 'src', 'app', 'Contexts', contextName, 'Domain', 'Entities');
|
|
136
|
+
try {
|
|
137
|
+
const files = await fs.readdir(modelRoot);
|
|
138
|
+
return files
|
|
139
|
+
.filter((fileName) => fileName.endsWith('.ts') && fileName !== 'index.ts')
|
|
140
|
+
.map((fileName) => ({
|
|
141
|
+
name: fileName.replace(/\.ts$/, ''),
|
|
142
|
+
path: path.join(modelRoot, fileName)
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return [];
|
|
147
|
+
}
|
|
131
148
|
};
|
|
132
149
|
export default async function generateTypesJson() {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
const existingKeys = extractExistingRootKeys(interfaceDeclaration.body);
|
|
198
|
-
const generatedLines = Object.entries(parsedJson)
|
|
199
|
-
.filter(([key]) => !existingKeys.has(key))
|
|
200
|
-
.map(([key, value]) => `${getIndent(1)}${toPropertyName(key)}: ${stringifyType(value, 1)};`);
|
|
201
|
-
if (!generatedLines.length) {
|
|
202
|
-
console.log('ℹ️ No new keys to add. Model already contains all JSON keys.');
|
|
203
|
-
return;
|
|
204
|
-
}
|
|
205
|
-
const trimmedBody = interfaceDeclaration.body.trimEnd();
|
|
206
|
-
const bodyPrefix = trimmedBody.length ? `${trimmedBody}\n` : '';
|
|
207
|
-
const newBody = `${bodyPrefix}${generatedLines.join('\n')}\n`;
|
|
208
|
-
const updatedContent = `${content.slice(0, interfaceDeclaration.openBraceIndex + 1)}${newBody}${content.slice(interfaceDeclaration.closeBraceIndex)}`;
|
|
209
|
-
await fs.writeFile(String(modelPath), updatedContent, 'utf-8');
|
|
210
|
-
console.log(`✅ Model updated: ${modelPath}`);
|
|
150
|
+
const contextName = await selectContext('Select context for model update:');
|
|
151
|
+
if (!contextName) {
|
|
152
|
+
process.exitCode = 1;
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const models = await listModelFiles(contextName);
|
|
156
|
+
if (!models.length) {
|
|
157
|
+
console.error(`❌ No model files found in context "${contextName}".`);
|
|
158
|
+
process.exitCode = 1;
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const { modelPath } = await prompts({
|
|
162
|
+
type: 'select',
|
|
163
|
+
name: 'modelPath',
|
|
164
|
+
message: 'Select model:',
|
|
165
|
+
choices: models.map((item) => ({ title: item.name, value: item.path })),
|
|
166
|
+
initial: 0
|
|
167
|
+
});
|
|
168
|
+
if (!modelPath) {
|
|
169
|
+
process.exitCode = 1;
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const { rawJson } = await prompts({
|
|
173
|
+
type: 'text',
|
|
174
|
+
name: 'rawJson',
|
|
175
|
+
message: 'Paste JSON or JS object (single line):',
|
|
176
|
+
validate: (value) => {
|
|
177
|
+
try {
|
|
178
|
+
parseObjectInput(value);
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return 'Invalid JSON/JS object';
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
if (!rawJson) {
|
|
187
|
+
process.exitCode = 1;
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
const parsedJson = parseObjectInput(rawJson);
|
|
191
|
+
const content = await fs.readFile(String(modelPath), 'utf-8');
|
|
192
|
+
const interfaceDeclaration = findInterfaceDeclaration(content);
|
|
193
|
+
if (!interfaceDeclaration) {
|
|
194
|
+
console.error(`❌ Unable to parse interface in ${modelPath}`);
|
|
195
|
+
process.exitCode = 1;
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const existingKeys = extractExistingRootKeys(interfaceDeclaration.body);
|
|
199
|
+
const generatedLines = Object.entries(parsedJson)
|
|
200
|
+
.filter(([key]) => !existingKeys.has(key))
|
|
201
|
+
.map(([key, value]) => `${getIndent(1)}${toPropertyName(key)}: ${stringifyType(value, 1)};`);
|
|
202
|
+
if (!generatedLines.length) {
|
|
203
|
+
console.log('ℹ️ No new keys to add. Model already contains all JSON keys.');
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const trimmedBody = interfaceDeclaration.body.trimEnd();
|
|
207
|
+
const bodyPrefix = trimmedBody.length ? `${trimmedBody}\n` : '';
|
|
208
|
+
const newBody = `${bodyPrefix}${generatedLines.join('\n')}\n`;
|
|
209
|
+
const updatedContent = `${content.slice(0, interfaceDeclaration.openBraceIndex + 1)}${newBody}${content.slice(interfaceDeclaration.closeBraceIndex)}`;
|
|
210
|
+
await fs.writeFile(String(modelPath), updatedContent, 'utf-8');
|
|
211
|
+
console.log(`✅ Model updated: ${modelPath}`);
|
|
211
212
|
}
|
|
@@ -1,58 +1,50 @@
|
|
|
1
1
|
import prompts from 'prompts';
|
|
2
|
-
import {
|
|
3
|
-
createUseCasesForRepository,
|
|
4
|
-
getAvailableTsNames,
|
|
5
|
-
getConfigState,
|
|
6
|
-
resolveContextAlias,
|
|
7
|
-
resolveDomainForRepository,
|
|
8
|
-
resolveRepositoriesPath,
|
|
9
|
-
selectContext
|
|
10
|
-
} from './repositoryModuleShared.js';
|
|
2
|
+
import { createUseCasesForRepository, getAvailableTsNames, getConfigState, resolveContextAlias, resolveDomainForRepository, resolveRepositoriesPath, selectContext } from './repositoryModuleShared.js';
|
|
11
3
|
export default async function generateUseCases() {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
4
|
+
const contextName = await selectContext('Select context for UseCases:');
|
|
5
|
+
if (!contextName) {
|
|
6
|
+
process.exitCode = 1;
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const repositoriesPath = resolveRepositoriesPath(contextName);
|
|
10
|
+
const repositories = await getAvailableTsNames(repositoriesPath);
|
|
11
|
+
if (!repositories.length) {
|
|
12
|
+
console.error(`❌ No repositories found in ${repositoriesPath}`);
|
|
13
|
+
process.exitCode = 1;
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const { repositoryName } = await prompts({
|
|
17
|
+
type: 'select',
|
|
18
|
+
name: 'repositoryName',
|
|
19
|
+
message: 'Select repository:',
|
|
20
|
+
choices: repositories.map((item) => ({ title: item, value: item })),
|
|
21
|
+
initial: 0
|
|
22
|
+
});
|
|
23
|
+
if (!repositoryName) {
|
|
24
|
+
process.exitCode = 1;
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const { contexts } = await getConfigState();
|
|
28
|
+
const contextAlias = resolveContextAlias(contexts, contextName);
|
|
29
|
+
const domainName = await resolveDomainForRepository({
|
|
30
|
+
contextName,
|
|
31
|
+
contextAlias,
|
|
32
|
+
repositoryName: String(repositoryName)
|
|
33
|
+
});
|
|
34
|
+
if (!domainName) {
|
|
35
|
+
console.error('❌ Unable to resolve domain from repository imports.');
|
|
36
|
+
process.exitCode = 1;
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const created = await createUseCasesForRepository({
|
|
40
|
+
contextName,
|
|
41
|
+
contextAlias,
|
|
42
|
+
domainName,
|
|
43
|
+
repositoryName: String(repositoryName)
|
|
44
|
+
});
|
|
45
|
+
if (!created) {
|
|
46
|
+
process.exitCode = 1;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
console.log(`✅ UseCases generated for ${repositoryName}`);
|
|
58
50
|
}
|