libmodulor 0.25.0 → 0.26.0

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 (123) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +32 -151
  3. package/dist/esm/app/workers/AppUCsLoader.d.ts +2 -3
  4. package/dist/esm/apps/Helper/src/i18n.d.ts +39 -2
  5. package/dist/esm/apps/Helper/src/i18n.js +15 -1
  6. package/dist/esm/apps/Helper/src/lib/SrcFilesGenerator.d.ts +13 -0
  7. package/dist/esm/apps/Helper/src/lib/SrcFilesGenerator.js +37 -0
  8. package/dist/esm/apps/Helper/src/lib/consts.d.ts +2 -0
  9. package/dist/esm/apps/Helper/src/lib/consts.js +2 -0
  10. package/dist/esm/apps/Helper/src/lib/funcs.d.ts +4 -0
  11. package/dist/esm/apps/Helper/src/lib/funcs.js +9 -0
  12. package/dist/esm/apps/Helper/src/lib/io.d.ts +10 -0
  13. package/dist/esm/apps/Helper/src/lib/io.js +22 -0
  14. package/dist/esm/apps/Helper/src/lib/layers/app.d.ts +3 -0
  15. package/dist/esm/apps/Helper/src/lib/layers/app.js +30 -0
  16. package/dist/esm/apps/Helper/src/lib/layers/product.d.ts +3 -0
  17. package/dist/esm/apps/Helper/src/lib/layers/product.js +27 -0
  18. package/dist/esm/apps/Helper/src/lib/layers/project.d.ts +4 -0
  19. package/dist/esm/apps/Helper/src/lib/layers/project.js +163 -0
  20. package/dist/esm/apps/Helper/src/lib/layers/target.d.ts +3 -0
  21. package/dist/esm/apps/Helper/src/lib/layers/target.js +202 -0
  22. package/dist/esm/apps/Helper/src/lib/layers/uc.d.ts +3 -0
  23. package/dist/esm/apps/Helper/src/lib/layers/uc.js +113 -0
  24. package/dist/esm/apps/Helper/src/lib/project.js +15 -17
  25. package/dist/esm/apps/Helper/src/lib/types.d.ts +3 -0
  26. package/dist/esm/apps/Helper/src/lib/types.js +1 -0
  27. package/dist/esm/apps/Helper/src/manifest.d.ts +20 -0
  28. package/dist/esm/apps/Helper/src/manifest.js +20 -0
  29. package/dist/esm/apps/Helper/src/ucds/CreateAppUCD.d.ts +7 -0
  30. package/dist/esm/apps/Helper/src/ucds/CreateAppUCD.js +101 -0
  31. package/dist/esm/apps/Helper/src/ucds/CreateProductUCD.d.ts +7 -0
  32. package/dist/esm/apps/Helper/src/ucds/CreateProductUCD.js +101 -0
  33. package/dist/esm/apps/Helper/src/ucds/CreateProjectUCD.d.ts +1 -17
  34. package/dist/esm/apps/Helper/src/ucds/CreateProjectUCD.js +40 -34
  35. package/dist/esm/apps/Helper/src/ucds/CreateTargetUCD.d.ts +9 -0
  36. package/dist/esm/apps/Helper/src/ucds/CreateTargetUCD.js +109 -0
  37. package/dist/esm/apps/Helper/src/ucds/CreateUCUCD.d.ts +8 -0
  38. package/dist/esm/apps/Helper/src/ucds/CreateUCUCD.js +87 -0
  39. package/dist/esm/apps/Helper/src/ucds/DeleteGeneratedAppsTestsUCD.d.ts +1 -1
  40. package/dist/esm/apps/Helper/src/ucds/DeleteGeneratedAppsTestsUCD.js +1 -1
  41. package/dist/esm/apps/Helper/src/ucds/GenerateAppsTestsUCD.d.ts +1 -1
  42. package/dist/esm/apps/Helper/src/ucds/GenerateAppsTestsUCD.js +1 -1
  43. package/dist/esm/apps/Helper/src/ucds/TestAppUCD.d.ts +1 -1
  44. package/dist/esm/apps/Helper/src/ucds/TestAppUCD.js +1 -1
  45. package/dist/esm/convention.d.ts +15 -4
  46. package/dist/esm/convention.js +33 -9
  47. package/dist/esm/error/funcs.d.ts +2 -0
  48. package/dist/esm/error/funcs.js +20 -0
  49. package/dist/esm/error/index.d.ts +1 -1
  50. package/dist/esm/error/index.js +1 -1
  51. package/dist/esm/index.d.ts +2 -0
  52. package/dist/esm/index.js +2 -0
  53. package/dist/esm/index.node-test.d.ts +1 -1
  54. package/dist/esm/index.node-test.js +1 -1
  55. package/dist/esm/product/index.d.ts +1 -1
  56. package/dist/esm/product/index.js +1 -1
  57. package/dist/esm/product/workers/ProductUCsLoader.d.ts +8 -6
  58. package/dist/esm/product/workers/ProductUCsLoader.js +19 -5
  59. package/dist/esm/products/Helper/cli-node-core/container.d.ts +3 -0
  60. package/dist/esm/products/Helper/cli-node-core/container.js +26 -0
  61. package/dist/esm/products/Helper/cli-node-core/index.d.ts +1 -0
  62. package/dist/esm/products/Helper/cli-node-core/index.js +9 -0
  63. package/dist/esm/products/Helper/i18n.d.ts +101 -2
  64. package/dist/esm/products/Helper/targets/node-core-cli/container.d.ts +3 -0
  65. package/dist/esm/products/Helper/targets/node-core-cli/container.js +26 -0
  66. package/dist/esm/products/Helper/targets/node-core-cli/index.d.ts +1 -0
  67. package/dist/esm/products/Helper/targets/node-core-cli/index.js +9 -0
  68. package/dist/esm/std/SettingsManager.d.ts +3 -16
  69. package/dist/esm/std/SettingsManager.js +1 -16
  70. package/dist/esm/std/ShellCommandExecutor.d.ts +1 -1
  71. package/dist/esm/std/consts.js +4 -4
  72. package/dist/esm/std/impl/EnvSettingsManager.d.ts +5 -4
  73. package/dist/esm/std/impl/EnvSettingsManager.js +40 -62
  74. package/dist/esm/std/impl/FakeFSManager.d.ts +3 -1
  75. package/dist/esm/std/impl/FakeFSManager.js +3 -0
  76. package/dist/esm/std/impl/FakeShellCommandExecutor.d.ts +12 -0
  77. package/dist/esm/std/impl/FakeShellCommandExecutor.js +30 -0
  78. package/dist/esm/std/impl/StaticSettingsManager.d.ts +1 -1
  79. package/dist/esm/std/impl/StaticSettingsManager.js +3 -0
  80. package/dist/esm/std/index.d.ts +1 -0
  81. package/dist/esm/std/index.js +1 -0
  82. package/dist/esm/std/lib/settings.d.ts +5 -0
  83. package/dist/esm/std/lib/settings.js +39 -0
  84. package/dist/esm/target/edge-worker-hono-server/SyncEdgeWorkerHonoServerManager.d.ts +3 -1
  85. package/dist/esm/target/edge-worker-hono-server/SyncEdgeWorkerHonoServerManager.js +12 -7
  86. package/dist/esm/target/index.d.ts +1 -0
  87. package/dist/esm/target/index.js +1 -0
  88. package/dist/esm/target/lib/cli/CLIManager.d.ts +2 -2
  89. package/dist/esm/target/lib/client/consts.js +2 -1
  90. package/dist/esm/target/lib/entrypoint.d.ts +2 -0
  91. package/dist/esm/target/lib/entrypoint.js +1 -0
  92. package/dist/esm/target/lib/manifest.d.ts +13 -0
  93. package/dist/esm/target/lib/manifest.js +11 -0
  94. package/dist/esm/target/lib/mcp-server/MCPServerBooter.d.ts +2 -2
  95. package/dist/esm/target/lib/server/CustomerFacingErrorBuilder.js +6 -1
  96. package/dist/esm/target/lib/server/ServerBooter.d.ts +2 -2
  97. package/dist/esm/target/lib/server/ServerRequestHandler.js +6 -2
  98. package/dist/esm/target/lib/server/consts.js +2 -1
  99. package/dist/esm/target/lib/server-express/funcs.d.ts +2 -0
  100. package/dist/esm/target/lib/server-express/funcs.js +6 -0
  101. package/dist/esm/target/lib/server-hono/funcs.d.ts +2 -1
  102. package/dist/esm/target/lib/server-hono/funcs.js +7 -3
  103. package/dist/esm/target/node-express-server/NodeExpressServerManager.d.ts +3 -1
  104. package/dist/esm/target/node-express-server/NodeExpressServerManager.js +17 -12
  105. package/dist/esm/target/node-hono-server/NodeHonoServerManager.d.ts +3 -1
  106. package/dist/esm/target/node-hono-server/NodeHonoServerManager.js +15 -10
  107. package/dist/esm/target/node-stricli-cli/NodeStricliCLIManager.d.ts +3 -1
  108. package/dist/esm/target/node-stricli-cli/NodeStricliCLIManager.js +9 -5
  109. package/dist/esm/testing/impl/NodeAppTesterConfigurator.d.ts +15 -0
  110. package/dist/esm/testing/impl/NodeAppTesterConfigurator.js +68 -0
  111. package/dist/esm/testing/impl/VitestAppTestSuiteEmitter.d.ts +2 -0
  112. package/dist/esm/testing/impl/VitestAppTestSuiteEmitter.js +27 -10
  113. package/dist/esm/testing/impl/newNodeAppTester.js +3 -4
  114. package/dist/esm/testing/opts.d.ts +1 -1
  115. package/dist/esm/utils/ioc/bindCommon.d.ts +4 -4
  116. package/dist/esm/utils/ioc/bindCommon.js +17 -15
  117. package/dist/esm/utils/ioc/bindNodeCore.js +5 -0
  118. package/dist/esm/utils/ioc/bindServer.js +8 -2
  119. package/package.json +9 -8
  120. package/pnpm-workspace.yaml +0 -8
  121. package/tsconfig.build.examples.json +0 -8
  122. package/tsconfig.json +0 -36
  123. package/vitest.config.ts +0 -16
