@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
|
@@ -1,266 +1,206 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import prompts from 'prompts';
|
|
4
|
-
import {
|
|
5
|
-
import { updateIndexTs, writeIfNotExists } from '../../utils/fileUtils.js';
|
|
4
|
+
import { toPascalCase } from '../../utils/contextUtils.js';
|
|
5
|
+
import { appendBarrelExports, updateIndexTs, writeIfNotExists } from '../../utils/fileUtils.js';
|
|
6
6
|
import generatePresenter from './generatePresenter.js';
|
|
7
|
-
import {
|
|
8
|
-
buildRepositoryContent,
|
|
9
|
-
createUseCasesForRepository,
|
|
10
|
-
getAvailableTsNames,
|
|
11
|
-
getConfigState,
|
|
12
|
-
getRepositoryMeta,
|
|
13
|
-
resolveContextAlias,
|
|
14
|
-
resolveDatasourcesPath,
|
|
15
|
-
resolveDomainRootPath,
|
|
16
|
-
resolveRepositoriesPath,
|
|
17
|
-
resolveSharedDatasourcesPath,
|
|
18
|
-
selectContext,
|
|
19
|
-
writeRepositoryInterface
|
|
20
|
-
} from './repositoryModuleShared.js';
|
|
21
|
-
import { getFoundationConstructImportPath } from '../../utils/sharedFoundation.js';
|
|
7
|
+
import { buildRepositoryContent, createUseCasesForRepository, getAvailableTsNames, getConfigState, getRepositoryMeta, resolveContextAlias, resolveDomainRootPath, resolveRepositoriesPath, resolveSharedDatasourcesPath, selectContext, printApplicationProviderWiring, writeRepositoryInterface } from './repositoryModuleShared.js';
|
|
22
8
|
const toInterfaceFileName = (interfaceName) => `${String(interfaceName ?? '').replace(/^I/, '') || 'Type'}.ts`;
|
|
23
9
|
const createInterfaceContent = (interfaceName) => `export interface ${interfaceName} {
|
|
24
10
|
\t[key: string]: unknown;
|
|
25
11
|
}
|
|
26
12
|
`;
|
|
27
13
|
const writeDomainIndexes = async (domainPath, modelPath, portsPath) => {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
14
|
+
await updateIndexTs(modelPath);
|
|
15
|
+
await updateIndexTs(portsPath);
|
|
16
|
+
await appendBarrelExports(path.join(domainPath, 'index.ts'), ['./Entities', './Ports', './Enums']);
|
|
31
17
|
};
|
|
32
18
|
const ensureDomainScaffold = async ({ contextName, entityNamePascal, domainName }) => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
19
|
+
const domainPath = resolveDomainRootPath(contextName, domainName);
|
|
20
|
+
const modelPath = path.join(domainPath, 'Entities');
|
|
21
|
+
const portsPath = path.join(domainPath, 'Ports');
|
|
22
|
+
await fs.mkdir(modelPath, { recursive: true });
|
|
23
|
+
await fs.mkdir(portsPath, { recursive: true });
|
|
24
|
+
const modelInterfaces = [`I${entityNamePascal}`];
|
|
25
|
+
const portInterfaces = [
|
|
26
|
+
`I${entityNamePascal}CreateRequest`,
|
|
27
|
+
`I${entityNamePascal}UpdateRequest`,
|
|
28
|
+
`I${entityNamePascal}CollectionResponse`,
|
|
29
|
+
`I${entityNamePascal}CollectionQuery`
|
|
30
|
+
];
|
|
31
|
+
for (const interfaceName of modelInterfaces) {
|
|
32
|
+
const filePath = path.join(modelPath, toInterfaceFileName(interfaceName));
|
|
33
|
+
await writeIfNotExists(filePath, createInterfaceContent(interfaceName));
|
|
34
|
+
}
|
|
35
|
+
for (const interfaceName of portInterfaces) {
|
|
36
|
+
const filePath = path.join(portsPath, toInterfaceFileName(interfaceName));
|
|
37
|
+
await writeIfNotExists(filePath, createInterfaceContent(interfaceName));
|
|
38
|
+
}
|
|
39
|
+
await fs.mkdir(path.join(domainPath, 'Enums'), { recursive: true });
|
|
40
|
+
await updateIndexTs(path.join(domainPath, 'Enums'));
|
|
41
|
+
await writeDomainIndexes(domainPath, modelPath, portsPath);
|
|
42
|
+
return { domainPath, modelPath, portsPath };
|
|
55
43
|
};
|
|
56
|
-
const resolveDatasourceForPreset = async (
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const contextDatasources = await getAvailableTsNames(resolveDatasourcesPath(contextName));
|
|
61
|
-
if (sharedDatasources.includes('ApiDatasource')) {
|
|
62
|
-
return { name: 'ApiDatasource', importPath: getFoundationConstructImportPath(sharedAlias, 'datasource') };
|
|
63
|
-
}
|
|
64
|
-
if (contextDatasources.includes('ApiDatasource')) {
|
|
65
|
-
return { name: 'ApiDatasource', importPath: `${contextAlias}/layers/infrastructure/http/datasources` };
|
|
66
|
-
}
|
|
67
|
-
if (sharedDatasources.length) {
|
|
68
|
-
return { name: sharedDatasources[0], importPath: getFoundationConstructImportPath(sharedAlias, 'datasource') };
|
|
69
|
-
}
|
|
70
|
-
if (contextDatasources.length) {
|
|
71
|
-
return { name: contextDatasources[0], importPath: `${contextAlias}/layers/infrastructure/http/datasources` };
|
|
72
|
-
}
|
|
73
|
-
return null;
|
|
44
|
+
const resolveDatasourceForPreset = async () => {
|
|
45
|
+
const names = await getAvailableTsNames(await resolveSharedDatasourcesPath());
|
|
46
|
+
const name = names.includes('ApiDatasource') ? 'ApiDatasource' : names[0];
|
|
47
|
+
return name ? { name, importPath: '#platform/Foundation/Datasource' } : null;
|
|
74
48
|
};
|
|
75
49
|
const buildPresetMethods = ({ entityNamePascal, route, pathParamType }) => [
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
50
|
+
{
|
|
51
|
+
name: 'collection',
|
|
52
|
+
httpMethod: 'get',
|
|
53
|
+
route,
|
|
54
|
+
response: { kind: 'domain', type: `I${entityNamePascal}CollectionResponse`, layer: 'Ports' },
|
|
55
|
+
queryType: { name: `I${entityNamePascal}CollectionQuery`, layer: 'Ports' },
|
|
56
|
+
bodyType: null,
|
|
57
|
+
pathParamType: null
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: 'resource',
|
|
61
|
+
httpMethod: 'get',
|
|
62
|
+
route,
|
|
63
|
+
response: { kind: 'domain', type: `I${entityNamePascal}`, layer: 'Entities' },
|
|
64
|
+
queryType: null,
|
|
65
|
+
bodyType: null,
|
|
66
|
+
pathParamType
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: 'create',
|
|
70
|
+
httpMethod: 'post',
|
|
71
|
+
route,
|
|
72
|
+
response: { kind: 'domain', type: `I${entityNamePascal}`, layer: 'Entities' },
|
|
73
|
+
queryType: null,
|
|
74
|
+
bodyType: { name: `I${entityNamePascal}CreateRequest`, layer: 'Ports' },
|
|
75
|
+
pathParamType: null
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: 'update',
|
|
79
|
+
httpMethod: 'put',
|
|
80
|
+
route,
|
|
81
|
+
response: { kind: 'domain', type: `I${entityNamePascal}`, layer: 'Entities' },
|
|
82
|
+
queryType: null,
|
|
83
|
+
bodyType: { name: `I${entityNamePascal}UpdateRequest`, layer: 'Ports' },
|
|
84
|
+
pathParamType
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: 'destroy',
|
|
88
|
+
httpMethod: 'delete',
|
|
89
|
+
route,
|
|
90
|
+
response: { kind: 'primitive', type: 'never', layer: null },
|
|
91
|
+
queryType: null,
|
|
92
|
+
bodyType: null,
|
|
93
|
+
pathParamType
|
|
94
|
+
}
|
|
121
95
|
];
|
|
122
|
-
const findProviderFile = async (contextName, layerName, preferredFileName) => {
|
|
123
|
-
const providersPath = path.join(process.cwd(), 'src', 'app', contextName, 'layers', layerName, 'providers');
|
|
124
|
-
const preferredPath = path.join(providersPath, preferredFileName);
|
|
125
|
-
try {
|
|
126
|
-
await fs.access(preferredPath);
|
|
127
|
-
return preferredPath;
|
|
128
|
-
} catch {
|
|
129
|
-
try {
|
|
130
|
-
const files = await fs.readdir(providersPath);
|
|
131
|
-
const firstTs = files.find((item) => item.endsWith('.ts') && item !== 'index.ts');
|
|
132
|
-
return firstTs ? path.join(providersPath, firstTs) : preferredPath;
|
|
133
|
-
} catch {
|
|
134
|
-
return preferredPath;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
const parseProviderConstName = async (providerPath, fallbackName) => {
|
|
139
|
-
try {
|
|
140
|
-
const content = await fs.readFile(providerPath, 'utf-8');
|
|
141
|
-
const match = content.match(/export\s+const\s+([A-Za-z_][A-Za-z0-9_]*)\s*=\s*createBoundaryProvider/);
|
|
142
|
-
return match?.[1] ?? fallbackName;
|
|
143
|
-
} catch {
|
|
144
|
-
return fallbackName;
|
|
145
|
-
}
|
|
146
|
-
};
|
|
147
96
|
export default async function generateModulePreset() {
|
|
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
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
.toLowerCase();
|
|
258
|
-
if (normalizedReadyAnswer !== 'y') {
|
|
259
|
-
console.log('ℹ️ Preset module flow paused. Complete provider wiring and run `azure-net generate presenter`.');
|
|
260
|
-
return;
|
|
261
|
-
}
|
|
262
|
-
await generatePresenter({
|
|
263
|
-
contextName,
|
|
264
|
-
useCasesName: meta.useCasesClassName
|
|
265
|
-
});
|
|
97
|
+
const contextName = await selectContext('Select context for preset module:');
|
|
98
|
+
if (!contextName) {
|
|
99
|
+
process.exitCode = 1;
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const { entityNameRaw } = await prompts({
|
|
103
|
+
type: 'text',
|
|
104
|
+
name: 'entityNameRaw',
|
|
105
|
+
message: 'Module name:',
|
|
106
|
+
validate: (value) => (String(value ?? '').trim().length > 0 ? true : 'Module name is required')
|
|
107
|
+
});
|
|
108
|
+
const { routeRaw } = await prompts({
|
|
109
|
+
type: 'text',
|
|
110
|
+
name: 'routeRaw',
|
|
111
|
+
message: 'Base request path (e.g. /users):',
|
|
112
|
+
initial: '/resource',
|
|
113
|
+
validate: (value) => {
|
|
114
|
+
const route = String(value ?? '').trim();
|
|
115
|
+
if (!route.length)
|
|
116
|
+
return 'Path is required';
|
|
117
|
+
return route.startsWith('/') ? true : 'Path must start with "/"';
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
const { pathParamType } = await prompts({
|
|
121
|
+
type: 'select',
|
|
122
|
+
name: 'pathParamType',
|
|
123
|
+
message: 'Path param type:',
|
|
124
|
+
choices: [
|
|
125
|
+
{ title: 'string', value: 'string' },
|
|
126
|
+
{ title: 'number', value: 'number' }
|
|
127
|
+
],
|
|
128
|
+
initial: 0
|
|
129
|
+
});
|
|
130
|
+
const entityNamePascal = toPascalCase(String(entityNameRaw ?? '').trim());
|
|
131
|
+
if (!entityNamePascal) {
|
|
132
|
+
console.error('❌ Invalid module name.');
|
|
133
|
+
process.exitCode = 1;
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const route = String(routeRaw ?? '').trim();
|
|
137
|
+
if (!route) {
|
|
138
|
+
console.error('❌ Invalid route.');
|
|
139
|
+
process.exitCode = 1;
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const resolvedPathParamType = pathParamType === 'number' ? 'number' : 'string';
|
|
143
|
+
const domainName = contextName;
|
|
144
|
+
await ensureDomainScaffold({ contextName, entityNamePascal, domainName });
|
|
145
|
+
const datasource = await resolveDatasourceForPreset();
|
|
146
|
+
if (!datasource) {
|
|
147
|
+
console.error('❌ No datasource found in Platform/Foundation/Datasource. Create datasource first.');
|
|
148
|
+
process.exitCode = 1;
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const methods = buildPresetMethods({
|
|
152
|
+
entityNamePascal,
|
|
153
|
+
route,
|
|
154
|
+
pathParamType: resolvedPathParamType
|
|
155
|
+
});
|
|
156
|
+
const repositoryClassName = `${entityNamePascal}Repository`;
|
|
157
|
+
const meta = getRepositoryMeta(repositoryClassName);
|
|
158
|
+
const { contexts } = await getConfigState();
|
|
159
|
+
const contextAlias = resolveContextAlias(contexts, contextName);
|
|
160
|
+
await writeRepositoryInterface({
|
|
161
|
+
contextName,
|
|
162
|
+
domainName,
|
|
163
|
+
meta,
|
|
164
|
+
methods
|
|
165
|
+
});
|
|
166
|
+
const repositoryContent = buildRepositoryContent({
|
|
167
|
+
meta,
|
|
168
|
+
contextAlias,
|
|
169
|
+
domainName,
|
|
170
|
+
datasource,
|
|
171
|
+
methods
|
|
172
|
+
});
|
|
173
|
+
const repositoriesPath = resolveRepositoriesPath(contextName);
|
|
174
|
+
await fs.mkdir(repositoriesPath, { recursive: true });
|
|
175
|
+
const repositoryPath = path.join(repositoriesPath, `${meta.className}.ts`);
|
|
176
|
+
const createdRepository = await writeIfNotExists(repositoryPath, repositoryContent);
|
|
177
|
+
await updateIndexTs(repositoriesPath);
|
|
178
|
+
if (!createdRepository) {
|
|
179
|
+
console.error(`❌ Repository "${meta.className}" already exists. Preset flow stopped.`);
|
|
180
|
+
process.exitCode = 1;
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
await createUseCasesForRepository({
|
|
184
|
+
contextName,
|
|
185
|
+
contextAlias,
|
|
186
|
+
domainName,
|
|
187
|
+
repositoryName: meta.className
|
|
188
|
+
});
|
|
189
|
+
printApplicationProviderWiring(contextName, meta.className, datasource.name);
|
|
190
|
+
const { readyAnswer } = await prompts({
|
|
191
|
+
type: 'text',
|
|
192
|
+
name: 'readyAnswer',
|
|
193
|
+
message: 'Type "y" when provider wiring is done:'
|
|
194
|
+
});
|
|
195
|
+
const normalizedReadyAnswer = String(readyAnswer ?? '')
|
|
196
|
+
.trim()
|
|
197
|
+
.toLowerCase();
|
|
198
|
+
if (normalizedReadyAnswer !== 'y') {
|
|
199
|
+
console.log('ℹ️ Preset module flow paused. Complete provider wiring and run `azure-net generate presenter`.');
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
await generatePresenter({
|
|
203
|
+
contextName,
|
|
204
|
+
useCasesName: meta.useCasesClassName
|
|
205
|
+
});
|
|
266
206
|
}
|