@azure-net/cli 2.3.63 → 4.0.0-1

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 (117) hide show
  1. package/.prettierrc +7 -0
  2. package/bin/azure-net.js +278 -157
  3. package/bin/azure-net.ts +284 -0
  4. package/eslint.config.js +34 -0
  5. package/package.json +12 -5
  6. package/src/checks/checkDomain.js +201 -0
  7. package/src/checks/checkDomain.ts +213 -0
  8. package/src/checks/checkFoldersStructure.js +70 -0
  9. package/src/checks/checkFoldersStructure.ts +85 -0
  10. package/src/checks/checkInternal.js +35 -0
  11. package/src/checks/checkInternal.ts +40 -0
  12. package/src/checks/checkLayerBoundaries.js +178 -0
  13. package/src/checks/checkLayerBoundaries.ts +189 -0
  14. package/src/checks/checkPresenterNames.js +202 -0
  15. package/src/checks/checkPresenterNames.ts +208 -0
  16. package/src/checks/checkProject.js +42 -0
  17. package/src/checks/checkProject.ts +45 -0
  18. package/src/checks/checkProviderNames.js +158 -0
  19. package/src/checks/checkProviderNames.ts +165 -0
  20. package/src/checks/index.js +7 -0
  21. package/src/checks/index.ts +7 -0
  22. package/src/generate/layers/generateRepository.js +124 -0
  23. package/src/generate/layers/generateRepository.ts +123 -0
  24. package/src/generate/layers/generateRepositoryMethod.js +102 -0
  25. package/src/generate/layers/generateRepositoryMethod.ts +102 -0
  26. package/src/generate/layers/generateUseCases.js +50 -0
  27. package/src/generate/layers/generateUseCases.ts +50 -0
  28. package/src/generate/layers/repositoryShared.js +569 -0
  29. package/src/generate/layers/repositoryShared.ts +657 -0
  30. package/src/generate/module/generateDomain.js +146 -0
  31. package/src/generate/module/generateDomain.ts +147 -0
  32. package/src/generate/module/generateModule.js +84 -0
  33. package/src/generate/module/generateModule.ts +84 -0
  34. package/src/generate/module/generateModulePreset.js +307 -0
  35. package/src/generate/module/generateModulePreset.ts +337 -0
  36. package/src/generate/module/generatePresenter.js +419 -0
  37. package/src/generate/module/generatePresenter.ts +442 -0
  38. package/src/generate/module/generateRepository.js +144 -0
  39. package/src/generate/module/generateRepository.ts +158 -0
  40. package/src/generate/module/generateSchemaFromType.js +358 -0
  41. package/src/generate/module/generateSchemaFromType.ts +369 -0
  42. package/src/generate/module/generateTypesJson.js +252 -0
  43. package/src/generate/module/generateTypesJson.ts +259 -0
  44. package/src/generate/module/generateUseCases.js +67 -0
  45. package/src/generate/module/generateUseCases.ts +67 -0
  46. package/src/generate/module/repositoryModuleShared.js +598 -0
  47. package/src/generate/module/repositoryModuleShared.ts +661 -0
  48. package/src/generate/ui/generateComponent.js +98 -0
  49. package/src/generate/ui/generateComponent.ts +100 -0
  50. package/src/generate/ui/generateDesignComponent.js +71 -0
  51. package/src/generate/ui/generateDesignComponent.ts +71 -0
  52. package/src/generate/ui/generateWidget.js +71 -0
  53. package/src/generate/ui/generateWidget.ts +71 -0
  54. package/src/init/initAliases.js +159 -0
  55. package/src/init/initAliases.ts +167 -0
  56. package/src/init/initEdges.js +74 -0
  57. package/src/init/initEdges.ts +74 -0
  58. package/src/init/initStructure.js +122 -0
  59. package/src/init/initStructure.ts +124 -0
  60. package/src/install/installFresh.js +101 -0
  61. package/src/install/installFresh.ts +101 -0
  62. package/src/plugins/addLint.js +257 -0
  63. package/src/plugins/addLint.ts +274 -0
  64. package/src/plugins/index.js +1 -0
  65. package/src/plugins/index.ts +1 -0
  66. package/src/scaffolds/createCoreMiddleware.js +27 -0
  67. package/src/scaffolds/createCoreMiddleware.ts +27 -0
  68. package/src/scaffolds/createCoreSchema.js +141 -0
  69. package/src/scaffolds/createCoreSchema.ts +142 -0
  70. package/src/scaffolds/createDatasource.js +173 -0
  71. package/src/scaffolds/createDatasource.ts +175 -0
  72. package/src/scaffolds/createDatasourceProvider.js +164 -0
  73. package/src/scaffolds/createDatasourceProvider.ts +175 -0
  74. package/src/scaffolds/createMiddleware.js +105 -0
  75. package/src/scaffolds/createMiddleware.ts +105 -0
  76. package/src/scaffolds/createPresenterFactory.js +112 -0
  77. package/src/scaffolds/createPresenterFactory.ts +114 -0
  78. package/src/scaffolds/createResponse.js +64 -0
  79. package/src/scaffolds/createResponse.ts +64 -0
  80. package/src/scaffolds/createSchemaRule.js +40 -0
  81. package/src/scaffolds/createSchemaRule.ts +42 -0
  82. package/src/scaffolds/createTranslationManager.js +78 -0
  83. package/src/scaffolds/createTranslationManager.ts +78 -0
  84. package/src/scaffolds/index.js +9 -0
  85. package/src/scaffolds/index.ts +9 -0
  86. package/src/utils/contextUtils.js +56 -49
  87. package/src/utils/contextUtils.ts +89 -0
  88. package/src/utils/fileUtils.js +72 -84
  89. package/src/utils/fileUtils.ts +100 -0
  90. package/src/utils/loadConfig.js +57 -13
  91. package/src/utils/loadConfig.ts +69 -0
  92. package/tsconfig.json +19 -0
  93. package/src/commands/generate/generateComponent.js +0 -53
  94. package/src/commands/generate/generateCrudBase.js +0 -207
  95. package/src/commands/generate/generateCrudPresenter.js +0 -232
  96. package/src/commands/generate/generateDatasource.js +0 -84
  97. package/src/commands/generate/generateDesignComponent.js +0 -53
  98. package/src/commands/generate/generateModule.js +0 -31
  99. package/src/commands/generate/generateModuleBase.js +0 -152
  100. package/src/commands/generate/generateModulePresenter.js +0 -110
  101. package/src/commands/generate/generatePresenter.js +0 -86
  102. package/src/commands/generate/generateRepository.js +0 -76
  103. package/src/commands/generate/generateResponse.js +0 -41
  104. package/src/commands/generate/generateSchema.js +0 -96
  105. package/src/commands/generate/generateService.js +0 -71
  106. package/src/commands/generate/generateWidget.js +0 -53
  107. package/src/commands/generate/index.js +0 -14
  108. package/src/commands/init/index.js +0 -9
  109. package/src/commands/init/initAliases.js +0 -52
  110. package/src/commands/init/initEdges.js +0 -42
  111. package/src/commands/init/initLint.js +0 -138
  112. package/src/commands/init/initMiddleware.js +0 -21
  113. package/src/commands/init/initPresenter.js +0 -25
  114. package/src/commands/init/initSchema.js +0 -22
  115. package/src/commands/init/initStructure.js +0 -140
  116. package/src/commands/init/initTranslations.js +0 -59
  117. package/src/commands/init/migrateStructure.js +0 -144