@@ -0,0 +1,3 @@
1
+ import type { TargetName } from '../../../../../target/index.js';
2
+ import type { Files } from '../SrcFilesGenerator.js';
3
+ export declare function files(name: TargetName): Files;
@@ -0,0 +1,202 @@
1
+ import { PRODUCT_I18N_FILE_NAME, PRODUCT_I18N_NAME, PRODUCT_MANIFEST_FILE_NAME, PRODUCT_MANIFEST_NAME, PRODUCT_ROOT_FROM_PRODUCT_TARGET_PATH, } from '../../../../../convention.js';
2
+ import { LIB_NAME } from '../consts.js';
3
+ import { fileImportName } from '../funcs.js';
4
+ const PRODUCT_ROOT = PRODUCT_ROOT_FROM_PRODUCT_TARGET_PATH.join('/');
5
+ const COMMON_CONTAINER_IMPORTS = `import { ${PRODUCT_I18N_NAME} } from '${PRODUCT_ROOT}/${fileImportName(PRODUCT_I18N_FILE_NAME)}';
6
+ import { ${PRODUCT_MANIFEST_NAME} } from '${PRODUCT_ROOT}/${fileImportName(PRODUCT_MANIFEST_FILE_NAME)}';
7
+ import { type S, settings } from './settings.js';`;
8
+ const NODE_CORE_CLI_CONTAINER_TS = `import { Container } from 'inversify';
9
+ import {
10
+ bindCommon,
11
+ bindProduct,
12
+ CONTAINER_OPTS,
13
+ updateSettings,
14
+ } from '${LIB_NAME}';
15
+ import { bindNodeCLI, bindNodeCore } from '${LIB_NAME}/node';
16
+
17
+ ${COMMON_CONTAINER_IMPORTS}
18
+
19
+ const container = new Container(CONTAINER_OPTS);
20
+
21
+ bindCommon(container);
22
+ updateSettings<S>(container, settings);
23
+ bindNodeCore(container);
24
+ bindNodeCLI(container);
25
+ bindProduct(container, Manifest, I18n);
26
+
27
+ export default container;
28
+ `;
29
+ const NODE_CORE_CLI_INDEX_TS = `import { NodeCoreCLIManager } from '${LIB_NAME}/node';
30
+
31
+ import container from './container.js';
32
+
33
+ await container.get(NodeCoreCLIManager).handleCommand({
34
+ srcImporter: (path) => import(path),
35
+ });
36
+ `;
37
+ const NODE_CORE_CLI_SETTINGS_TS = `import {
38
+ type ServerClientManagerSettings,
39
+ TARGET_DEFAULT_SERVER_CLIENT_MANAGER_SETTINGS,
40
+ } from '${LIB_NAME}';
41
+
42
+ export type S = ServerClientManagerSettings;
43
+
44
+ export const settings: S = {
45
+ ...TARGET_DEFAULT_SERVER_CLIENT_MANAGER_SETTINGS,
46
+ };
47
+ `;
48
+ const NODE_EXPRESS_SERVER_CONTAINER_TS = `import { Container } from 'inversify';
49
+ import {
50
+ bindCommon,
51
+ bindProduct,
52
+ CONTAINER_OPTS,
53
+ type ServerManager,
54
+ updateSettings,
55
+ } from '${LIB_NAME}';
56
+ import { bindNodeCore } from '${LIB_NAME}/node';
57
+ import {
58
+ bindServer,
59
+ NodeExpressServerManager,
60
+ } from '${LIB_NAME}/node-express';
61
+
62
+ ${COMMON_CONTAINER_IMPORTS}
63
+
64
+ const container = new Container(CONTAINER_OPTS);
65
+
66
+ bindCommon(container);
67
+ updateSettings<S>(container, settings);
68
+ bindNodeCore(container);
69
+ bindServer(container);
70
+ bindProduct(container, ${PRODUCT_MANIFEST_NAME}, ${PRODUCT_I18N_NAME});
71
+
72
+ container.bind<ServerManager>('ServerManager').to(NodeExpressServerManager);
73
+
74
+ export default container;
75
+ `;
76
+ const NODE_HONO_SERVER_CONTAINER_TS = `import { Container } from 'inversify';
77
+ import {
78
+ bindCommon,
79
+ bindProduct,
80
+ CONTAINER_OPTS,
81
+ type ServerManager,
82
+ updateSettings,
83
+ } from '${LIB_NAME}';
84
+ import { bindNodeCore } from '${LIB_NAME}/node';
85
+ import {
86
+ bindServer,
87
+ NodeHonoServerManager,
88
+ } from '${LIB_NAME}/node-hono';
89
+
90
+ ${COMMON_CONTAINER_IMPORTS}
91
+
92
+ const container = new Container(CONTAINER_OPTS);
93
+
94
+ bindCommon(container);
95
+ updateSettings<S>(container, settings);
96
+ bindNodeCore(container);
97
+ bindServer(container);
98
+ bindProduct(container, ${PRODUCT_MANIFEST_NAME}, ${PRODUCT_I18N_NAME});
99
+
100
+ container.bind<ServerManager>('ServerManager').to(NodeHonoServerManager);
101
+
102
+ export default container;
103
+ `;
104
+ const NODE_MCP_SERVER_CONTAINER_TS = `import { Container } from 'inversify';
105
+ import {
106
+ bindCommon,
107
+ bindProduct,
108
+ CONTAINER_OPTS,
109
+ type ServerManager,
110
+ updateSettings,
111
+ } from '${LIB_NAME}';
112
+ import { bindNodeCore } from '${LIB_NAME}/node';
113
+ import { NodeLocalStdioMCPServerManager } from '${LIB_NAME}/node-mcp';
114
+
115
+ ${COMMON_CONTAINER_IMPORTS}
116
+
117
+ const container = new Container(CONTAINER_OPTS);
118
+
119
+ bindCommon(container);
120
+ updateSettings<S>(container, settings);
121
+ bindNodeCore(container);
122
+ bindProduct(container, Manifest, I18n);
123
+
124
+ container
125
+ .bind<ServerManager>('ServerManager')
126
+ .to(NodeLocalStdioMCPServerManager);
127
+
128
+ export default container;
129
+ `;
130
+ const NODE_MCP_SERVER_INDEX_TS = `import { MCPServerBooter } from '${LIB_NAME}/node-mcp';
131
+
132
+ import container from './container.js';
133
+
134
+ await container.get(MCPServerBooter).exec({
135
+ srcImporter: (path) => import(path),
136
+ });
137
+ `;
138
+ const NODE_MCP_SERVER_SETTINGS_TS = `import {
139
+ type LoggerSettings,
140
+ type ServerClientManagerSettings,
141
+ TARGET_DEFAULT_SERVER_CLIENT_MANAGER_SETTINGS,
142
+ } from '${LIB_NAME}';
143
+
144
+ export type S = LoggerSettings & ServerClientManagerSettings;
145
+
146
+ export const settings: S = {
147
+ ...TARGET_DEFAULT_SERVER_CLIENT_MANAGER_SETTINGS,
148
+ logger_level: 'error',
149
+ };
150
+ `;
151
+ const SERVER_SETTINGS_TS = `import {
152
+ type JWTManagerSettings,
153
+ type ServerManagerSettings,
154
+ STD_DEFAULT_JWT_MANAGER_SETTINGS,
155
+ TARGET_DEFAULT_SERVER_MANAGER_SETTINGS,
156
+ } from '${LIB_NAME}';
157
+
158
+ export type S = JWTManagerSettings & ServerManagerSettings;
159
+
160
+ export const settings: S = {
161
+ ...TARGET_DEFAULT_SERVER_MANAGER_SETTINGS,
162
+ ...STD_DEFAULT_JWT_MANAGER_SETTINGS,
163
+ };
164
+ `;
165
+ const SERVER_INDEX_TS = `import { ServerBooter } from '${LIB_NAME}';
166
+
167
+ import container from './container.js';
168
+
169
+ await container.get(ServerBooter).exec({
170
+ srcImporter: (path) => import(path),
171
+ });
172
+ `;
173
+ const MAPPING = {
174
+ 'edge-worker-hono-server': new Map(),
175
+ 'nextjs-server': new Map(),
176
+ 'node-core-cli': new Map([
177
+ [['.', 'container.ts'], NODE_CORE_CLI_CONTAINER_TS],
178
+ [['.', 'index.ts'], NODE_CORE_CLI_INDEX_TS],
179
+ [['.', 'settings.ts'], NODE_CORE_CLI_SETTINGS_TS],
180
+ ]),
181
+ 'node-express-server': new Map([
182
+ [['.', 'container.ts'], NODE_EXPRESS_SERVER_CONTAINER_TS],
183
+ [['.', 'index.ts'], SERVER_INDEX_TS],
184
+ [['.', 'settings.ts'], SERVER_SETTINGS_TS],
185
+ ]),
186
+ 'node-hono-server': new Map([
187
+ [['.', 'container.ts'], NODE_HONO_SERVER_CONTAINER_TS],
188
+ [['.', 'index.ts'], SERVER_INDEX_TS],
189
+ [['.', 'settings.ts'], SERVER_SETTINGS_TS],
190
+ ]),
191
+ 'node-mcp-server': new Map([
192
+ [['.', 'container.ts'], NODE_MCP_SERVER_CONTAINER_TS],
193
+ [['.', 'index.ts'], NODE_MCP_SERVER_INDEX_TS],
194
+ [['.', 'settings.ts'], NODE_MCP_SERVER_SETTINGS_TS],
195
+ ]),
196
+ 'node-stricli-cli': new Map(),
197
+ 'react-native-pure': new Map(),
198
+ 'react-web-pure': new Map(),
199
+ };
200
+ export function files(name) {
201
+ return MAPPING[name];
202
+ }
@@ -0,0 +1,3 @@
1
+ import type { UCName } from '../../../../../uc/index.js';
2
+ import type { Files } from '../SrcFilesGenerator.js';
3
+ export declare function files(name: UCName): Files;
@@ -0,0 +1,113 @@
1
+ import { APP_MANIFEST_FILE_NAME, APP_MANIFEST_NAME, UC_DEF_FILE_NAME_SUFFIX, UC_DEF_SUFFIX, UC_DEF_TYPE, UC_INPUT_SUFFIX, UC_MAIN_SERVER_FILE_NAME_SUFFIX, UC_MAIN_SERVER_SUFFIX, UC_OPI0_SUFFIX, } from '../../../../../convention.js';
2
+ import { LIB_NAME } from '../consts.js';
3
+ import { fileImportName } from '../funcs.js';
4
+ const TODO = '// TODO : Replace me';
5
+ const FIELD_NAME = 'foo';
6
+ const UCD_TS = (name) => `import {
7
+ type FreeTextShort,
8
+ NobodyUCPolicy,
9
+ SendClientMain,
10
+ TFreeTextShort,
11
+ type UCDef,
12
+ type UCInput,
13
+ type UCInputFieldValue,
14
+ type UCOPIBase,
15
+ } from '${LIB_NAME}';
16
+
17
+ import { ${APP_MANIFEST_NAME} } from '../${fileImportName(APP_MANIFEST_FILE_NAME)}';
18
+ import { ${name}${UC_MAIN_SERVER_SUFFIX} } from './${fileImportName(`${name}${UC_MAIN_SERVER_SUFFIX}`)}';
19
+
20
+ export interface ${name}${UC_INPUT_SUFFIX} extends UCInput {
21
+ ${TODO}
22
+ ${FIELD_NAME}: UCInputFieldValue<FreeTextShort>;
23
+ }
24
+
25
+ export interface ${name}${UC_OPI0_SUFFIX} extends UCOPIBase {
26
+ ${TODO}
27
+ ${FIELD_NAME}: FreeTextShort;
28
+ }
29
+
30
+ export const ${name}${UC_DEF_SUFFIX}: ${UC_DEF_TYPE}<${name}${UC_INPUT_SUFFIX}, ${name}${UC_OPI0_SUFFIX}> = {
31
+ io: {
32
+ i: {
33
+ fields: {
34
+ ${FIELD_NAME}: {
35
+ ${TODO}
36
+ type: new TFreeTextShort(),
37
+ },
38
+ },
39
+ },
40
+ o: {
41
+ parts: {
42
+ _0: {
43
+ fields: {
44
+ ${FIELD_NAME}: {
45
+ ${TODO}
46
+ type: new TFreeTextShort(),
47
+ },
48
+ },
49
+ },
50
+ },
51
+ },
52
+ },
53
+ lifecycle: {
54
+ client: {
55
+ main: SendClientMain,
56
+ policy: NobodyUCPolicy,
57
+ },
58
+ server: {
59
+ main: ${name}${UC_MAIN_SERVER_SUFFIX},
60
+ policy: NobodyUCPolicy,
61
+ },
62
+ },
63
+ metadata: ${APP_MANIFEST_NAME}.ucReg.${name},
64
+ };
65
+ `;
66
+ const SERVER_MAIN_TS = (name) => `import { inject, injectable } from 'inversify';
67
+ import {
68
+ type UCMain,
69
+ type UCMainInput,
70
+ type UCManager,
71
+ type UCOutput,
72
+ UCOutputBuilder,
73
+ } from '${LIB_NAME}';
74
+
75
+ import type {
76
+ ${name}${UC_INPUT_SUFFIX},
77
+ ${name}${UC_OPI0_SUFFIX},
78
+ } from './${fileImportName(`${name}${UC_DEF_SUFFIX}`)}';
79
+
80
+ @injectable()
81
+ export class ${name}${UC_MAIN_SERVER_SUFFIX}
82
+ implements UCMain<${name}${UC_INPUT_SUFFIX}, ${name}${UC_OPI0_SUFFIX}>
83
+ {
84
+ constructor(@inject('UCManager') private ucManager: UCManager) {}
85
+
86
+ public async exec({
87
+ uc,
88
+ }: UCMainInput<${name}${UC_INPUT_SUFFIX}, ${name}${UC_OPI0_SUFFIX}>): Promise<
89
+ UCOutput<${name}${UC_OPI0_SUFFIX}>
90
+ > {
91
+ const ${FIELD_NAME} = uc.reqVal0('${FIELD_NAME}');
92
+
93
+ // >=> Save in data store
94
+ const { aggregateId } = await this.ucManager.persist(uc);
95
+
96
+ return new UCOutputBuilder<${name}${UC_OPI0_SUFFIX}>()
97
+ .add({
98
+ ${FIELD_NAME},
99
+ id: aggregateId,
100
+ })
101
+ .get();
102
+ }
103
+ }
104
+ `;
105
+ export function files(name) {
106
+ return new Map([
107
+ [['.', `${name}${UC_DEF_FILE_NAME_SUFFIX}`], UCD_TS(name)],
108
+ [
109
+ ['.', `${name}${UC_MAIN_SERVER_FILE_NAME_SUFFIX}`],
110
+ SERVER_MAIN_TS(name),
111
+ ],
112
+ ]);
113
+ }
@@ -35,7 +35,8 @@ const BIOME_JSON = `{
35
35
  "!**/coverage",
36
36
  "!**/dist",
37
37
  "!**/node_modules",
38
- "!**/package.json"
38
+ "!**/package.json",
39
+ "!**/src/**/test/reports"
39
40
  ]
40
41
  },
41
42
  "formatter": {
@@ -109,33 +110,30 @@ const README_MD = (name) => `# ${name}
109
110
  const TSCONFIG_JSON = `{
110
111
  "compilerOptions": {
111
112
  "allowSyntheticDefaultImports": true,
113
+ "allowUnreachableCode": false,
114
+ "allowUnusedLabels": false,
112
115
  "declaration": true,
116
+ "emitDecoratorMetadata": true,
117
+ "exactOptionalPropertyTypes": true,
118
+ "experimentalDecorators": true,
119
+ "jsx": "react-jsx",
113
120
  "lib": ["dom", "esnext"],
114
121
  "module": "NodeNext",
115
122
  "moduleResolution": "NodeNext",
116
123
  "noEmit": true,
117
- "removeComments": true,
118
- "skipLibCheck": true,
119
- "sourceMap": true,
120
- "target": "ESNext",
121
-
122
- "strict": true,
123
- "allowUnreachableCode": false,
124
- "allowUnusedLabels": false,
125
- "exactOptionalPropertyTypes": true,
126
124
  "noFallthroughCasesInSwitch": true,
127
- "noPropertyAccessFromIndexSignature": true,
128
125
  "noImplicitOverride": true,
129
126
  "noImplicitReturns": true,
127
+ "noPropertyAccessFromIndexSignature": true,
130
128
  "noUncheckedIndexedAccess": true,
131
129
  "noUnusedLocals": true,
132
130
  "noUnusedParameters": true,
133
- "verbatimModuleSyntax": true,
134
-
135
- "emitDecoratorMetadata": true,
136
- "experimentalDecorators": true,
137
-
138
- "jsx": "react-jsx"
131
+ "removeComments": true,
132
+ "skipLibCheck": true,
133
+ "sourceMap": true,
134
+ "strict": true,
135
+ "target": "ESNext",
136
+ "verbatimModuleSyntax": true
139
137
  }
140
138
  }
141
139
  `;
