@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.
Files changed (180) hide show
  1. package/README.md +201 -0
  2. package/bin/azure-net.js +236 -221
  3. package/dist/bin/azure-net.d.ts +2 -0
  4. package/dist/src/checks/architecture.d.ts +20 -0
  5. package/dist/src/checks/checkDomain.d.ts +1 -0
  6. package/dist/src/checks/checkFoldersStructure.d.ts +1 -0
  7. package/dist/src/checks/checkHooks.d.ts +1 -0
  8. package/dist/src/checks/checkImports.d.ts +1 -0
  9. package/dist/src/checks/checkInternal.d.ts +1 -0
  10. package/dist/src/checks/checkLayerBoundaries.d.ts +1 -0
  11. package/dist/src/checks/checkLayerImports.d.ts +1 -0
  12. package/dist/src/checks/checkPresenterNames.d.ts +1 -0
  13. package/dist/src/checks/checkProject.d.ts +1 -0
  14. package/dist/src/checks/checkProviderGraph.d.ts +1 -0
  15. package/dist/src/checks/checkProviderNames.d.ts +1 -0
  16. package/dist/src/generate/layers/generateRepository.d.ts +1 -0
  17. package/dist/src/generate/layers/generateRepositoryMethod.d.ts +1 -0
  18. package/dist/src/generate/layers/generateUseCases.d.ts +1 -0
  19. package/dist/src/generate/module/generateDomain.d.ts +8 -0
  20. package/dist/src/generate/module/generateModule.d.ts +1 -0
  21. package/dist/src/generate/module/generateModulePreset.d.ts +1 -0
  22. package/dist/src/generate/module/generatePresenter.d.ts +29 -0
  23. package/dist/src/generate/module/generateRepository.d.ts +15 -0
  24. package/dist/src/generate/module/generateRepositoryMethod.d.ts +2 -0
  25. package/dist/src/generate/module/generateSchemaFromType.d.ts +9 -0
  26. package/dist/src/generate/module/generateStore.d.ts +1 -0
  27. package/dist/src/generate/module/generateTypesJson.d.ts +2 -0
  28. package/dist/src/generate/module/generateUseCases.d.ts +1 -0
  29. package/dist/src/generate/module/repositoryModuleShared.d.ts +89 -0
  30. package/dist/src/generate/routes/generateRoutes.d.ts +14 -0
  31. package/dist/src/generate/ui/generateComponent.d.ts +1 -0
  32. package/dist/src/generate/ui/generateDesignComponent.d.ts +1 -0
  33. package/dist/src/generate/ui/generateWidget.d.ts +1 -0
  34. package/dist/src/git/commit.d.ts +23 -0
  35. package/dist/src/git/push.d.ts +11 -0
  36. package/dist/src/git/runGit.d.ts +2 -0
  37. package/dist/src/init/initAliases.d.ts +12 -0
  38. package/dist/src/init/initEdges.d.ts +2 -0
  39. package/dist/src/init/initStructure.d.ts +1 -0
  40. package/dist/src/install/configureCommitTools.d.ts +1 -0
  41. package/dist/src/install/installFresh.d.ts +1 -0
  42. package/dist/src/migrate/migrate.d.ts +22 -0
  43. package/dist/src/migrate/presenterFactories.d.ts +9 -0
  44. package/dist/src/migrate/presenters.d.ts +13 -0
  45. package/dist/src/migrate/translations.d.ts +8 -0
  46. package/dist/src/plugins/addLint.d.ts +5 -0
  47. package/dist/src/scaffolds/createCoreSchema.d.ts +1 -0
  48. package/dist/src/scaffolds/createDatasource.d.ts +1 -0
  49. package/dist/src/scaffolds/createProgram.d.ts +1 -0
  50. package/dist/src/scaffolds/createResponse.d.ts +1 -0
  51. package/dist/src/scaffolds/createSchemaRule.d.ts +1 -0
  52. package/dist/src/scaffolds/createTranslationManager.d.ts +1 -0
  53. package/{src/scaffolds/index.ts → dist/src/scaffolds/index.d.ts} +0 -2
  54. package/dist/src/scaffolds/registerDatasource.d.ts +2 -0
  55. package/dist/src/scaffolds/updateDefaultFactoryConfig.d.ts +1 -0
  56. package/dist/src/utils/architecture.d.ts +31 -0
  57. package/dist/src/utils/contextUtils.d.ts +6 -0
  58. package/dist/src/utils/fileUtils.d.ts +5 -0
  59. package/dist/src/utils/flattenConfig.d.ts +2 -0
  60. package/dist/src/utils/legacyAliases.d.ts +1 -0
  61. package/dist/src/utils/loadConfig.d.ts +16 -0
  62. package/dist/src/utils/packageImports.d.ts +4 -0
  63. package/dist/src/utils/sharedFoundation.d.ts +20 -0
  64. package/dist/src/utils/viteConfig.d.ts +9 -0
  65. package/package.json +17 -7
  66. package/src/checks/architecture.js +154 -0
  67. package/src/checks/checkDomain.js +124 -154
  68. package/src/checks/checkFoldersStructure.js +64 -52
  69. package/src/checks/checkHooks.js +12 -12
  70. package/src/checks/checkImports.js +26 -142
  71. package/src/checks/checkInternal.js +27 -24
  72. package/src/checks/checkLayerBoundaries.js +22 -197
  73. package/src/checks/checkLayerImports.js +14 -134
  74. package/src/checks/checkPresenterNames.js +156 -143
  75. package/src/checks/checkProject.js +27 -26
  76. package/src/checks/checkProviderGraph.js +182 -166
  77. package/src/checks/checkProviderNames.js +123 -112
  78. package/src/generate/layers/generateRepository.js +1 -109
  79. package/src/generate/layers/generateRepositoryMethod.js +1 -90
  80. package/src/generate/layers/generateUseCases.js +1 -44
  81. package/src/generate/module/generateDomain.js +81 -105
  82. package/src/generate/module/generateModule.js +34 -68
  83. package/src/generate/module/generateModulePreset.js +188 -248
  84. package/src/generate/module/generatePresenter.js +441 -369
  85. package/src/generate/module/generateRepository.js +102 -121
  86. package/src/generate/module/generateRepositoryMethod.js +117 -0
  87. package/src/generate/module/generateSchemaFromType.js +283 -280
  88. package/src/generate/module/generateStore.js +41 -0
  89. package/src/generate/module/generateTypesJson.js +196 -195
  90. package/src/generate/module/generateUseCases.js +47 -55
  91. package/src/generate/module/repositoryModuleShared.js +480 -459
  92. package/src/generate/routes/generateRoutes.js +4 -7
  93. package/src/generate/ui/generateComponent.js +44 -64
  94. package/src/generate/ui/generateDesignComponent.js +21 -41
  95. package/src/generate/ui/generateWidget.js +21 -41
  96. package/src/git/commit.js +67 -0
  97. package/src/git/push.js +19 -0
  98. package/src/git/runGit.js +11 -0
  99. package/src/init/initAliases.js +19 -135
  100. package/src/init/initEdges.js +79 -54
  101. package/src/init/initStructure.js +31 -145
  102. package/src/install/configureCommitTools.js +1 -0
  103. package/src/install/installFresh.js +39 -68
  104. package/src/migrate/migrate.js +1027 -0
  105. package/src/migrate/presenterFactories.js +189 -0
  106. package/src/migrate/presenters.js +373 -0
  107. package/src/migrate/translations.js +213 -0
  108. package/src/plugins/addLint.js +52 -219
  109. package/src/scaffolds/createCoreSchema.js +65 -91
  110. package/src/scaffolds/createDatasource.js +67 -101
  111. package/src/scaffolds/createProgram.js +8 -8
  112. package/src/scaffolds/createResponse.js +29 -29
  113. package/src/scaffolds/createSchemaRule.js +19 -19
  114. package/src/scaffolds/createTranslationManager.js +84 -37
  115. package/src/scaffolds/index.js +0 -2
  116. package/src/scaffolds/registerDatasource.js +59 -0
  117. package/src/scaffolds/updateDefaultFactoryConfig.js +31 -0
  118. package/src/utils/architecture.js +145 -0
  119. package/src/utils/contextUtils.js +32 -65
  120. package/src/utils/fileUtils.js +69 -50
  121. package/src/utils/flattenConfig.js +38 -0
  122. package/src/utils/legacyAliases.js +75 -0
  123. package/src/utils/loadConfig.js +76 -40
  124. package/src/utils/packageImports.js +63 -0
  125. package/src/utils/sharedFoundation.js +36 -42
  126. package/src/utils/viteConfig.js +295 -0
  127. package/.prettierrc +0 -7
  128. package/bin/azure-net.ts +0 -308
  129. package/eslint.config.js +0 -34
  130. package/src/checks/checkDomain.ts +0 -223
  131. package/src/checks/checkFoldersStructure.ts +0 -85
  132. package/src/checks/checkHooks.ts +0 -22
  133. package/src/checks/checkImports.ts +0 -193
  134. package/src/checks/checkInternal.ts +0 -48
  135. package/src/checks/checkLayerBoundaries.ts +0 -255
  136. package/src/checks/checkLayerImports.ts +0 -185
  137. package/src/checks/checkPresenterNames.ts +0 -203
  138. package/src/checks/checkProject.ts +0 -45
  139. package/src/checks/checkProviderGraph.ts +0 -234
  140. package/src/checks/checkProviderNames.ts +0 -165
  141. package/src/generate/layers/generateRepository.ts +0 -123
  142. package/src/generate/layers/generateRepositoryMethod.ts +0 -102
  143. package/src/generate/layers/generateUseCases.ts +0 -50
  144. package/src/generate/layers/repositoryShared.js +0 -506
  145. package/src/generate/layers/repositoryShared.ts +0 -662
  146. package/src/generate/module/generateDomain.ts +0 -147
  147. package/src/generate/module/generateModule.ts +0 -84
  148. package/src/generate/module/generateModulePreset.ts +0 -338
  149. package/src/generate/module/generatePresenter.ts +0 -498
  150. package/src/generate/module/generateRepository.ts +0 -158
  151. package/src/generate/module/generateSchemaFromType.ts +0 -368
  152. package/src/generate/module/generateTypesJson.ts +0 -259
  153. package/src/generate/module/generateUseCases.ts +0 -67
  154. package/src/generate/module/repositoryModuleShared.ts +0 -669
  155. package/src/generate/routes/generateRoutes.ts +0 -275
  156. package/src/generate/ui/generateComponent.ts +0 -100
  157. package/src/generate/ui/generateDesignComponent.ts +0 -71
  158. package/src/generate/ui/generateWidget.ts +0 -71
  159. package/src/init/initAliases.ts +0 -172
  160. package/src/init/initEdges.ts +0 -74
  161. package/src/init/initStructure.ts +0 -172
  162. package/src/install/installFresh.ts +0 -93
  163. package/src/plugins/addLint.ts +0 -274
  164. package/src/scaffolds/createCoreSchema.ts +0 -130
  165. package/src/scaffolds/createDatasource.ts +0 -161
  166. package/src/scaffolds/createDatasourceProvider.js +0 -127
  167. package/src/scaffolds/createDatasourceProvider.ts +0 -161
  168. package/src/scaffolds/createPresenterFactory.js +0 -83
  169. package/src/scaffolds/createPresenterFactory.ts +0 -102
  170. package/src/scaffolds/createProgram.ts +0 -19
  171. package/src/scaffolds/createResponse.ts +0 -66
  172. package/src/scaffolds/createSchemaRule.ts +0 -44
  173. package/src/scaffolds/createTranslationManager.ts +0 -80
  174. package/src/utils/contextUtils.ts +0 -88
  175. package/src/utils/fileUtils.ts +0 -74
  176. package/src/utils/loadConfig.ts +0 -68
  177. package/src/utils/sharedFoundation.ts +0 -70
  178. package/tsconfig.json +0 -19
  179. /package/{src/checks/index.ts → dist/src/checks/index.d.ts} +0 -0
  180. /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