@@ -1,152 +0,0 @@
1
- import prompts from 'prompts';
2
- import path from 'path';
3
- import {
4
- selectContext,
5
- getContextPath,
6
- toPascalCase,
7
- toCamelCase,
8
- getAvailableFiles,
9
- toKebabCase
10
- } from '../../utils/contextUtils.js';
11
- import { writeIfNotExists, updateIndexTs, updateCoreIndex } from '../../utils/fileUtils.js';
12
-
13
- const entityTemplate = `export interface I{{name}} {
14
- \tid: number;
15
- \t// Add entity fields here
16
- \tcreated_at: string;
17
- \tupdated_at: string;
18
- }`;
19
-
20
- const repositoryTemplate = `import { {{datasource}} } from '{{datasourceImport}}';
21
-
22
- export class {{name}}Repository {
23
- \tprivate endpoint = '{{endpoint}}';
24
- \t
25
- \tconstructor(private {{datasourceVar}}: {{datasource}}) {}
26
- \t
27
- \tpublic async example() {
28
- \t\treturn this.{{datasourceVar}}.createRequest(({ http }) =>
29
- \t\t\thttp.get(this.endpoint)
30
- \t\t).then(res => res.getData());
31
- \t}
32
- }`;
33
-
34
- const serviceTemplate = `import { ClassMirror } from '@azure-net/kit';
35
- import { {{name}}Repository } from '\${{context}}/infrastructure/http/repositories';
36
-
37
- export class {{name}}Service extends ClassMirror<{{name}}Repository> {
38
- \tconstructor(private {{camelName}}Repository: {{name}}Repository) {
39
- \t\tsuper({{camelName}}Repository);
40
- \t}
41
- \t
42
- \tdeclare example: {{name}}Repository['example'];
43
- }`;
44
-
45
- export default async function generateModuleBase() {
46
- const context = await selectContext('Select context for module base:');
47
-
48
- const { name } = await prompts({
49
- type: 'text',
50
- name: 'name',
51
- message: 'Module name (PascalCase):'
52
- });
53
-
54
- const { endpoint } = await prompts({
55
- type: 'text',
56
- name: 'endpoint',
57
- message: 'API endpoint (e.g. /api/users):'
58
- });
59
-
60
- const { needEntity } = await prompts({
61
- type: 'confirm',
62
- name: 'needEntity',
63
- message: 'Create domain entity?',
64
- initial: true
65
- });
66
-
67
- // Get available datasources
68
- const contextPath = getContextPath(context);
69
- const coreDatasources = await getAvailableFiles(
70
- path.join(process.cwd(), 'src/core/datasources')
71
- );
72
- const contextDatasources = await getAvailableFiles(
73
- path.join(contextPath, 'infrastructure/http/datasources')
74
- );
75
-
76
- const allDatasources = [
77
- ...coreDatasources.map(d => ({ title: `${d} (core)`, value: { name: d, from: 'core' } })),
78
- ...contextDatasources.map(d => ({ title: `${d} (${context})`, value: { name: d, from: context } }))
79
- ];
80
-
81
- const { datasource } = await prompts({
82
- type: 'select',
83
- name: 'datasource',
84
- message: 'Select datasource:',
85
- choices: allDatasources
86
- });
87
-
88
- const pascalName = toPascalCase(name);
89
- const camelName = toCamelCase(name);
90
- const entityLower = toKebabCase(pascalName);
91
-
92
- console.log('\n🚀 Generating module base (repository & service)...\n');
93
-
94
- // 1. Create Domain entity if needed
95
- if (needEntity) {
96
- const domainPath = path.join(contextPath, 'domain', entityLower);
97
- const modelPath = path.join(domainPath, 'model');
98
-
99
- await writeIfNotExists(
100
- path.join(modelPath, `I${pascalName}.ts`),
101
- entityTemplate.replace(/{{name}}/g, pascalName)
102
- );
103
-
104
- await writeIfNotExists(
105
- path.join(modelPath, 'index.ts'),
106
- `export * from './I${pascalName}';`
107
- );
108
-
109
- await writeIfNotExists(
110
- path.join(domainPath, 'index.ts'),
111
- `export * from './model';`
112
- );
113
-
114
- console.log(`✅ Domain entity I${pascalName} created`);
115
- }
116
-
117
- // 2. Create Repository
118
- const repoPath = path.join(contextPath, 'infrastructure/http/repositories');
119
- const datasourceImport = datasource.from === 'core'
120
- ? '$core/datasources'
121
- : `\$${context}/infrastructure/http/datasources`;
122
-
123
- await writeIfNotExists(
124
- path.join(repoPath, `${pascalName}Repository.ts`),
125
- repositoryTemplate
126
- .replace(/{{name}}/g, pascalName)
127
- .replace(/{{endpoint}}/g, endpoint)
128
- .replace(/{{datasource}}/g, datasource.name)
129
- .replace(/{{datasourceImport}}/g, datasourceImport)
130
- .replace(/{{datasourceVar}}/g, toCamelCase(datasource.name))
131
- );
132
- await updateIndexTs(repoPath);
133
-
134
- // 3. Create Service
135
- const servicePath = path.join(contextPath, 'application/services');
136
- await writeIfNotExists(
137
- path.join(servicePath, `${pascalName}Service.ts`),
138
- serviceTemplate
139
- .replace(/{{name}}/g, pascalName)
140
- .replace(/{{camelName}}/g, camelName)
141
- .replace(/{{context}}/g, context)
142
- );
143
- await updateIndexTs(servicePath);
144
-
145
- // Update core index
146
- await updateCoreIndex();
147
-
148
- console.log(`\n✅ Module base for ${pascalName} created successfully!`);
149
- console.log(`\n💡 Remember to:`);
150
- console.log(` 1. Add ${pascalName}Repository to InfrastructureProvider`);
151
- console.log(` 2. Add ${pascalName}Service to ApplicationProvider`);
152
- }
@@ -1,110 +0,0 @@
1
- import prompts from 'prompts';
2
- import path from 'path';
3
- import {
4
- selectContext,
5
- getContextPath,
6
- toPascalCase,
7
- getAvailableFiles,
8
- getApplicationProviderServices,
9
- toKebabCase
10
- } from '../../utils/contextUtils.js';
11
- import { updateIndexTs, writeIfNotExists, updateCoreIndex } from '../../utils/fileUtils.js';
12
-
13
- const presenterWithCoreTemplate = `import { {{presenterFactory}} } from '$core/presenters';
14
- import { ApplicationProvider } from '\${{context}}/application';
15
-
16
- export const {{name}}Presenter = {{presenterFactory}}('{{name}}Presenter', ({ createAsyncResource, createAsyncAction }) => {
17
- \tconst { {{serviceName}} } = ApplicationProvider();
18
- \t
19
- \t// Add your presenter methods here
20
- \t
21
- \treturn {};
22
- });`;
23
-
24
- const presenterWithoutCoreTemplate = `import { createPresenter } from '@azure-net/kit';
25
- import { ApplicationProvider } from '\${{context}}/application';
26
-
27
- export const {{name}}Presenter = createPresenter('{{name}}Presenter', () => {
28
- \tconst { {{serviceName}} } = ApplicationProvider();
29
- \t
30
- \t// Add your presenter methods here
31
- \t
32
- \treturn {};
33
- });`;
34
-
35
- export default async function generateModulePresenter() {
36
- const context = await selectContext('Select context for module presenter:');
37
-
38
- // Get available services from ApplicationProvider
39
- const services = await getApplicationProviderServices(context);
40
-
41
- if (services.length === 0) {
42
- console.error('❌ No services found in ApplicationProvider. Add services manually first.');
43
- return;
44
- }
45
-
46
- const { service } = await prompts({
47
- type: 'select',
48
- name: 'service',
49
- message: 'Select service for presenter:',
50
- choices: services.map(s => ({ title: s, value: s }))
51
- });
52
-
53
- const { moduleName } = await prompts({
54
- type: 'text',
55
- name: 'moduleName',
56
- message: 'Module name for presenter (will create folder in delivery):'
57
- });
58
-
59
- // Extract entity name from service name
60
- const pascalName = toPascalCase(moduleName);
61
- const entityLower = toKebabCase(pascalName);
62
-
63
- // Get presenter factory
64
- const corePresenters = await getAvailableFiles(
65
- path.join(process.cwd(), 'src/core/presenters')
66
- );
67
-
68
- const { presenterType } = await prompts({
69
- type: 'select',
70
- name: 'presenterType',
71
- message: 'Select presenter factory:',
72
- choices: [
73
- { title: 'Use createPresenter from package', value: 'package' },
74
- ...corePresenters.map(p => ({ title: `Use ${p} from core`, value: p }))
75
- ]
76
- });
77
-
78
- const contextPath = getContextPath(context);
79
- const deliveryModulePath = path.join(contextPath, 'delivery', entityLower);
80
-
81
- console.log('\n🚀 Generating module presenter...\n');
82
-
83
- // Create Presenter
84
- const presenterTemplate = presenterType === 'package'
85
- ? presenterWithoutCoreTemplate
86
- : presenterWithCoreTemplate;
87
-
88
- const presenterFactory = presenterType === 'package' ? 'createPresenter' : presenterType;
89
-
90
- await writeIfNotExists(
91
- path.join(deliveryModulePath, `${pascalName}Presenter.ts`),
92
- presenterTemplate
93
- .replace(/{{name}}/g, pascalName)
94
- .replace(/{{context}}/g, context)
95
- .replace(/{{serviceName}}/g, service)
96
- .replace(/{{presenterFactory}}/g, presenterFactory)
97
- );
98
-
99
- // Create module index
100
- await writeIfNotExists(
101
- path.join(deliveryModulePath, 'index.ts'),
102
- `export * from './${pascalName}Presenter';`
103
- );
104
-
105
- // Update core index
106
- await updateCoreIndex();
107
-
108
- console.log(`✅ Module presenter for ${pascalName} created successfully!`);
109
- console.log(`\n💡 Remember to add presenter methods using the ${service}.`);
110
- }
@@ -1,86 +0,0 @@
1
- import prompts from 'prompts';
2
- import path from 'path';
3
- import {selectContext, getContextPath, toPascalCase, getAvailableFiles, toKebabCase} from '../../utils/contextUtils.js';
4
- import { writeIfNotExists, updateCoreIndex } from '../../utils/fileUtils.js';
5
-
6
- const presenterWithCoreTemplate = `import { {{corePresenter}} } from '$core/presenters';
7
- import { ApplicationProvider } from '\${{context}}/application';
8
-
9
- export const {{name}}Presenter = {{corePresenter}}('{{name}}Presenter', ({ createAsyncResource, createAsyncAction }) => {
10
- \tconst { /* extract services from ApplicationProvider */ } = ApplicationProvider();
11
- \t
12
- \tconst example = async () => {
13
- \t\t// Using async helpers from core presenter factory
14
- \t\treturn await createAsyncResource(Promise.resolve({}));
15
- \t};
16
- \t
17
- \treturn { example };
18
- });`;
19
-
20
- const presenterWithPackageTemplate = `import { createPresenter } from '@azure-net/kit';
21
- import { ApplicationProvider } from '\${{context}}/application';
22
-
23
- export const {{name}}Presenter = createPresenter('{{name}}Presenter', () => {
24
- \tconst { /* extract services from ApplicationProvider */ } = ApplicationProvider();
25
- \t
26
- \tconst example = async () => {
27
- \t\t// Direct method without async helpers
28
- \t\treturn await Promise.resolve({});
29
- \t};
30
- \t
31
- \treturn { example };
32
- });`;
33
-
34
- export default async function generatePresenter() {
35
- const context = await selectContext('Select context for presenter:');
36
-
37
- const { name } = await prompts({
38
- type: 'text',
39
- name: 'name',
40
- message: 'Module name (will create folder in delivery):'
41
- });
42
-
43
- // Check for core presenters
44
- const corePresenters = await getAvailableFiles(
45
- path.join(process.cwd(), 'src/core/presenters')
46
- );
47
-
48
- const presenterChoices = [
49
- { title: 'Use createPresenter from package', value: 'package' },
50
- ...corePresenters.map(p => ({ title: `Use ${p} from core`, value: p }))
51
- ];
52
-
53
- const { presenterType } = await prompts({
54
- type: 'select',
55
- name: 'presenterType',
56
- message: 'Select presenter factory:',
57
- choices: presenterChoices
58
- });
59
-
60
- const pascalName = toPascalCase(name);
61
- const moduleLower = toKebabCase(pascalName);
62
- const contextPath = getContextPath(context);
63
- const modulePath = path.join(contextPath, 'delivery', moduleLower);
64
- const filePath = path.join(modulePath, `${pascalName}Presenter.ts`);
65
-
66
- const content = presenterType === 'package'
67
- ? presenterWithPackageTemplate
68
- .replace(/{{name}}/g, pascalName)
69
- .replace(/{{context}}/g, context)
70
- : presenterWithCoreTemplate
71
- .replace(/{{name}}/g, pascalName)
72
- .replace(/{{corePresenter}}/g, presenterType)
73
- .replace(/{{context}}/g, context);
74
-
75
- await writeIfNotExists(filePath, content);
76
- await writeIfNotExists(
77
- path.join(modulePath, 'index.ts'),
78
- `export * from './${pascalName}Presenter';`
79
- );
80
-
81
- // Update core index
82
- await updateCoreIndex();
83
-
84
- console.log(`✅ Presenter created at ${filePath}`);
85
- console.log(`\n💡 Remember to extract needed services from ApplicationProvider in the presenter.`);
86
- }
@@ -1,76 +0,0 @@
1
- import prompts from 'prompts';
2
- import path from 'path';
3
- import { selectContext, getContextPath, toPascalCase, getAvailableFiles, toCamelCase } from '../../utils/contextUtils.js';
4
- import { writeIfNotExists, updateIndexTs, updateCoreIndex } from '../../utils/fileUtils.js';
5
-
6
- const repositoryTemplate = `import { {{datasource}} } from '{{datasourceImport}}';
7
-
8
- export class {{name}}Repository {
9
- \tconstructor(private {{datasourceVar}}: {{datasource}}) {}
10
- \t
11
- \tpublic async example() {
12
- \t\treturn this.{{datasourceVar}}.createRequest(({ http }) =>
13
- \t\t\thttp.get('/endpoint')
14
- \t\t).then(res => res.getData());
15
- \t}
16
- }`;
17
-
18
- export default async function generateRepository() {
19
- const context = await selectContext('Select context for repository:');
20
-
21
- const { name } = await prompts({
22
- type: 'text',
23
- name: 'name',
24
- message: 'Repository name (without "Repository" suffix):'
25
- });
26
-
27
- // Get available datasources
28
- const contextPath = getContextPath(context);
29
- const coreDatasources = await getAvailableFiles(
30
- path.join(process.cwd(), 'src/core/datasources')
31
- );
32
- const contextDatasources = await getAvailableFiles(
33
- path.join(contextPath, 'infrastructure/http/datasources')
34
- );
35
-
36
- const allDatasources = [
37
- ...coreDatasources.map(d => ({ title: `${d} (core)`, value: { name: d, from: 'core' } })),
38
- ...contextDatasources.map(d => ({ title: `${d} (${context})`, value: { name: d, from: context } }))
39
- ];
40
-
41
- if (allDatasources.length === 0) {
42
- console.error('❌ No datasources available. Create a datasource first.');
43
- return;
44
- }
45
-
46
- const { datasource } = await prompts({
47
- type: 'select',
48
- name: 'datasource',
49
- message: 'Select datasource:',
50
- choices: allDatasources
51
- });
52
-
53
- const pascalName = toPascalCase(name);
54
- const repoPath = path.join(contextPath, 'infrastructure/http/repositories');
55
- const filePath = path.join(repoPath, `${pascalName}Repository.ts`);
56
-
57
- // Generate repository
58
- const datasourceImport = datasource.from === 'core'
59
- ? '$core/datasources'
60
- : `\${context}/infrastructure/http/datasources`;
61
-
62
- const content = repositoryTemplate
63
- .replace(/{{name}}/g, pascalName)
64
- .replace(/{{datasource}}/g, datasource.name)
65
- .replace(/{{datasourceImport}}/g, datasourceImport)
66
- .replace(/{{datasourceVar}}/g, toCamelCase(datasource.name));
67
-
68
- await writeIfNotExists(filePath, content);
69
- await updateIndexTs(repoPath);
70
-
71
- // Update core index
72
- await updateCoreIndex();
73
-
74
- console.log(`✅ Repository created at ${filePath}`);
75
- console.log(`\n💡 Remember to manually add this repository to InfrastructureProvider when needed.`);
76
- }
@@ -1,41 +0,0 @@
1
- import prompts from 'prompts';
2
- import path from 'path';
3
- import { selectContext, getContextPath, toPascalCase } from '../../utils/contextUtils.js';
4
- import { writeIfNotExists, updateIndexTs, updateCoreIndex } from '../../utils/fileUtils.js';
5
-
6
- const responseTemplate = `import { ResponseBuilder } from '@azure-net/kit/infra';
7
-
8
- export class {{name}}Response<TData = unknown, TMeta = unknown> extends ResponseBuilder<TData, TMeta, TData> {
9
- }`;
10
-
11
- export default async function generateResponse() {
12
- const context = await selectContext('Select context for response (or core):');
13
-
14
- const { name } = await prompts({
15
- type: 'text',
16
- name: 'name',
17
- message: 'Response name (without "Response" suffix):'
18
- });
19
-
20
- const pascalName = toPascalCase(name);
21
- const contextPath = context === 'core'
22
- ? path.join(process.cwd(), 'src/core')
23
- : getContextPath(context);
24
-
25
- const responsePath = context === 'core'
26
- ? path.join(contextPath, 'responses')
27
- : path.join(contextPath, 'infrastructure/responses');
28
-
29
- const content = responseTemplate.replace(/{{name}}/g, pascalName);
30
- const filePath = path.join(responsePath, `${pascalName}Response.ts`);
31
-
32
- await writeIfNotExists(filePath, content);
33
- await updateIndexTs(responsePath);
34
-
35
- // Update core index if needed
36
- if (context === 'core') {
37
- await updateCoreIndex();
38
- }
39
-
40
- console.log(`✅ Response created at ${filePath}`);
41
- }
@@ -1,96 +0,0 @@
1
- import prompts from 'prompts';
2
- import path from 'path';
3
- import fs from 'fs/promises';
4
- import { selectContext, getContextPath, toPascalCase, getAvailableFiles } from '../../utils/contextUtils.js';
5
- import { writeIfNotExists, updateIndexTs } from '../../utils/fileUtils.js';
6
-
7
- const schemaWithCoreTemplate = `import { {{coreSchema}} } from '\$core/schemas';
8
-
9
- export const {{name}}Schema = {{coreSchema}}()
10
- \t.rules((rules) => ({
11
- \t\t// Add validation rules here
12
- \t}))
13
- \t.create();`;
14
-
15
- const schemaWithPackageTemplate = `import { createSchemaFactory } from '@azure-net/kit';
16
- import { createRules, validationMessagesI18n } from '@azure-net/kit/schema';
17
-
18
- const Schema = createSchemaFactory(createRules(validationMessagesI18n));
19
-
20
- export const {{name}}Schema = Schema()
21
- \t.rules((rules) => ({
22
- \t\t// Add validation rules here
23
- \t}))
24
- \t.create();`;
25
-
26
- export default async function generateSchema() {
27
- const context = await selectContext('Select context for schema:');
28
-
29
- if (context === 'core') {
30
- console.error('❌ Cannot create schema in core. Choose a specific context.');
31
- return;
32
- }
33
-
34
- const { module } = await prompts({
35
- type: 'text',
36
- name: 'module',
37
- message: 'Module name (folder in delivery):'
38
- });
39
-
40
- const { name } = await prompts({
41
- type: 'text',
42
- name: 'name',
43
- message: 'Schema name (without "Schema" suffix):'
44
- });
45
-
46
- // Check for core schemas
47
- const coreSchemas = await getAvailableFiles(
48
- path.join(process.cwd(), 'src/core/schemas')
49
- );
50
-
51
- const choices = [
52
- { title: 'Use createSchemaFactory from package', value: 'package' },
53
- ...coreSchemas.map(s => ({ title: `Use ${s} from core`, value: s }))
54
- ];
55
-
56
- const { schemaType } = await prompts({
57
- type: 'select',
58
- name: 'schemaType',
59
- message: 'Select schema factory:',
60
- choices
61
- });
62
-
63
- const pascalName = toPascalCase(name);
64
- const moduleName = toPascalCase(module);
65
- const moduleLower = moduleName.toLowerCase();
66
- const entityLower = moduleName.toLowerCase();
67
- const contextPath = getContextPath(context);
68
- const schemaPath = path.join(contextPath, 'delivery', moduleLower, 'schema');
69
- const filePath = path.join(schemaPath, `${pascalName}Schema.ts`);
70
-
71
- const content = schemaType === 'package'
72
- ? schemaWithPackageTemplate
73
- .replace(/{{name}}/g, pascalName)
74
- .replace(/{{context}}/g, context)
75
- .replace(/{{entityLower}}/g, entityLower)
76
- : schemaWithCoreTemplate
77
- .replace(/{{name}}/g, pascalName)
78
- .replace(/{{context}}/g, context)
79
- .replace(/{{entityLower}}/g, entityLower)
80
- .replace(/{{coreSchema}}/g, schemaType);
81
-
82
- await writeIfNotExists(filePath, content);
83
- await updateIndexTs(schemaPath);
84
-
85
- // Update module index
86
- const moduleIndexPath = path.join(contextPath, 'delivery', moduleLower, 'index.ts');
87
- if (await fs.access(moduleIndexPath).then(() => true).catch(() => false)) {
88
- let indexContent = await fs.readFile(moduleIndexPath, 'utf-8');
89
- if (!indexContent.includes(`export * from './schema'`)) {
90
- indexContent += `\nexport * from './schema';`;
91
- await fs.writeFile(moduleIndexPath, indexContent, 'utf-8');
92
- }
93
- }
94
-
95
- console.log(`✅ Schema created at ${filePath}`);
96
- }
@@ -1,71 +0,0 @@
1
- import prompts from 'prompts';
2
- import path from 'path';
3
- import { selectContext, getContextPath, toPascalCase, getAvailableFiles } from '../../utils/contextUtils.js';
4
- import { writeIfNotExists, updateIndexTs } from '../../utils/fileUtils.js';
5
-
6
- const serviceTemplate = `import { ClassMirror } from '@azure-net/kit';
7
- import { {{repository}} } from '\${{context}}/infrastructure/http/repositories';
8
-
9
- export class {{name}}Service extends ClassMirror<{{repository}}> {
10
- \tconstructor(private {{repositoryVar}}: {{repository}}) {
11
- \t\tsuper({{repositoryVar}});
12
- \t}
13
- \t
14
- \tdeclare example: {{repository}}['example'];
15
- }`;
16
-
17
- const serviceWithoutRepoTemplate = `export class {{name}}Service {
18
- \tconstructor() {}
19
- \t
20
- \tpublic async example() {
21
- \t\t// Implement service logic
22
- \t\treturn {};
23
- \t}
24
- }`;
25
-
26
- export default async function generateService() {
27
- const context = await selectContext('Select context for service:');
28
-
29
- const { name } = await prompts({
30
- type: 'text',
31
- name: 'name',
32
- message: 'Service name (without "Service" suffix):'
33
- });
34
-
35
- // Get available repositories
36
- const contextPath = getContextPath(context);
37
- const repositories = await getAvailableFiles(
38
- path.join(contextPath, 'infrastructure', 'http', 'repositories')
39
- );
40
-
41
- const choices = [
42
- { title: 'Without repository', value: null },
43
- ...repositories.map(r => ({ title: `${r}`, value: r }))
44
- ];
45
-
46
- const { repository } = await prompts({
47
- type: 'select',
48
- name: 'repository',
49
- message: 'Select repository:',
50
- choices
51
- });
52
-
53
- const pascalName = toPascalCase(name);
54
- const servicePath = path.join(contextPath, 'application', 'services');
55
- const filePath = path.join(servicePath, `${pascalName}Service.ts`);
56
-
57
- // Generate service
58
- const content = repository
59
- ? serviceTemplate
60
- .replace(/{{name}}/g, pascalName)
61
- .replace(/{{repository}}/g, repository)
62
- .replace(/{{repositoryVar}}/g, repository.charAt(0).toLowerCase() + repository.slice(1))
63
- .replace(/{{context}}/g, context)
64
- : serviceWithoutRepoTemplate.replace(/{{name}}/g, pascalName);
65
-
66
- await writeIfNotExists(filePath, content);
67
- await updateIndexTs(servicePath);
68
-
69
- console.log(`✅ Service created at ${filePath}`);
70
- console.log(`\n💡 Remember to manually add this service to ApplicationProvider when needed.`);
71
- }
@@ -1,53 +0,0 @@
1
- import prompts from 'prompts';
2
- import path from 'path';
3
- import { selectContext } from '../../utils/contextUtils.js';
4
- import { writeIfNotExists } from '../../utils/fileUtils.js';
5
-
6
- const widgetTemplate = `<script lang="ts">
7
- \timport './style.scss';
8
- </script>
9
-
10
- {{widgetName}}
11
- `;
12
-
13
- const styleTemplate = `// Add your styles here
14
- `;
15
-
16
- export default async function generateWidget() {
17
- const context = await selectContext('Select context for widget:');
18
-
19
- const { widgetPath } = await prompts({
20
- type: 'text',
21
- name: 'widgetPath',
22
- message: 'Widget path (e.g. modals/ConfirmModal):',
23
- validate: value => value.length > 0 ? true : 'Path cannot be empty'
24
- });
25
-
26
- // Parse the path
27
- const normalizedPath = widgetPath.replace(/\\/g, '/');
28
- const pathParts = normalizedPath.split('/');
29
- const widgetName = pathParts[pathParts.length - 1];
30
-
31
- // Build the full path: src/app/{context}/ui/widgets/{path}
32
- const contextUiPath = path.join(process.cwd(), 'src/app', context, 'ui/widgets');
33
- const fullWidgetPath = path.join(contextUiPath, normalizedPath);
34
-
35
- console.log(`\n🚀 Generating widget: ${widgetName}...\n`);
36
-
37
- // Create Component.svelte
38
- await writeIfNotExists(
39
- path.join(fullWidgetPath, 'Component.svelte'),
40
- widgetTemplate.replace(/{{widgetName}}/g, widgetName)
41
- );
42
-
43
- // Create style.scss
44
- await writeIfNotExists(
45
- path.join(fullWidgetPath, 'style.scss'),
46
- styleTemplate
47
- );
48
-
49
- console.log(`✅ Widget created at: ${fullWidgetPath}`);
50
- console.log(`\n💡 Files created:`);
51
- console.log(` - Component.svelte`);
52
- console.log(` - style.scss`);
53
- }