@azure-net/cli 5.1.0 → 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 +165 -174
- 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 -282
- 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,127 +1,108 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import prompts from 'prompts';
|
|
4
|
-
import {
|
|
5
|
-
buildRepositoryContent,
|
|
6
|
-
createUseCasesForRepository,
|
|
7
|
-
ensureRepositoryName,
|
|
8
|
-
getConfigState,
|
|
9
|
-
getDomainTypes,
|
|
10
|
-
getRepositoryMeta,
|
|
11
|
-
promptMethodsBatch,
|
|
12
|
-
resolveContextAlias,
|
|
13
|
-
resolveRepositoriesPath,
|
|
14
|
-
selectContext,
|
|
15
|
-
selectDatasource,
|
|
16
|
-
selectDomain,
|
|
17
|
-
writeRepositoryInterface
|
|
18
|
-
} from './repositoryModuleShared.js';
|
|
4
|
+
import { buildRepositoryContent, createUseCasesForRepository, ensureRepositoryName, getConfigState, getDomainTypes, getRepositoryMeta, promptMethodsBatch, resolveContextAlias, resolveRepositoriesPath, selectContext, selectDatasource, writeRepositoryInterface } from './repositoryModuleShared.js';
|
|
19
5
|
import { updateIndexTs, writeIfNotExists } from '../../utils/fileUtils.js';
|
|
20
6
|
export default async function generateRepository(options = {}) {
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
domainName,
|
|
123
|
-
repositoryName: meta.className,
|
|
124
|
-
useCasesName: meta.useCasesClassName,
|
|
125
|
-
useCasesCreated
|
|
126
|
-
};
|
|
7
|
+
let contextName = options.contextName ? String(options.contextName) : null;
|
|
8
|
+
if (!contextName) {
|
|
9
|
+
contextName = await selectContext('Select context for repository:');
|
|
10
|
+
}
|
|
11
|
+
if (!contextName) {
|
|
12
|
+
process.exitCode = 1;
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const domainName = contextName;
|
|
16
|
+
const { repositoryNameRaw } = await prompts({
|
|
17
|
+
type: 'text',
|
|
18
|
+
name: 'repositoryNameRaw',
|
|
19
|
+
message: 'Repository name:',
|
|
20
|
+
validate: (value) => (String(value ?? '').trim().length > 0 ? true : 'Repository name is required')
|
|
21
|
+
});
|
|
22
|
+
const className = ensureRepositoryName(repositoryNameRaw);
|
|
23
|
+
const meta = getRepositoryMeta(className);
|
|
24
|
+
const datasource = await selectDatasource(contextName);
|
|
25
|
+
if (!datasource) {
|
|
26
|
+
process.exitCode = 1;
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const domainTypes = await getDomainTypes(contextName, domainName);
|
|
30
|
+
const { methodsCountRaw } = await prompts({
|
|
31
|
+
type: 'number',
|
|
32
|
+
name: 'methodsCountRaw',
|
|
33
|
+
message: 'How many methods to create?',
|
|
34
|
+
initial: 1,
|
|
35
|
+
min: 0
|
|
36
|
+
});
|
|
37
|
+
const methodsCount = Number(methodsCountRaw ?? 0);
|
|
38
|
+
if (!Number.isInteger(methodsCount) || methodsCount < 0) {
|
|
39
|
+
console.error('❌ Invalid methods count.');
|
|
40
|
+
process.exitCode = 1;
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const methods = await promptMethodsBatch(domainTypes, methodsCount);
|
|
44
|
+
if (!methods) {
|
|
45
|
+
process.exitCode = 1;
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const { contexts } = await getConfigState();
|
|
49
|
+
const contextAlias = resolveContextAlias(contexts, contextName);
|
|
50
|
+
const repositoriesPath = resolveRepositoriesPath(contextName);
|
|
51
|
+
await fs.mkdir(repositoriesPath, { recursive: true });
|
|
52
|
+
const repositoryPath = path.join(repositoriesPath, `${meta.className}.ts`);
|
|
53
|
+
const interfaceCreated = await writeRepositoryInterface({
|
|
54
|
+
contextName,
|
|
55
|
+
domainName,
|
|
56
|
+
meta,
|
|
57
|
+
methods
|
|
58
|
+
});
|
|
59
|
+
if (!interfaceCreated)
|
|
60
|
+
throw new Error('Repository interface already exists; no repository was generated.');
|
|
61
|
+
const repositoryContent = buildRepositoryContent({
|
|
62
|
+
meta,
|
|
63
|
+
contextAlias,
|
|
64
|
+
domainName,
|
|
65
|
+
datasource,
|
|
66
|
+
domainTypes,
|
|
67
|
+
methods
|
|
68
|
+
});
|
|
69
|
+
const created = await writeIfNotExists(repositoryPath, repositoryContent);
|
|
70
|
+
await updateIndexTs(repositoriesPath);
|
|
71
|
+
if (!created) {
|
|
72
|
+
console.warn(`⚠️ Repository "${meta.className}" already exists. File was not overwritten.`);
|
|
73
|
+
process.exitCode = 1;
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
const { shouldCreateUseCases } = await prompts({
|
|
77
|
+
type: 'confirm',
|
|
78
|
+
name: 'shouldCreateUseCases',
|
|
79
|
+
message: 'Create UseCases for this repository?',
|
|
80
|
+
initial: true
|
|
81
|
+
});
|
|
82
|
+
let useCasesCreated = false;
|
|
83
|
+
if (shouldCreateUseCases) {
|
|
84
|
+
useCasesCreated = await createUseCasesForRepository({
|
|
85
|
+
contextName,
|
|
86
|
+
contextAlias,
|
|
87
|
+
domainName,
|
|
88
|
+
repositoryName: meta.className
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
if (!shouldCreateUseCases && options.forceCreateUseCases) {
|
|
92
|
+
useCasesCreated = await createUseCasesForRepository({
|
|
93
|
+
contextName,
|
|
94
|
+
contextAlias,
|
|
95
|
+
domainName,
|
|
96
|
+
repositoryName: meta.className
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
console.log(`✅ Repository generated: ${repositoryPath}`);
|
|
100
|
+
return {
|
|
101
|
+
contextName,
|
|
102
|
+
domainName,
|
|
103
|
+
repositoryName: meta.className,
|
|
104
|
+
useCasesName: meta.useCasesClassName,
|
|
105
|
+
useCasesCreated,
|
|
106
|
+
datasourceName: datasource.name
|
|
107
|
+
};
|
|
127
108
|
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import ts from 'typescript';
|
|
4
|
+
import prompts from 'prompts';
|
|
5
|
+
import { getDomainTypes, getRepositoryMeta, getAvailableTsNames, selectContext, resolveRepositoriesPath, resolveDomainRootPath, resolveUseCasesPath, promptMethodDefinition, buildRepositoryContent, buildRepositoryMethodCode } from './repositoryModuleShared.js';
|
|
6
|
+
const parse = (content) => ts.createSourceFile('Source.ts', content, ts.ScriptTarget.Latest, true);
|
|
7
|
+
export function addTypeImports(content, generated) {
|
|
8
|
+
const existing = new Set();
|
|
9
|
+
for (const node of parse(content).statements)
|
|
10
|
+
if (ts.isInterfaceDeclaration(node) || ts.isClassDeclaration(node) || ts.isTypeAliasDeclaration(node)) {
|
|
11
|
+
if (node.name)
|
|
12
|
+
existing.add(node.name.text);
|
|
13
|
+
}
|
|
14
|
+
for (const statement of parse(content).statements)
|
|
15
|
+
if (ts.isImportDeclaration(statement)) {
|
|
16
|
+
const bindings = statement.importClause?.namedBindings;
|
|
17
|
+
if (bindings && ts.isNamedImports(bindings))
|
|
18
|
+
for (const item of bindings.elements)
|
|
19
|
+
existing.add(item.name.text);
|
|
20
|
+
}
|
|
21
|
+
const additions = [];
|
|
22
|
+
for (const statement of parse(generated).statements)
|
|
23
|
+
if (ts.isImportDeclaration(statement) && statement.importClause?.isTypeOnly) {
|
|
24
|
+
const bindings = statement.importClause.namedBindings;
|
|
25
|
+
if (!bindings || !ts.isNamedImports(bindings))
|
|
26
|
+
continue;
|
|
27
|
+
const names = bindings.elements.filter((item) => !existing.has(item.name.text)).map((item) => item.name.text);
|
|
28
|
+
if (names.length)
|
|
29
|
+
additions.push(`import type { ${names.join(', ')} } from ${statement.moduleSpecifier.getText()};`);
|
|
30
|
+
}
|
|
31
|
+
if (!additions.length)
|
|
32
|
+
return content;
|
|
33
|
+
const imports = parse(content).statements.filter(ts.isImportDeclaration);
|
|
34
|
+
const end = imports.at(-1)?.end ?? 0;
|
|
35
|
+
return content.slice(0, end) + '\n' + additions.join('\n') + '\n' + content.slice(end);
|
|
36
|
+
}
|
|
37
|
+
export default async function generateRepositoryMethod() {
|
|
38
|
+
const context = await selectContext();
|
|
39
|
+
if (!context)
|
|
40
|
+
return;
|
|
41
|
+
const names = await getAvailableTsNames(resolveRepositoriesPath(context));
|
|
42
|
+
if (!names.length)
|
|
43
|
+
throw new Error('No repositories found in this context.');
|
|
44
|
+
const answer = await prompts({
|
|
45
|
+
type: 'select',
|
|
46
|
+
name: 'repository',
|
|
47
|
+
message: 'Repository:',
|
|
48
|
+
choices: names.map((name) => ({ title: name, value: name }))
|
|
49
|
+
});
|
|
50
|
+
if (!answer.repository)
|
|
51
|
+
return;
|
|
52
|
+
const meta = getRepositoryMeta(answer.repository);
|
|
53
|
+
const repositoryFile = path.join(resolveRepositoriesPath(context), meta.className + '.ts');
|
|
54
|
+
const types = await getDomainTypes(context);
|
|
55
|
+
const contract = types.find((type) => type.name === meta.repositoryInterfaceName && type.layer === 'Ports');
|
|
56
|
+
if (!contract)
|
|
57
|
+
throw new Error(`Interface ${meta.repositoryInterfaceName} was not found in Domain/Ports.`);
|
|
58
|
+
const interfaceFile = path.join(resolveDomainRootPath(context), 'Ports', contract.fileName + '.ts');
|
|
59
|
+
const method = await promptMethodDefinition(types);
|
|
60
|
+
if (!method)
|
|
61
|
+
return;
|
|
62
|
+
const repositoryContent = await fs.readFile(repositoryFile, 'utf8');
|
|
63
|
+
const interfaceContent = await fs.readFile(interfaceFile, 'utf8');
|
|
64
|
+
const repositoryNode = parse(repositoryContent).statements.find((node) => ts.isClassDeclaration(node) && node.name?.text === meta.className);
|
|
65
|
+
const interfaceNode = parse(interfaceContent).statements.find((node) => ts.isInterfaceDeclaration(node) && node.name.text === meta.repositoryInterfaceName);
|
|
66
|
+
if (!repositoryNode || !interfaceNode)
|
|
67
|
+
throw new Error('Unable to locate the repository class and its interface. Files were not changed.');
|
|
68
|
+
if ([...repositoryNode.members, ...interfaceNode.members].some((member) => member.name?.getText() === method.name))
|
|
69
|
+
throw new Error(`Method ${method.name} already exists.`);
|
|
70
|
+
const generated = buildRepositoryContent({
|
|
71
|
+
meta,
|
|
72
|
+
contextAlias: `#contexts/${context}`,
|
|
73
|
+
domainName: context,
|
|
74
|
+
domainTypes: types,
|
|
75
|
+
datasource: { name: 'Datasource', importPath: 'unused' },
|
|
76
|
+
methods: [method]
|
|
77
|
+
});
|
|
78
|
+
const params = [
|
|
79
|
+
method.pathParamType ? `pathParam: ${method.pathParamType}` : '',
|
|
80
|
+
method.queryType ? `request: ${method.queryType.name}` : '',
|
|
81
|
+
method.bodyType ? `request: ${method.bodyType.name}` : ''
|
|
82
|
+
]
|
|
83
|
+
.filter(Boolean)
|
|
84
|
+
.join(', ');
|
|
85
|
+
const signature = `\n\t${method.name}(${params}): Promise<${method.response.type}>;\n`;
|
|
86
|
+
const repositoryNext = addTypeImports(repositoryContent.slice(0, repositoryNode.end - 1) +
|
|
87
|
+
'\n' +
|
|
88
|
+
buildRepositoryMethodCode(method) +
|
|
89
|
+
'\n' +
|
|
90
|
+
repositoryContent.slice(repositoryNode.end - 1), generated);
|
|
91
|
+
const interfaceNext = addTypeImports(interfaceContent.slice(0, interfaceNode.end - 1) + signature + interfaceContent.slice(interfaceNode.end - 1), generated);
|
|
92
|
+
const useCasesFile = path.join(resolveUseCasesPath(context), meta.useCasesClassName + '.ts');
|
|
93
|
+
let useCasesContent;
|
|
94
|
+
try {
|
|
95
|
+
useCasesContent = await fs.readFile(useCasesFile, 'utf8');
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (error.code !== 'ENOENT')
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
let useCasesNext;
|
|
102
|
+
if (useCasesContent !== undefined) {
|
|
103
|
+
const node = parse(useCasesContent).statements.find((item) => ts.isClassDeclaration(item) && item.name?.text === meta.useCasesClassName);
|
|
104
|
+
if (!node)
|
|
105
|
+
throw new Error('Unable to update existing UseCases safely. Files were not changed.');
|
|
106
|
+
if (!node.members.some((member) => member.name?.getText() === method.name))
|
|
107
|
+
useCasesNext =
|
|
108
|
+
useCasesContent.slice(0, node.end - 1) +
|
|
109
|
+
`\n\tdeclare ${method.name}: ${meta.repositoryInterfaceName}['${method.name}'];\n` +
|
|
110
|
+
useCasesContent.slice(node.end - 1);
|
|
111
|
+
}
|
|
112
|
+
await fs.writeFile(repositoryFile, repositoryNext);
|
|
113
|
+
await fs.writeFile(interfaceFile, interfaceNext);
|
|
114
|
+
if (useCasesNext !== undefined)
|
|
115
|
+
await fs.writeFile(useCasesFile, useCasesNext);
|
|
116
|
+
console.log(`Added ${method.name} to ${meta.className}, its contract and existing UseCases.`);
|
|
117
|
+
}
|