@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.
Files changed (176) hide show
  1. package/README.md +189 -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/presenters.d.ts +7 -0
  44. package/dist/src/plugins/addLint.d.ts +5 -0
  45. package/dist/src/scaffolds/createCoreSchema.d.ts +1 -0
  46. package/dist/src/scaffolds/createDatasource.d.ts +1 -0
  47. package/dist/src/scaffolds/createProgram.d.ts +1 -0
  48. package/dist/src/scaffolds/createResponse.d.ts +1 -0
  49. package/dist/src/scaffolds/createSchemaRule.d.ts +1 -0
  50. package/dist/src/scaffolds/createTranslationManager.d.ts +1 -0
  51. package/{src/scaffolds/index.ts → dist/src/scaffolds/index.d.ts} +0 -2
  52. package/dist/src/scaffolds/registerDatasource.d.ts +2 -0
  53. package/dist/src/scaffolds/updateDefaultFactoryConfig.d.ts +1 -0
  54. package/dist/src/utils/architecture.d.ts +31 -0
  55. package/dist/src/utils/contextUtils.d.ts +6 -0
  56. package/dist/src/utils/fileUtils.d.ts +5 -0
  57. package/dist/src/utils/flattenConfig.d.ts +2 -0
  58. package/dist/src/utils/legacyAliases.d.ts +1 -0
  59. package/dist/src/utils/loadConfig.d.ts +16 -0
  60. package/dist/src/utils/packageImports.d.ts +4 -0
  61. package/dist/src/utils/sharedFoundation.d.ts +20 -0
  62. package/dist/src/utils/viteConfig.d.ts +9 -0
  63. package/package.json +48 -36
  64. package/src/checks/architecture.js +154 -0
  65. package/src/checks/checkDomain.js +124 -154
  66. package/src/checks/checkFoldersStructure.js +64 -52
  67. package/src/checks/checkHooks.js +12 -12
  68. package/src/checks/checkImports.js +26 -142
  69. package/src/checks/checkInternal.js +27 -24
  70. package/src/checks/checkLayerBoundaries.js +22 -197
  71. package/src/checks/checkLayerImports.js +14 -134
  72. package/src/checks/checkPresenterNames.js +156 -143
  73. package/src/checks/checkProject.js +27 -26
  74. package/src/checks/checkProviderGraph.js +182 -166
  75. package/src/checks/checkProviderNames.js +123 -112
  76. package/src/generate/layers/generateRepository.js +1 -109
  77. package/src/generate/layers/generateRepositoryMethod.js +1 -90
  78. package/src/generate/layers/generateUseCases.js +1 -44
  79. package/src/generate/module/generateDomain.js +81 -105
  80. package/src/generate/module/generateModule.js +34 -68
  81. package/src/generate/module/generateModulePreset.js +188 -248
  82. package/src/generate/module/generatePresenter.js +441 -369
  83. package/src/generate/module/generateRepository.js +102 -121
  84. package/src/generate/module/generateRepositoryMethod.js +117 -0
  85. package/src/generate/module/generateSchemaFromType.js +283 -280
  86. package/src/generate/module/generateStore.js +41 -0
  87. package/src/generate/module/generateTypesJson.js +196 -195
  88. package/src/generate/module/generateUseCases.js +47 -55
  89. package/src/generate/module/repositoryModuleShared.js +480 -459
  90. package/src/generate/routes/generateRoutes.js +165 -174
  91. package/src/generate/ui/generateComponent.js +44 -64
  92. package/src/generate/ui/generateDesignComponent.js +21 -41
  93. package/src/generate/ui/generateWidget.js +21 -41
  94. package/src/git/commit.js +67 -0
  95. package/src/git/push.js +19 -0
  96. package/src/git/runGit.js +11 -0
  97. package/src/init/initAliases.js +19 -135
  98. package/src/init/initEdges.js +79 -54
  99. package/src/init/initStructure.js +31 -145
  100. package/src/install/configureCommitTools.js +1 -0
  101. package/src/install/installFresh.js +39 -68
  102. package/src/migrate/migrate.js +914 -0
  103. package/src/migrate/presenters.js +265 -0
  104. package/src/plugins/addLint.js +52 -219
  105. package/src/scaffolds/createCoreSchema.js +65 -91
  106. package/src/scaffolds/createDatasource.js +67 -101
  107. package/src/scaffolds/createProgram.js +8 -8
  108. package/src/scaffolds/createResponse.js +29 -29
  109. package/src/scaffolds/createSchemaRule.js +19 -19
  110. package/src/scaffolds/createTranslationManager.js +84 -37
  111. package/src/scaffolds/index.js +0 -2
  112. package/src/scaffolds/registerDatasource.js +59 -0
  113. package/src/scaffolds/updateDefaultFactoryConfig.js +31 -0
  114. package/src/utils/architecture.js +145 -0
  115. package/src/utils/contextUtils.js +32 -65
  116. package/src/utils/fileUtils.js +69 -50
  117. package/src/utils/flattenConfig.js +38 -0
  118. package/src/utils/legacyAliases.js +75 -0
  119. package/src/utils/loadConfig.js +76 -40
  120. package/src/utils/packageImports.js +63 -0
  121. package/src/utils/sharedFoundation.js +36 -42
  122. package/src/utils/viteConfig.js +295 -0
  123. package/.prettierrc +0 -7
  124. package/bin/azure-net.ts +0 -308
  125. package/eslint.config.js +0 -34
  126. package/src/checks/checkDomain.ts +0 -223
  127. package/src/checks/checkFoldersStructure.ts +0 -85
  128. package/src/checks/checkHooks.ts +0 -22
  129. package/src/checks/checkImports.ts +0 -193
  130. package/src/checks/checkInternal.ts +0 -48
  131. package/src/checks/checkLayerBoundaries.ts +0 -255
  132. package/src/checks/checkLayerImports.ts +0 -185
  133. package/src/checks/checkPresenterNames.ts +0 -203
  134. package/src/checks/checkProject.ts +0 -45
  135. package/src/checks/checkProviderGraph.ts +0 -234
  136. package/src/checks/checkProviderNames.ts +0 -165
  137. package/src/generate/layers/generateRepository.ts +0 -123
  138. package/src/generate/layers/generateRepositoryMethod.ts +0 -102
  139. package/src/generate/layers/generateUseCases.ts +0 -50
  140. package/src/generate/layers/repositoryShared.js +0 -506
  141. package/src/generate/layers/repositoryShared.ts +0 -662
  142. package/src/generate/module/generateDomain.ts +0 -147
  143. package/src/generate/module/generateModule.ts +0 -84
  144. package/src/generate/module/generateModulePreset.ts +0 -338
  145. package/src/generate/module/generatePresenter.ts +0 -498
  146. package/src/generate/module/generateRepository.ts +0 -158
  147. package/src/generate/module/generateSchemaFromType.ts +0 -368
  148. package/src/generate/module/generateTypesJson.ts +0 -259
  149. package/src/generate/module/generateUseCases.ts +0 -67
  150. package/src/generate/module/repositoryModuleShared.ts +0 -669
  151. package/src/generate/routes/generateRoutes.ts +0 -282
  152. package/src/generate/ui/generateComponent.ts +0 -100
  153. package/src/generate/ui/generateDesignComponent.ts +0 -71
  154. package/src/generate/ui/generateWidget.ts +0 -71
  155. package/src/init/initAliases.ts +0 -172
  156. package/src/init/initEdges.ts +0 -74
  157. package/src/init/initStructure.ts +0 -172
  158. package/src/install/installFresh.ts +0 -93
  159. package/src/plugins/addLint.ts +0 -274
  160. package/src/scaffolds/createCoreSchema.ts +0 -130
  161. package/src/scaffolds/createDatasource.ts +0 -161
  162. package/src/scaffolds/createDatasourceProvider.js +0 -127
  163. package/src/scaffolds/createDatasourceProvider.ts +0 -161
  164. package/src/scaffolds/createPresenterFactory.js +0 -83
  165. package/src/scaffolds/createPresenterFactory.ts +0 -102
  166. package/src/scaffolds/createProgram.ts +0 -19
  167. package/src/scaffolds/createResponse.ts +0 -66
  168. package/src/scaffolds/createSchemaRule.ts +0 -44
  169. package/src/scaffolds/createTranslationManager.ts +0 -80
  170. package/src/utils/contextUtils.ts +0 -88
  171. package/src/utils/fileUtils.ts +0 -74
  172. package/src/utils/loadConfig.ts +0 -68
  173. package/src/utils/sharedFoundation.ts +0 -70
  174. package/tsconfig.json +0 -19
  175. /package/{src/checks/index.ts → dist/src/checks/index.d.ts} +0 -0
  176. /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
+ }