- let contextName = options.contextName ? String(options.contextName) : null;
22
- if (!contextName) {
23
- contextName = await selectContext('Select context for repository:');
24
- }
25
- if (!contextName) {
26
- process.exitCode = 1;
27
- return null;
28
- }
29
- let domainName = options.domainName ? String(options.domainName) : null;
30
- if (!domainName) {
31
- domainName = await selectDomain(contextName);
32
- }
33
- if (!domainName) {
34
- process.exitCode = 1;
35
- return null;
36
- }
37
- const { repositoryNameRaw } = await prompts({
38
- type: 'text',
39
- name: 'repositoryNameRaw',
40
- message: 'Repository name:',
41
- validate: (value) => (String(value ?? '').trim().length > 0 ? true : 'Repository name is required')
42
- });
43
- const className = ensureRepositoryName(repositoryNameRaw);
44
- const meta = getRepositoryMeta(className);
45
- const datasource = await selectDatasource(contextName);
46
- if (!datasource) {
47
- process.exitCode = 1;
48
- return null;
49
- }
50
- const domainTypes = await getDomainTypes(contextName, domainName);
51
- const { methodsCountRaw } = await prompts({
52
- type: 'number',
53
- name: 'methodsCountRaw',
54
- message: 'How many methods to create?',
55
- initial: 1,
56
- min: 0
57
- });
58
- const methodsCount = Number(methodsCountRaw ?? 0);
59
- if (!Number.isFinite(methodsCount) || methodsCount < 0) {
60
- console.error('❌ Invalid methods count.');
61
- process.exitCode = 1;
62
- return null;
63
- }
64
- const methods = await promptMethodsBatch(domainTypes, methodsCount);
65
- if (!methods) {
66
- process.exitCode = 1;
67
- return null;
68
- }
69
- const { contexts } = await getConfigState();
70
- const contextAlias = resolveContextAlias(contexts, contextName);
71
- const repositoriesPath = resolveRepositoriesPath(contextName);
72
- await fs.mkdir(repositoriesPath, { recursive: true });
73
- const repositoryPath = path.join(repositoriesPath, `${meta.className}.ts`);
74
- await writeRepositoryInterface({
75
- contextName,
76
- domainName,
77
- meta,
78
- methods
79
- });
80
- const repositoryContent = buildRepositoryContent({
81
- meta,
82
- contextAlias,
83
- domainName,
84
- datasource,
85
- methods
86
- });
87
- const created = await writeIfNotExists(repositoryPath, repositoryContent);
88
- await updateIndexTs(repositoriesPath);
89
- if (!created) {
90
- console.warn(`⚠️ Repository "${meta.className}" already exists. File was not overwritten.`);
91
- process.exitCode = 1;
92
- return null;
93
- }
94
- const { shouldCreateUseCases } = await prompts({
95
- type: 'confirm',
96
- name: 'shouldCreateUseCases',
97
- message: 'Create UseCases for this repository?',
98
- initial: true
99
- });
100
- let useCasesCreated = false;
101
- if (shouldCreateUseCases) {
102
- await createUseCasesForRepository({
103
- contextName,
104
- contextAlias,
105
- domainName,
106
- repositoryName: meta.className
107
- });
108
- useCasesCreated = true;
109
- }
110
- if (!shouldCreateUseCases && options.forceCreateUseCases) {
111
- await createUseCasesForRepository({
112
- contextName,
113
- contextAlias,
114
- domainName,
115
- repositoryName: meta.className
116
- });
117
- useCasesCreated = true;
118
- }
119
- console.log(`✅ Repository generated: ${repositoryPath}`);
120
- return {
121
- contextName,
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
+ }