@azure-net/cli 5.1.1 → 6.0.0-next.2
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 +189 -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/presenters.d.ts +7 -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 +48 -36
- 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 +914 -0
- package/src/migrate/presenters.js +265 -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
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import ts from 'typescript';
|
|
4
|
+
import { format, resolveConfig } from 'prettier';
|
|
5
|
+
import { mergeAliasesInSvelteConfig } from './legacyAliases.js';
|
|
6
|
+
import { ARCHITECTURE_ALIASES } from './architecture.js';
|
|
7
|
+
export const VITE_CONFIGS = ['vite.config.ts', 'vite.config.js', 'vite.config.mts', 'vite.config.mjs'];
|
|
8
|
+
export const SVELTE_CONFIGS = ['svelte.config.js', 'svelte.config.ts', 'svelte.config.mjs'];
|
|
9
|
+
const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
|
|
10
|
+
const parse = (text) => ts.createSourceFile('config.ts', text, ts.ScriptTarget.Latest, true);
|
|
11
|
+
const name = (node) => node && (ts.isIdentifier(node) || ts.isStringLiteral(node)) ? node.text : undefined;
|
|
12
|
+
function object(expression, source, seen = new Set()) {
|
|
13
|
+
if (ts.isObjectLiteralExpression(expression))
|
|
14
|
+
return expression;
|
|
15
|
+
if (ts.isParenthesizedExpression(expression) || ts.isAsExpression(expression) || ts.isSatisfiesExpression(expression))
|
|
16
|
+
return object(expression.expression, source, seen);
|
|
17
|
+
if (ts.isIdentifier(expression) && !seen.has(expression.text)) {
|
|
18
|
+
seen.add(expression.text);
|
|
19
|
+
for (const statement of source.statements)
|
|
20
|
+
if (ts.isVariableStatement(statement))
|
|
21
|
+
for (const d of statement.declarationList.declarations)
|
|
22
|
+
if (name(d.name) === expression.text && d.initializer)
|
|
23
|
+
return object(d.initializer, source, seen);
|
|
24
|
+
}
|
|
25
|
+
throw new Error('Cannot safely edit dynamic SvelteKit options. Use an object literal or a local object variable in sveltekit().');
|
|
26
|
+
}
|
|
27
|
+
function kitCall(source) {
|
|
28
|
+
const names = new Set();
|
|
29
|
+
for (const s of source.statements)
|
|
30
|
+
if (ts.isImportDeclaration(s) && ts.isStringLiteral(s.moduleSpecifier) && s.moduleSpecifier.text === '@sveltejs/kit/vite') {
|
|
31
|
+
const b = s.importClause?.namedBindings;
|
|
32
|
+
if (b && ts.isNamedImports(b))
|
|
33
|
+
for (const e of b.elements)
|
|
34
|
+
if ((e.propertyName?.text ?? e.name.text) === 'sveltekit')
|
|
35
|
+
names.add(e.name.text);
|
|
36
|
+
}
|
|
37
|
+
const calls = [];
|
|
38
|
+
const visit = (n) => {
|
|
39
|
+
if (ts.isCallExpression(n) && ts.isIdentifier(n.expression) && names.has(n.expression.text))
|
|
40
|
+
calls.push(n);
|
|
41
|
+
ts.forEachChild(n, visit);
|
|
42
|
+
};
|
|
43
|
+
visit(source);
|
|
44
|
+
if (calls.length !== 1)
|
|
45
|
+
throw new Error('Expected exactly one imported sveltekit() call in vite.config. No files changed.');
|
|
46
|
+
return calls[0];
|
|
47
|
+
}
|
|
48
|
+
function modernOptions(input, source) {
|
|
49
|
+
const has = (obj, key) => obj.properties.some((p) => name(p.name) === key);
|
|
50
|
+
const nestedHas = (key, keys) => {
|
|
51
|
+
const property = input.properties.find((p) => name(p.name) === key);
|
|
52
|
+
if (!property || !ts.isPropertyAssignment(property))
|
|
53
|
+
return false;
|
|
54
|
+
const value = objectOrUndefined(property.initializer, source);
|
|
55
|
+
return value && keys.some((k) => has(value, k));
|
|
56
|
+
};
|
|
57
|
+
if (!['kit', 'vitePlugin', 'preloadStrategy'].some((k) => has(input, k)) &&
|
|
58
|
+
!nestedHas('files', ['lib']) &&
|
|
59
|
+
!nestedHas('experimental', ['handleRenderingErrors', 'instrumentation', 'tracing']) &&
|
|
60
|
+
!nestedHas('prerender', ['origin']) &&
|
|
61
|
+
!nestedHas('csrf', ['checkOrigin']))
|
|
62
|
+
return input.getText(source);
|
|
63
|
+
const print = (n) => printer.printNode(ts.EmitHint.Unspecified, n, source);
|
|
64
|
+
const props = [...input.properties];
|
|
65
|
+
const take = (items, key) => {
|
|
66
|
+
const found = items.findIndex((p) => name(p.name) === key);
|
|
67
|
+
if (found < 0)
|
|
68
|
+
return;
|
|
69
|
+
const p = items.splice(found, 1)[0];
|
|
70
|
+
if (!ts.isPropertyAssignment(p))
|
|
71
|
+
throw new Error(`Cannot safely convert option ${key}`);
|
|
72
|
+
return p.initializer;
|
|
73
|
+
};
|
|
74
|
+
const set = (items, key, value) => {
|
|
75
|
+
if (items.some((p) => name(p.name) === key))
|
|
76
|
+
throw new Error(`Conflicting SvelteKit option ${key}; resolve manually.`);
|
|
77
|
+
items.push(ts.factory.createPropertyAssignment(key, value));
|
|
78
|
+
};
|
|
79
|
+
const nested = (key, edit) => {
|
|
80
|
+
const value = take(props, key);
|
|
81
|
+
if (!value)
|
|
82
|
+
return;
|
|
83
|
+
const items = [...object(value, source).properties];
|
|
84
|
+
edit(items);
|
|
85
|
+
if (items.length)
|
|
86
|
+
set(props, key, ts.factory.createObjectLiteralExpression(items, true));
|
|
87
|
+
};
|
|
88
|
+
const oldKit = take(props, 'kit');
|
|
89
|
+
if (oldKit)
|
|
90
|
+
for (const p of object(oldKit, source).properties) {
|
|
91
|
+
if (props.some((existing) => name(existing.name) && name(existing.name) === name(p.name)))
|
|
92
|
+
throw new Error(`Conflicting option ${name(p.name)}`);
|
|
93
|
+
props.push(p);
|
|
94
|
+
}
|
|
95
|
+
const vitePlugin = take(props, 'vitePlugin');
|
|
96
|
+
if (vitePlugin)
|
|
97
|
+
for (const p of object(vitePlugin, source).properties) {
|
|
98
|
+
if (props.some((existing) => name(existing.name) && name(existing.name) === name(p.name)))
|
|
99
|
+
throw new Error(`Conflicting option ${name(p.name)}`);
|
|
100
|
+
props.push(p);
|
|
101
|
+
}
|
|
102
|
+
take(props, 'preloadStrategy');
|
|
103
|
+
nested('files', (items) => {
|
|
104
|
+
take(items, 'lib');
|
|
105
|
+
});
|
|
106
|
+
nested('experimental', (items) => {
|
|
107
|
+
take(items, 'handleRenderingErrors');
|
|
108
|
+
take(items, 'instrumentation');
|
|
109
|
+
const tracing = take(items, 'tracing');
|
|
110
|
+
if (tracing)
|
|
111
|
+
set(props, 'tracing', tracing);
|
|
112
|
+
});
|
|
113
|
+
let origin;
|
|
114
|
+
nested('prerender', (items) => {
|
|
115
|
+
origin = take(items, 'origin');
|
|
116
|
+
});
|
|
117
|
+
if (origin) {
|
|
118
|
+
const paths = take(props, 'paths');
|
|
119
|
+
const items = paths ? [...object(paths, source).properties] : [];
|
|
120
|
+
set(items, 'origin', origin);
|
|
121
|
+
set(props, 'paths', ts.factory.createObjectLiteralExpression(items, true));
|
|
122
|
+
}
|
|
123
|
+
nested('csrf', (items) => {
|
|
124
|
+
const check = take(items, 'checkOrigin');
|
|
125
|
+
if (!check)
|
|
126
|
+
return;
|
|
127
|
+
if (check.kind === ts.SyntaxKind.FalseKeyword) {
|
|
128
|
+
if (items.some((p) => name(p.name) === 'trustedOrigins'))
|
|
129
|
+
throw new Error('Resolve csrf.checkOrigin and trustedOrigins manually.');
|
|
130
|
+
set(items, 'trustedOrigins', ts.factory.createArrayLiteralExpression([ts.factory.createStringLiteral('*')]));
|
|
131
|
+
}
|
|
132
|
+
else if (check.kind !== ts.SyntaxKind.TrueKeyword)
|
|
133
|
+
throw new Error('Dynamic csrf.checkOrigin requires manual migration.');
|
|
134
|
+
});
|
|
135
|
+
return print(ts.factory.createObjectLiteralExpression(props, true));
|
|
136
|
+
}
|
|
137
|
+
/** Pure config edit; never evaluates a project's configuration. */
|
|
138
|
+
export function mergeKitViteConfig(content, aliases, legacy) {
|
|
139
|
+
let source = parse(content);
|
|
140
|
+
const call = kitCall(source);
|
|
141
|
+
let options = call.arguments[0] ? object(call.arguments[0], source) : undefined;
|
|
142
|
+
let optionText = options ? modernOptions(options, source) : '{}';
|
|
143
|
+
if (legacy) {
|
|
144
|
+
if (options && options.properties.length)
|
|
145
|
+
throw new Error('Both Vite and legacy Svelte config contain options. Merge them with sv migrate sveltekit-3 first.');
|
|
146
|
+
const old = parse(legacy), exported = old.statements.find(ts.isExportAssignment);
|
|
147
|
+
if (!exported)
|
|
148
|
+
throw new Error('Legacy Svelte config has no default export.');
|
|
149
|
+
const root = object(exported.expression, old);
|
|
150
|
+
optionText = modernOptions(root, old);
|
|
151
|
+
const imports = old.statements.filter(ts.isImportDeclaration);
|
|
152
|
+
const bindings = (s) => {
|
|
153
|
+
const names = new Set();
|
|
154
|
+
for (const n of s.statements) {
|
|
155
|
+
if (ts.isImportDeclaration(n)) {
|
|
156
|
+
if (n.importClause?.name)
|
|
157
|
+
names.add(n.importClause.name.text);
|
|
158
|
+
const b = n.importClause?.namedBindings;
|
|
159
|
+
if (b && ts.isNamespaceImport(b))
|
|
160
|
+
names.add(b.name.text);
|
|
161
|
+
if (b && ts.isNamedImports(b))
|
|
162
|
+
for (const e of b.elements)
|
|
163
|
+
names.add(e.name.text);
|
|
164
|
+
}
|
|
165
|
+
if (ts.isVariableStatement(n))
|
|
166
|
+
for (const d of n.declarationList.declarations)
|
|
167
|
+
if (ts.isIdentifier(d.name))
|
|
168
|
+
names.add(d.name.text);
|
|
169
|
+
}
|
|
170
|
+
return names;
|
|
171
|
+
};
|
|
172
|
+
const oldNames = bindings(old);
|
|
173
|
+
const currentNames = bindings(source);
|
|
174
|
+
for (const n of oldNames)
|
|
175
|
+
if (currentNames.has(n))
|
|
176
|
+
throw new Error(`Config binding collision: ${n}. Run sv migrate sveltekit-3 first.`);
|
|
177
|
+
const rootStatement = old.statements.find((s) => ts.isVariableStatement(s) &&
|
|
178
|
+
s.declarationList.declarations.some((d) => d.initializer && objectOrUndefined(d.initializer, old) === root));
|
|
179
|
+
if (rootStatement && ts.isVariableStatement(rootStatement) && rootStatement.declarationList.declarations.length !== 1)
|
|
180
|
+
throw new Error('Split legacy config variable declarations before migration.');
|
|
181
|
+
for (const statement of old.statements)
|
|
182
|
+
if (!ts.isImportDeclaration(statement) &&
|
|
183
|
+
!ts.isExportAssignment(statement) &&
|
|
184
|
+
statement !== rootStatement &&
|
|
185
|
+
!ts.isEmptyStatement(statement))
|
|
186
|
+
throw new Error('Complex legacy config: run sv migrate sveltekit-3 first.');
|
|
187
|
+
const importText = imports.map((s) => s.getText(old)).join('\n');
|
|
188
|
+
content = content.slice(0, call.arguments.pos) + optionText + content.slice(call.arguments.end);
|
|
189
|
+
content = importText + '\n' + content;
|
|
190
|
+
source = parse(content);
|
|
191
|
+
const updated = kitCall(source);
|
|
192
|
+
options = object(updated.arguments[0], source);
|
|
193
|
+
}
|
|
194
|
+
const synthetic = mergeAliasesInSvelteConfig(`export default { kit: ${optionText} };`, aliases);
|
|
195
|
+
const merged = parse(synthetic).statements.find(ts.isExportAssignment);
|
|
196
|
+
const kit = merged.expression.properties[0];
|
|
197
|
+
const replacement = kit.initializer.getText(merged.getSourceFile());
|
|
198
|
+
if (options)
|
|
199
|
+
return content.slice(0, options.getStart(source)) + replacement + content.slice(options.end);
|
|
200
|
+
const actual = kitCall(source);
|
|
201
|
+
return content.slice(0, actual.arguments.pos) + replacement + content.slice(actual.arguments.end);
|
|
202
|
+
}
|
|
203
|
+
function objectOrUndefined(e, source) {
|
|
204
|
+
try {
|
|
205
|
+
return object(e, source);
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
export async function formatConfig(content, file) {
|
|
212
|
+
return format(content, { ...(await resolveConfig(file)), filepath: file, parser: 'typescript' });
|
|
213
|
+
}
|
|
214
|
+
export async function configureKitProject() {
|
|
215
|
+
const root = process.cwd();
|
|
216
|
+
const existing = async (names) => {
|
|
217
|
+
for (const n of names) {
|
|
218
|
+
try {
|
|
219
|
+
await fs.access(path.join(root, n));
|
|
220
|
+
return path.join(root, n);
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
if (error.code !== 'ENOENT')
|
|
224
|
+
throw error;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
const vite = await existing(VITE_CONFIGS), legacy = await existing(SVELTE_CONFIGS);
|
|
229
|
+
if (!vite && !legacy) {
|
|
230
|
+
console.warn('No Vite config found; initialize a SvelteKit project first.');
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const file = vite ?? path.join(root, 'vite.config.ts');
|
|
234
|
+
const content = vite
|
|
235
|
+
? await fs.readFile(vite, 'utf8')
|
|
236
|
+
: "import { defineConfig } from 'vite';\nimport { sveltekit } from '@sveltejs/kit/vite';\nexport default defineConfig({plugins: [sveltekit()]});\n";
|
|
237
|
+
const old = legacy ? await fs.readFile(legacy, 'utf8') : undefined;
|
|
238
|
+
const next = await formatConfig(mergeKitViteConfig(content, ARCHITECTURE_ALIASES, old), file);
|
|
239
|
+
if (legacy) {
|
|
240
|
+
const backup = await fs.mkdtemp(path.join(await fs
|
|
241
|
+
.mkdir(path.join(root, '.azure-net/ConfigBackups'), { recursive: true })
|
|
242
|
+
.then(() => path.join(root, '.azure-net/ConfigBackups')), 'kit3-'));
|
|
243
|
+
await fs.writeFile(path.join(backup, path.basename(legacy)), old);
|
|
244
|
+
if (vite)
|
|
245
|
+
await fs.writeFile(path.join(backup, path.basename(vite)), content);
|
|
246
|
+
}
|
|
247
|
+
await fs.writeFile(file, next);
|
|
248
|
+
if (legacy)
|
|
249
|
+
await fs.unlink(legacy);
|
|
250
|
+
}
|
|
251
|
+
export function readStaticAliases(content) {
|
|
252
|
+
const aliases = {};
|
|
253
|
+
const source = parse(content);
|
|
254
|
+
const visit = (n) => {
|
|
255
|
+
if (ts.isPropertyAssignment(n) && name(n.name) === 'alias') {
|
|
256
|
+
const value = objectOrUndefined(n.initializer, source);
|
|
257
|
+
if (value)
|
|
258
|
+
for (const p of value.properties)
|
|
259
|
+
if (ts.isPropertyAssignment(p) && name(p.name) && ts.isStringLiteral(p.initializer))
|
|
260
|
+
aliases[name(p.name)] = p.initializer.text;
|
|
261
|
+
}
|
|
262
|
+
ts.forEachChild(n, visit);
|
|
263
|
+
};
|
|
264
|
+
visit(source);
|
|
265
|
+
return aliases;
|
|
266
|
+
}
|
|
267
|
+
/** Hydratable needs Svelte async mode. Preserve all unrelated literal options. */
|
|
268
|
+
export function enableHydratable(content) {
|
|
269
|
+
const source = parse(content);
|
|
270
|
+
const call = kitCall(source);
|
|
271
|
+
const update = (value, keys) => {
|
|
272
|
+
const key = keys[0];
|
|
273
|
+
const props = [...value.properties];
|
|
274
|
+
const existing = props.find((p) => name(p.name) === key);
|
|
275
|
+
if (existing && !ts.isPropertyAssignment(existing))
|
|
276
|
+
throw new Error(`Cannot safely configure ${keys.join('.')}. Use literal compilerOptions.`);
|
|
277
|
+
if (props.some(ts.isSpreadAssignment))
|
|
278
|
+
throw new Error('Cannot safely enable async mode in spread options. Set compilerOptions.experimental.async: true manually.');
|
|
279
|
+
const next = keys.length === 1
|
|
280
|
+
? ts.factory.createTrue()
|
|
281
|
+
: update(existing ? object(existing.initializer, source) : ts.factory.createObjectLiteralExpression(), keys.slice(1));
|
|
282
|
+
const index = props.findIndex((p) => name(p.name) === key);
|
|
283
|
+
const property = ts.factory.createPropertyAssignment(key, next);
|
|
284
|
+
if (index === -1)
|
|
285
|
+
props.push(property);
|
|
286
|
+
else
|
|
287
|
+
props[index] = property;
|
|
288
|
+
return ts.factory.createObjectLiteralExpression(props, true);
|
|
289
|
+
};
|
|
290
|
+
const options = call.arguments[0] ? object(call.arguments[0], source) : ts.factory.createObjectLiteralExpression();
|
|
291
|
+
const updated = update(options, ['compilerOptions', 'experimental', 'async']);
|
|
292
|
+
return (content.slice(0, call.getStart(source)) +
|
|
293
|
+
`${call.expression.getText(source)}(${ts.createPrinter().printNode(ts.EmitHint.Expression, updated, source)})` +
|
|
294
|
+
content.slice(call.end));
|
|
295
|
+
}
|
package/.prettierrc
DELETED
package/bin/azure-net.ts
DELETED
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import { Command } from 'commander';
|
|
4
|
-
import { addLint } from '../src/plugins/index.js';
|
|
5
|
-
|
|
6
|
-
const program = new Command();
|
|
7
|
-
|
|
8
|
-
program.name('azure-net').description('Azure-Net CLI generator').version('4.1.0');
|
|
9
|
-
|
|
10
|
-
const addCommand = program.command('add').description('Add project integrations and plugins');
|
|
11
|
-
const createCommand = program.command('create').description('Create project boilerplate artifacts');
|
|
12
|
-
const initCommand = program.command('init').description('Initialize project scaffolding');
|
|
13
|
-
const installCommand = program.command('install').description('Install project presets and flows');
|
|
14
|
-
const generateCommand = program.command('generate').description('Generate UI artifacts');
|
|
15
|
-
const checkCommand = program.command('check').description('Run project checks');
|
|
16
|
-
|
|
17
|
-
addCommand
|
|
18
|
-
.command('commit-tools')
|
|
19
|
-
.description('Setup linting and commit tools')
|
|
20
|
-
.option('-m, --manager <manager>', 'Package manager: bun | pnpm | npm | yarn')
|
|
21
|
-
.action(addLint);
|
|
22
|
-
|
|
23
|
-
createCommand
|
|
24
|
-
.command('schema-factory')
|
|
25
|
-
.description('Create base schema in shared essentials foundation constructs')
|
|
26
|
-
.action(async () => {
|
|
27
|
-
const handler = (await import('../src/scaffolds/createCoreSchema.js')).default;
|
|
28
|
-
await handler();
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
createCommand
|
|
32
|
-
.command('translation-manager')
|
|
33
|
-
.description('Create translation manager in shared essentials localization')
|
|
34
|
-
.action(async () => {
|
|
35
|
-
const handler = (await import('../src/scaffolds/createTranslationManager.js')).default;
|
|
36
|
-
await handler();
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
createCommand
|
|
40
|
-
.command('presenter-factory')
|
|
41
|
-
.description('Create presenter factory in shared essentials foundation constructs')
|
|
42
|
-
.action(async () => {
|
|
43
|
-
const handler = (await import('../src/scaffolds/createPresenterFactory.js')).default;
|
|
44
|
-
await handler();
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
createCommand
|
|
48
|
-
.command('schema-rule')
|
|
49
|
-
.description('Create schema rule in shared essentials foundation constructs')
|
|
50
|
-
.action(async () => {
|
|
51
|
-
const handler = (await import('../src/scaffolds/createSchemaRule.js')).default;
|
|
52
|
-
await handler();
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
createCommand
|
|
56
|
-
.command('response')
|
|
57
|
-
.description('Create response in shared essentials foundation constructs')
|
|
58
|
-
.action(async () => {
|
|
59
|
-
const handler = (await import('../src/scaffolds/createResponse.js')).default;
|
|
60
|
-
await handler();
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
createCommand
|
|
64
|
-
.command('datasource')
|
|
65
|
-
.description('Create datasource in core or context infrastructure')
|
|
66
|
-
.action(async () => {
|
|
67
|
-
const handler = (await import('../src/scaffolds/createDatasource.js')).default;
|
|
68
|
-
await handler();
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
createCommand
|
|
72
|
-
.command('datasource-provider')
|
|
73
|
-
.description('Create datasource provider in core or context infrastructure')
|
|
74
|
-
.action(async () => {
|
|
75
|
-
const handler = (await import('../src/scaffolds/createDatasourceProvider.js')).default;
|
|
76
|
-
await handler();
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
initCommand
|
|
80
|
-
.command('edges')
|
|
81
|
-
.description('Initialize edges plugin in vite config')
|
|
82
|
-
.action(async () => {
|
|
83
|
-
const handler = (await import('../src/init/initEdges.js')).default;
|
|
84
|
-
await handler();
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
initCommand
|
|
88
|
-
.command('folders-structure')
|
|
89
|
-
.description('Generate base folders structure')
|
|
90
|
-
.action(async () => {
|
|
91
|
-
const handler = (await import('../src/init/initStructure.js')).default;
|
|
92
|
-
await handler();
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
initCommand.action(async () => {
|
|
96
|
-
const initStructure = (await import('../src/init/initStructure.js')).default;
|
|
97
|
-
await initStructure();
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
installCommand
|
|
101
|
-
.command('fresh')
|
|
102
|
-
.description('Run full fresh install flow (structure + optional generators)')
|
|
103
|
-
.action(async () => {
|
|
104
|
-
const handler = (await import('../src/install/installFresh.js')).default;
|
|
105
|
-
await handler();
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
generateCommand
|
|
109
|
-
.command('component')
|
|
110
|
-
.description('Generate UI component')
|
|
111
|
-
.action(async () => {
|
|
112
|
-
const handler = (await import('../src/generate/ui/generateComponent.js')).default;
|
|
113
|
-
await handler();
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
generateCommand
|
|
117
|
-
.command('widget')
|
|
118
|
-
.description('Generate UI widget')
|
|
119
|
-
.action(async () => {
|
|
120
|
-
const handler = (await import('../src/generate/ui/generateWidget.js')).default;
|
|
121
|
-
await handler();
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
generateCommand
|
|
125
|
-
.command('design-component')
|
|
126
|
-
.description('Generate UI design component')
|
|
127
|
-
.action(async () => {
|
|
128
|
-
const handler = (await import('../src/generate/ui/generateDesignComponent.js')).default;
|
|
129
|
-
await handler();
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
generateCommand
|
|
133
|
-
.command('repository')
|
|
134
|
-
.description('Generate infrastructure repository')
|
|
135
|
-
.action(async () => {
|
|
136
|
-
const handler = (await import('../src/generate/layers/generateRepository.js')).default;
|
|
137
|
-
await handler();
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
generateCommand
|
|
141
|
-
.command('repo')
|
|
142
|
-
.description('Generate infrastructure repository (module flow)')
|
|
143
|
-
.action(async () => {
|
|
144
|
-
const handler = (await import('../src/generate/module/generateRepository.js')).default;
|
|
145
|
-
await handler();
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
generateCommand
|
|
149
|
-
.command('repository-method')
|
|
150
|
-
.description('Generate method for an existing repository')
|
|
151
|
-
.action(async () => {
|
|
152
|
-
const handler = (await import('../src/generate/layers/generateRepositoryMethod.js')).default;
|
|
153
|
-
await handler();
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
generateCommand
|
|
157
|
-
.command('use-cases')
|
|
158
|
-
.description('Generate use-cases for an existing repository')
|
|
159
|
-
.action(async () => {
|
|
160
|
-
const handler = (await import('../src/generate/module/generateUseCases.js')).default;
|
|
161
|
-
await handler();
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
generateCommand
|
|
165
|
-
.command('domain')
|
|
166
|
-
.description('Generate domain module (model/ports)')
|
|
167
|
-
.action(async () => {
|
|
168
|
-
const handler = (await import('../src/generate/module/generateDomain.js')).default;
|
|
169
|
-
await handler();
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
generateCommand
|
|
173
|
-
.command('presenter')
|
|
174
|
-
.description('Generate presentation layer presenter from UseCases')
|
|
175
|
-
.action(async () => {
|
|
176
|
-
const handler = (await import('../src/generate/module/generatePresenter.js')).default;
|
|
177
|
-
await handler();
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
generateCommand
|
|
181
|
-
.command('types-json')
|
|
182
|
-
.description('Fill model interface keys from JSON')
|
|
183
|
-
.action(async () => {
|
|
184
|
-
const handler = (await import('../src/generate/module/generateTypesJson.js')).default;
|
|
185
|
-
await handler();
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
generateCommand
|
|
189
|
-
.command('schema-from-type')
|
|
190
|
-
.description('Fill schema rules keys from schema generic type')
|
|
191
|
-
.action(async () => {
|
|
192
|
-
const handler = (await import('../src/generate/module/generateSchemaFromType.js')).default;
|
|
193
|
-
await handler();
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
generateCommand
|
|
197
|
-
.command('module')
|
|
198
|
-
.description('Generate domain + repository + presenter flow')
|
|
199
|
-
.action(async () => {
|
|
200
|
-
const handler = (await import('../src/generate/module/generateModule.js')).default;
|
|
201
|
-
await handler();
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
generateCommand
|
|
205
|
-
.command('module-preset')
|
|
206
|
-
.description('Generate preset CRUD-like module flow')
|
|
207
|
-
.action(async () => {
|
|
208
|
-
const handler = (await import('../src/generate/module/generateModulePreset.js')).default;
|
|
209
|
-
await handler();
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
generateCommand
|
|
213
|
-
.command('routes')
|
|
214
|
-
.description('Generate typed SvelteKit routes list')
|
|
215
|
-
.action(async () => {
|
|
216
|
-
const handler = (await import('../src/generate/routes/generateRoutes.js')).default;
|
|
217
|
-
await handler();
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
checkCommand
|
|
221
|
-
.command('presenter-names')
|
|
222
|
-
.description('Check duplicate presenter names in src')
|
|
223
|
-
.action(async () => {
|
|
224
|
-
const handler = (await import('../src/checks/checkPresenterNames.js')).default;
|
|
225
|
-
await handler();
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
checkCommand
|
|
229
|
-
.command('provider-names')
|
|
230
|
-
.description('Check duplicate provider names in src')
|
|
231
|
-
.action(async () => {
|
|
232
|
-
const handler = (await import('../src/checks/checkProviderNames.js')).default;
|
|
233
|
-
await handler();
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
checkCommand
|
|
237
|
-
.command('provider-graph')
|
|
238
|
-
.description('Check provider dependency graph for cycles')
|
|
239
|
-
.action(async () => {
|
|
240
|
-
const handler = (await import('../src/checks/checkProviderGraph.js')).default;
|
|
241
|
-
await handler();
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
checkCommand
|
|
245
|
-
.command('domain')
|
|
246
|
-
.description('Check domain naming and structure rules in all contexts')
|
|
247
|
-
.action(async () => {
|
|
248
|
-
const handler = (await import('../src/checks/checkDomain.js')).default;
|
|
249
|
-
await handler();
|
|
250
|
-
});
|
|
251
|
-
|
|
252
|
-
checkCommand
|
|
253
|
-
.command('imports')
|
|
254
|
-
.description('Check import extensions and import group order in src')
|
|
255
|
-
.action(async () => {
|
|
256
|
-
const handler = (await import('../src/checks/checkImports.js')).default;
|
|
257
|
-
await handler();
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
checkCommand
|
|
261
|
-
.command('hooks')
|
|
262
|
-
.description('Check that manual SvelteKit hooks are not present')
|
|
263
|
-
.action(async () => {
|
|
264
|
-
const handler = (await import('../src/checks/checkHooks.js')).default;
|
|
265
|
-
await handler();
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
checkCommand
|
|
269
|
-
.command('layer-imports')
|
|
270
|
-
.description('Check forbidden imports between layers inside each context')
|
|
271
|
-
.action(async () => {
|
|
272
|
-
const handler = (await import('../src/checks/checkLayerImports.js')).default;
|
|
273
|
-
await handler();
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
checkCommand
|
|
277
|
-
.command('layer-boundaries')
|
|
278
|
-
.description('Check layer boundaries between contexts by aliases')
|
|
279
|
-
.action(async () => {
|
|
280
|
-
const handler = (await import('../src/checks/checkLayerBoundaries.js')).default;
|
|
281
|
-
await handler();
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
checkCommand
|
|
285
|
-
.command('folders-structure')
|
|
286
|
-
.description('Check allowed folders structure in context layers/ui/components')
|
|
287
|
-
.action(async () => {
|
|
288
|
-
const handler = (await import('../src/checks/checkFoldersStructure.js')).default;
|
|
289
|
-
await handler();
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
checkCommand
|
|
293
|
-
.command('internal')
|
|
294
|
-
.description('Run all internal azure-net checks')
|
|
295
|
-
.action(async () => {
|
|
296
|
-
const handler = (await import('../src/checks/checkInternal.js')).default;
|
|
297
|
-
await handler();
|
|
298
|
-
});
|
|
299
|
-
|
|
300
|
-
checkCommand
|
|
301
|
-
.command('project')
|
|
302
|
-
.description('Run full project checks: format, internal, lint, typecheck')
|
|
303
|
-
.action(async () => {
|
|
304
|
-
const handler = (await import('../src/checks/checkProject.js')).default;
|
|
305
|
-
await handler();
|
|
306
|
-
});
|
|
307
|
-
|
|
308
|
-
program.parse();
|
package/eslint.config.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import js from '@eslint/js';
|
|
2
|
-
import tseslint from 'typescript-eslint';
|
|
3
|
-
|
|
4
|
-
export default tseslint.config(
|
|
5
|
-
{
|
|
6
|
-
ignores: ['dist/**', 'node_modules/**']
|
|
7
|
-
},
|
|
8
|
-
js.configs.recommended,
|
|
9
|
-
...tseslint.configs.recommended,
|
|
10
|
-
{
|
|
11
|
-
files: ['bin/**/*.ts', 'src/plugins/**/*.ts'],
|
|
12
|
-
languageOptions: {
|
|
13
|
-
globals: {
|
|
14
|
-
console: 'readonly',
|
|
15
|
-
process: 'readonly'
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
files: [
|
|
21
|
-
'src/generate/module/repositoryModuleShared.ts',
|
|
22
|
-
'src/generate/layers/repositoryShared.ts',
|
|
23
|
-
'src/generate/layers/generateUseCases.ts',
|
|
24
|
-
'src/generate/layers/generateRepositoryMethod.ts',
|
|
25
|
-
'src/generate/layers/generateRepository.ts',
|
|
26
|
-
'src/utils/contextUtils.ts',
|
|
27
|
-
'src/utils/loadConfig.ts',
|
|
28
|
-
'src/utils/fileUtils.ts'
|
|
29
|
-
],
|
|
30
|
-
rules: {
|
|
31
|
-
'@typescript-eslint/ban-ts-comment': 'off'
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
);
|