@@ -0,0 +1,3 @@
1
+ import type { FilePath } from '../../../../dt/index.js';
2
+ export type Creatable = 'App' | 'Project' | 'Product' | 'Target' | 'Use case';
3
+ export type Files = Map<FilePath[], string>;
@@ -0,0 +1 @@
1
+ export {};
@@ -2,11 +2,31 @@ export declare const Manifest: {
2
2
  languageCodes: "en"[];
3
3
  name: "Helper";
4
4
  ucReg: {
5
+ CreateApp: {
6
+ action: "Create";
7
+ icon: string;
8
+ name: "CreateApp";
9
+ };
10
+ CreateProduct: {
11
+ action: "Create";
12
+ icon: string;
13
+ name: "CreateProduct";
14
+ };
5
15
  CreateProject: {
6
16
  action: "Create";
7
17
  icon: string;
8
18
  name: "CreateProject";
9
19
  };
20
+ CreateTarget: {
21
+ action: "Create";
22
+ icon: string;
23
+ name: "CreateTarget";
24
+ };
25
+ CreateUC: {
26
+ action: "Create";
27
+ icon: string;
28
+ name: "CreateUC";
29
+ };
10
30
  DeleteGeneratedAppsTests: {
11
31
  action: "Delete";
12
32
  icon: string;
@@ -2,11 +2,31 @@ export const Manifest = {
2
2
  languageCodes: ['en'],
3
3
  name: 'Helper',
4
4
  ucReg: {
5
+ CreateApp: {
6
+ action: 'Create',
7
+ icon: 'plus',
8
+ name: 'CreateApp',
9
+ },
10
+ CreateProduct: {
11
+ action: 'Create',
12
+ icon: 'plus',
13
+ name: 'CreateProduct',
14
+ },
5
15
  CreateProject: {
6
16
  action: 'Create',
7
17
  icon: 'plus',
8
18
  name: 'CreateProject',
9
19
  },
20
+ CreateTarget: {
21
+ action: 'Create',
22
+ icon: 'plus',
23
+ name: 'CreateTarget',
24
+ },
25
+ CreateUC: {
26
+ action: 'Create',
27
+ icon: 'plus',
28
+ name: 'CreateUC',
29
+ },
10
30
  DeleteGeneratedAppsTests: {
11
31
  action: 'Delete',
12
32
  icon: 'trash-can',
@@ -0,0 +1,7 @@
1
+ import type { AppName } from '../../../../app/index.js';
2
+ import { type UCDef, type UCInputFieldValue } from '../../../../uc/index.js';
3
+ import { type AppInput } from '../lib/io.js';
4
+ export interface CreateAppInput extends AppInput {
5
+ appName: UCInputFieldValue<AppName>;
6
+ }
7
+ export declare const CreateAppUCD: UCDef<CreateAppInput>;
@@ -0,0 +1,101 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { inject, injectable } from 'inversify';
14
+ import { APP_NAME_PLACEHOLDER } from '../../../../convention.js';
15
+ import { TString } from '../../../../dt/index.js';
16
+ import { IllegalArgumentError } from '../../../../error/index.js';
17
+ import { EverybodyUCPolicy, } from '../../../../uc/index.js';
18
+ import { GIT_KEEP_FILE_NAME } from '../lib/consts.js';
19
+ import { successMessage } from '../lib/funcs.js';
20
+ import { AppInputFieldsDef } from '../lib/io.js';
21
+ import { files } from '../lib/layers/app.js';
22
+ import { SrcFilesGenerator } from '../lib/SrcFilesGenerator.js';
23
+ import { Manifest } from '../manifest.js';
24
+ let CreateAppClientMain = class CreateAppClientMain {
25
+ fsManager;
26
+ i18nManager;
27
+ logger;
28
+ srcFilesGenerator;
29
+ rootPath;
30
+ constructor(fsManager, i18nManager, logger, srcFilesGenerator) {
31
+ this.fsManager = fsManager;
32
+ this.i18nManager = i18nManager;
33
+ this.logger = logger;
34
+ this.srcFilesGenerator = srcFilesGenerator;
35
+ }
36
+ async exec({ uc }) {
37
+ const appsPath = uc.reqVal0('appsPath');
38
+ const appName = uc.reqVal0('appName');
39
+ this.rootPath = this.fsManager.path(appsPath, appName);
40
+ // TODO : Rollback the whole thing in case of failure
41
+ await this.assertNotExisting();
42
+ await this.createRootDir();
43
+ await this.srcFilesGenerator.exec({
44
+ files: files(appName),
45
+ rootPath: this.rootPath,
46
+ });
47
+ await this.rmGitKeep();
48
+ this.logger.info(successMessage('App'));
49
+ }
50
+ async assertNotExisting() {
51
+ if (!(await this.fsManager.exists(this.rootPath))) {
52
+ return;
53
+ }
54
+ throw new IllegalArgumentError(this.i18nManager.t('err_existing_app', {
55
+ vars: { appPath: this.rootPath },
56
+ }));
57
+ }
58
+ async createRootDir() {
59
+ this.logger.info('Creating root dir : %s', this.rootPath);
60
+ await this.fsManager.mkdir(this.rootPath, { recursive: true });
61
+ }
62
+ async rmGitKeep() {
63
+ const filePath = this.fsManager.path(this.rootPath, '..', GIT_KEEP_FILE_NAME);
64
+ if (!(await this.fsManager.exists(filePath))) {
65
+ return;
66
+ }
67
+ await this.fsManager.rm(filePath);
68
+ }
69
+ };
70
+ CreateAppClientMain = __decorate([
71
+ injectable(),
72
+ __param(0, inject('FSManager')),
73
+ __param(1, inject('I18nManager')),
74
+ __param(2, inject('Logger')),
75
+ __param(3, inject(SrcFilesGenerator)),
76
+ __metadata("design:paramtypes", [Object, Object, Object, SrcFilesGenerator])
77
+ ], CreateAppClientMain);
78
+ export const CreateAppUCD = {
79
+ ext: {
80
+ cmd: {
81
+ mountAt: 'CreateApp',
82
+ },
83
+ },
84
+ io: {
85
+ i: {
86
+ fields: {
87
+ ...AppInputFieldsDef,
88
+ appName: {
89
+ type: new TString().setExamples([APP_NAME_PLACEHOLDER]),
90
+ },
91
+ },
92
+ },
93
+ },
94
+ lifecycle: {
95
+ client: {
96
+ main: CreateAppClientMain,
97
+ policy: EverybodyUCPolicy,
98
+ },
99
+ },
100
+ metadata: Manifest.ucReg.CreateApp,
101
+ };
@@ -0,0 +1,7 @@
1
+ import type { ProductName } from '../../../../product/index.js';
2
+ import { type UCDef, type UCInputFieldValue } from '../../../../uc/index.js';
3
+ import { type ProductInput } from '../lib/io.js';
4
+ export interface CreateProductInput extends ProductInput {
5
+ productName: UCInputFieldValue<ProductName>;
6
+ }
7
+ export declare const CreateProductUCD: UCDef<CreateProductInput>;
@@ -0,0 +1,101 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { inject, injectable } from 'inversify';
14
+ import { PRODUCT_NAME_PLACEHOLDER } from '../../../../convention.js';
15
+ import { TString } from '../../../../dt/index.js';
16
+ import { IllegalArgumentError } from '../../../../error/index.js';
17
+ import { EverybodyUCPolicy, } from '../../../../uc/index.js';
18
+ import { GIT_KEEP_FILE_NAME } from '../lib/consts.js';
19
+ import { successMessage } from '../lib/funcs.js';
20
+ import { ProductInputFieldsDef } from '../lib/io.js';
21
+ import { files } from '../lib/layers/product.js';
22
+ import { SrcFilesGenerator } from '../lib/SrcFilesGenerator.js';
23
+ import { Manifest } from '../manifest.js';
24
+ let CreateProductClientMain = class CreateProductClientMain {
25
+ fsManager;
26
+ i18nManager;
27
+ logger;
28
+ srcFilesGenerator;
29
+ rootPath;
30
+ constructor(fsManager, i18nManager, logger, srcFilesGenerator) {
31
+ this.fsManager = fsManager;
32
+ this.i18nManager = i18nManager;
33
+ this.logger = logger;
34
+ this.srcFilesGenerator = srcFilesGenerator;
35
+ }
36
+ async exec({ uc }) {
37
+ const productsPath = uc.reqVal0('productsPath');
38
+ const productName = uc.reqVal0('productName');
39
+ this.rootPath = this.fsManager.path(productsPath, productName);
40
+ // TODO : Rollback the whole thing in case of failure
41
+ await this.assertNotExisting();
42
+ await this.createRootDir();
43
+ await this.srcFilesGenerator.exec({
44
+ files: files(productName),
45
+ rootPath: this.rootPath,
46
+ });
47
+ await this.rmGitKeep();
48
+ this.logger.info(successMessage('Product'));
49
+ }
50
+ async assertNotExisting() {
51
+ if (!(await this.fsManager.exists(this.rootPath))) {
52
+ return;
53
+ }
54
+ throw new IllegalArgumentError(this.i18nManager.t('err_existing_product', {
55
+ vars: { productPath: this.rootPath },
56
+ }));
57
+ }
58
+ async createRootDir() {
59
+ this.logger.info('Creating root dir : %s', this.rootPath);
60
+ await this.fsManager.mkdir(this.rootPath, { recursive: true });
61
+ }
62
+ async rmGitKeep() {
63
+ const filePath = this.fsManager.path(this.rootPath, '..', GIT_KEEP_FILE_NAME);
64
+ if (!(await this.fsManager.exists(filePath))) {
65
+ return;
66
+ }
67
+ await this.fsManager.rm(filePath);
68
+ }
69
+ };
70
+ CreateProductClientMain = __decorate([
71
+ injectable(),
72
+ __param(0, inject('FSManager')),
73
+ __param(1, inject('I18nManager')),
74
+ __param(2, inject('Logger')),
75
+ __param(3, inject(SrcFilesGenerator)),
76
+ __metadata("design:paramtypes", [Object, Object, Object, SrcFilesGenerator])
77
+ ], CreateProductClientMain);
78
+ export const CreateProductUCD = {
79
+ ext: {
80
+ cmd: {
81
+ mountAt: 'CreateProduct',
82
+ },
83
+ },
84
+ io: {
85
+ i: {
86
+ fields: {
87
+ ...ProductInputFieldsDef,
88
+ productName: {
89
+ type: new TString().setExamples([PRODUCT_NAME_PLACEHOLDER]),
90
+ },
91
+ },
92
+ },
93
+ },
94
+ lifecycle: {
95
+ client: {
96
+ main: CreateProductClientMain,
97
+ policy: EverybodyUCPolicy,
98
+ },
99
+ },
100
+ metadata: Manifest.ucReg.CreateProduct,
101
+ };