libmodulor 0.27.0 → 0.29.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 (208) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +2 -2
  3. package/dist/esm/apps/Helper/src/i18n.js +4 -4
  4. package/dist/esm/apps/Helper/src/lib/layers/project.js +6 -6
  5. package/dist/esm/apps/Helper/src/ucds/CreateAppUCD.js +5 -10
  6. package/dist/esm/apps/Helper/src/ucds/CreateProductUCD.js +5 -10
  7. package/dist/esm/apps/Helper/src/ucds/CreateTargetUCD.js +6 -11
  8. package/dist/esm/apps/Helper/src/ucds/TestAppUCD.js +5 -8
  9. package/dist/esm/dt/DataType.d.ts +2 -1
  10. package/dist/esm/dt/DataTypes.d.ts +1 -1
  11. package/dist/esm/dt/DataTypes.js +1 -0
  12. package/dist/esm/dt/base/TBase.d.ts +2 -0
  13. package/dist/esm/dt/base/TBase.js +5 -0
  14. package/dist/esm/dt/base/TBoolean.d.ts +2 -0
  15. package/dist/esm/dt/base/TBoolean.js +3 -0
  16. package/dist/esm/dt/base/TInt.d.ts +2 -0
  17. package/dist/esm/dt/base/TInt.js +3 -0
  18. package/dist/esm/dt/base/TNumber.d.ts +2 -0
  19. package/dist/esm/dt/base/TNumber.js +3 -0
  20. package/dist/esm/dt/base/TObject.d.ts +2 -0
  21. package/dist/esm/dt/base/TObject.js +29 -0
  22. package/dist/esm/dt/final/TApiKey.d.ts +2 -0
  23. package/dist/esm/dt/final/TApiKey.js +3 -0
  24. package/dist/esm/dt/final/TDateISO8601.d.ts +2 -0
  25. package/dist/esm/dt/final/TDateISO8601.js +3 -0
  26. package/dist/esm/dt/final/TDomainName.d.ts +2 -0
  27. package/dist/esm/dt/final/TDomainName.js +3 -0
  28. package/dist/esm/dt/final/TEmail.d.ts +2 -0
  29. package/dist/esm/dt/final/TEmail.js +3 -0
  30. package/dist/esm/dt/final/TEncryptionKey.d.ts +2 -0
  31. package/dist/esm/dt/final/TEncryptionKey.js +3 -0
  32. package/dist/esm/dt/final/TErrorCode.d.ts +7 -0
  33. package/dist/esm/dt/final/TErrorCode.js +9 -0
  34. package/dist/esm/dt/final/TFile.d.ts +2 -0
  35. package/dist/esm/dt/final/TFile.js +3 -0
  36. package/dist/esm/dt/final/TIPv4.d.ts +2 -0
  37. package/dist/esm/dt/final/TIPv4.js +3 -0
  38. package/dist/esm/dt/final/TIPv6.d.ts +2 -0
  39. package/dist/esm/dt/final/TIPv6.js +3 -0
  40. package/dist/esm/dt/final/TJWT.d.ts +2 -0
  41. package/dist/esm/dt/final/TJWT.js +3 -0
  42. package/dist/esm/dt/final/TPassword.d.ts +2 -0
  43. package/dist/esm/dt/final/TPassword.js +3 -0
  44. package/dist/esm/dt/final/TSSHPrivateKey.d.ts +2 -0
  45. package/dist/esm/dt/final/TSSHPrivateKey.js +3 -0
  46. package/dist/esm/dt/final/TTime.d.ts +2 -0
  47. package/dist/esm/dt/final/TTime.js +3 -0
  48. package/dist/esm/dt/final/TURL.d.ts +2 -0
  49. package/dist/esm/dt/final/TURL.js +3 -0
  50. package/dist/esm/dt/index.d.ts +2 -0
  51. package/dist/esm/dt/index.js +1 -0
  52. package/dist/esm/dt/targets/json-schema.d.ts +24 -0
  53. package/dist/esm/error/CustomError.d.ts +1 -1
  54. package/dist/esm/error/CustomError.js +2 -2
  55. package/dist/esm/error/ForbiddenAsNotFoundError.js +1 -1
  56. package/dist/esm/error/ForbiddenError.js +1 -1
  57. package/dist/esm/error/IllegalArgumentError.js +2 -2
  58. package/dist/esm/error/InternalServerError.js +1 -1
  59. package/dist/esm/error/NotFoundError.js +1 -1
  60. package/dist/esm/error/UnauthorizedError.js +1 -1
  61. package/dist/esm/error/UnavailableError.d.ts +6 -0
  62. package/dist/esm/error/UnavailableError.js +9 -0
  63. package/dist/esm/error/funcs.d.ts +3 -0
  64. package/dist/esm/error/funcs.js +3 -1
  65. package/dist/esm/error/index.d.ts +2 -1
  66. package/dist/esm/error/index.js +2 -1
  67. package/dist/esm/i18n/locales/de.js +8 -0
  68. package/dist/esm/i18n/locales/en.js +8 -0
  69. package/dist/esm/i18n/locales/es.js +8 -0
  70. package/dist/esm/i18n/locales/fr.js +8 -0
  71. package/dist/esm/i18n/types.d.ts +1 -1
  72. package/dist/esm/product/manifest.d.ts +2 -0
  73. package/dist/esm/products/Helper/i18n.d.ts +8 -0
  74. package/dist/esm/std/impl/SimpleHTTPAPICaller.js +1 -1
  75. package/dist/esm/std/impl/SimpleMapI18nManager.d.ts +1 -1
  76. package/dist/esm/std/impl/SimpleMapI18nManager.js +4 -2
  77. package/dist/esm/target/edge-worker-hono-server/SyncEdgeWorkerHonoServerManager.d.ts +6 -2
  78. package/dist/esm/target/edge-worker-hono-server/SyncEdgeWorkerHonoServerManager.js +17 -9
  79. package/dist/esm/target/index.d.ts +1 -0
  80. package/dist/esm/target/lib/cli/CommandExecutor.js +2 -2
  81. package/dist/esm/target/lib/cli/renderer.d.ts +2 -1
  82. package/dist/esm/target/lib/cli/renderer.js +10 -11
  83. package/dist/esm/target/lib/openapi/OpenAPISpecBuilder.d.ts +25 -0
  84. package/dist/esm/target/lib/openapi/OpenAPISpecBuilder.js +131 -0
  85. package/dist/esm/target/lib/openapi/consts.d.ts +2 -0
  86. package/dist/esm/target/lib/openapi/consts.js +1 -0
  87. package/dist/esm/target/lib/openapi/funcs.d.ts +16 -0
  88. package/dist/esm/target/lib/openapi/funcs.js +249 -0
  89. package/dist/esm/target/lib/openapi/input.d.ts +16 -0
  90. package/dist/esm/target/lib/openapi/input.js +33 -0
  91. package/dist/esm/target/lib/openapi/types.d.ts +109 -0
  92. package/dist/esm/target/lib/rn/input.d.ts +3 -0
  93. package/dist/esm/target/lib/server/AuthCookieCreator.d.ts +2 -1
  94. package/dist/esm/target/lib/server/AuthenticationChecker.d.ts +3 -3
  95. package/dist/esm/target/lib/server/AuthenticationChecker.js +5 -5
  96. package/dist/esm/target/lib/server/ServerBooter.d.ts +4 -2
  97. package/dist/esm/target/lib/server/ServerBooter.js +34 -11
  98. package/dist/esm/target/lib/server/ServerManager.d.ts +19 -9
  99. package/dist/esm/target/lib/server/ServerRequestHandler.d.ts +0 -1
  100. package/dist/esm/target/lib/server/ServerRequestHandler.js +2 -2
  101. package/dist/esm/target/lib/server/consts.d.ts +4 -0
  102. package/dist/esm/target/lib/server/consts.js +22 -0
  103. package/dist/esm/target/lib/server-express/CORSMiddlewareBuilder.d.ts +15 -0
  104. package/dist/esm/target/lib/server-express/CORSMiddlewareBuilder.js +55 -0
  105. package/dist/esm/target/lib/server-express/funcs.d.ts +2 -1
  106. package/dist/esm/target/lib/server-express/funcs.js +7 -2
  107. package/dist/esm/target/lib/server-hono/CORSMiddlewareBuilder.d.ts +14 -0
  108. package/dist/esm/target/{node-express-server/middlewares/PublicApiKeyCheckerMiddlewareBuilder.js → lib/server-hono/CORSMiddlewareBuilder.js} +22 -20
  109. package/dist/esm/target/lib/server-hono/funcs.d.ts +2 -1
  110. package/dist/esm/target/lib/server-hono/funcs.js +2 -1
  111. package/dist/esm/target/lib/shared.d.ts +4 -0
  112. package/dist/esm/target/lib/shared.js +2 -1
  113. package/dist/esm/target/nextjs-server/NextJSServerManager.d.ts +3 -1
  114. package/dist/esm/target/nextjs-server/NextJSServerManager.js +3 -0
  115. package/dist/esm/target/node-core-cli/NodeCoreCLIManager.js +1 -1
  116. package/dist/esm/target/node-express-server/NodeExpressServerManager.d.ts +7 -3
  117. package/dist/esm/target/node-express-server/NodeExpressServerManager.js +24 -14
  118. package/dist/esm/target/node-hono-server/NodeHonoServerManager.d.ts +6 -2
  119. package/dist/esm/target/node-hono-server/NodeHonoServerManager.js +21 -11
  120. package/dist/esm/target/node-mcp-server/NodeLocalStdioMCPServerManager.d.ts +3 -1
  121. package/dist/esm/target/node-mcp-server/NodeLocalStdioMCPServerManager.js +19 -14
  122. package/dist/esm/target/node-mcp-server/types.d.ts +0 -4
  123. package/dist/esm/target/react-web-pure/UCForm.d.ts +1 -1
  124. package/dist/esm/target/react-web-pure/UCForm.js +3 -2
  125. package/dist/esm/testing/workers/checkers/AppI18nChecker.js +4 -2
  126. package/dist/esm/uc/UC.d.ts +2 -0
  127. package/dist/esm/uc/UC.js +16 -1
  128. package/dist/esm/uc/data-store.d.ts +9 -1
  129. package/dist/esm/uc/data-store.js +33 -1
  130. package/dist/esm/uc/impl/CloudflareD1UCDataStore.d.ts +2 -2
  131. package/dist/esm/uc/impl/CloudflareD1UCDataStore.js +7 -0
  132. package/dist/esm/uc/impl/InMemoryUCDataStore.d.ts +8 -3
  133. package/dist/esm/uc/impl/InMemoryUCDataStore.js +19 -3
  134. package/dist/esm/uc/impl/KnexUCDataStore.d.ts +2 -2
  135. package/dist/esm/uc/impl/KnexUCDataStore.js +10 -2
  136. package/dist/esm/uc/impl/SimpleUCManager.d.ts +4 -4
  137. package/dist/esm/uc/impl/SimpleUCManager.js +10 -10
  138. package/dist/esm/uc/metadata.d.ts +7 -0
  139. package/dist/esm/uc/metadata.js +10 -0
  140. package/dist/esm/uc/output-field.d.ts +1 -0
  141. package/dist/esm/uc/output-field.js +13 -1
  142. package/dist/esm/uc/settings/consts.js +1 -0
  143. package/dist/esm/uc/settings.d.ts +8 -1
  144. package/dist/esm/uc/utils/ucHTTPContract.js +1 -1
  145. package/dist/esm/uc/workers/UCExecChecker.d.ts +3 -3
  146. package/dist/esm/uc/workers/UCExecChecker.js +5 -5
  147. package/dist/esm/utils/http/types.d.ts +5 -0
  148. package/dist/esm/utils/index.d.ts +2 -2
  149. package/dist/esm/utils/index.js +1 -1
  150. package/dist/esm/utils/ioc/bindCommon.js +4 -4
  151. package/dist/esm/utils/ioc/bindFactory.d.ts +2 -0
  152. package/dist/esm/utils/ioc/bindFactory.js +9 -0
  153. package/package.json +21 -20
  154. package/dist/esm/apps/Helper/src/lib/app.d.ts +0 -6
  155. package/dist/esm/apps/Helper/src/lib/app.js +0 -12
  156. package/dist/esm/apps/Helper/src/lib/project.d.ts +0 -3
  157. package/dist/esm/apps/Helper/src/lib/project.js +0 -163
  158. package/dist/esm/bundlers/vite/StripUCDLifecycleServerPlugin.d.ts +0 -2
  159. package/dist/esm/bundlers/vite/StripUCDLifecycleServerPlugin.js +0 -18
  160. package/dist/esm/products/Helper/cli-node-core/container.d.ts +0 -3
  161. package/dist/esm/products/Helper/cli-node-core/container.js +0 -26
  162. package/dist/esm/products/Helper/cli-node-core/index.js +0 -9
  163. package/dist/esm/products/Helper/container.d.ts +0 -3
  164. package/dist/esm/products/Helper/container.js +0 -26
  165. package/dist/esm/products/Helper/index.js +0 -16
  166. package/dist/esm/target/lib/react/common.d.ts +0 -6
  167. package/dist/esm/target/lib/react/common.js +0 -1
  168. package/dist/esm/target/lib/server/RequestHandler.d.ts +0 -14
  169. package/dist/esm/target/lib/server/RequestHandler.js +0 -1
  170. package/dist/esm/target/lib/server-node/stop.d.ts +0 -2
  171. package/dist/esm/target/lib/server-node/stop.js +0 -18
  172. package/dist/esm/target/node-express-server/lib/AuthCookieCreator.d.ts +0 -21
  173. package/dist/esm/target/node-express-server/lib/AuthCookieCreator.js +0 -50
  174. package/dist/esm/target/node-express-server/middlewares/AuthenticationCheckerMiddlewareBuilder.d.ts +0 -21
  175. package/dist/esm/target/node-express-server/middlewares/AuthenticationCheckerMiddlewareBuilder.js +0 -61
  176. package/dist/esm/target/node-express-server/middlewares/ErrorMiddlewareBuilder.d.ts +0 -12
  177. package/dist/esm/target/node-express-server/middlewares/ErrorMiddlewareBuilder.js +0 -35
  178. package/dist/esm/target/node-express-server/middlewares/HelmetMiddlewareBuilder.d.ts +0 -12
  179. package/dist/esm/target/node-express-server/middlewares/HelmetMiddlewareBuilder.js +0 -39
  180. package/dist/esm/target/node-express-server/middlewares/PublicApiKeyCheckerMiddlewareBuilder.d.ts +0 -18
  181. package/dist/esm/target/node-express-server/middlewares/RequestCheckerMiddlewareBuilder.d.ts +0 -12
  182. package/dist/esm/target/node-express-server/middlewares/RequestCheckerMiddlewareBuilder.js +0 -36
  183. package/dist/esm/target/node-express-server/middlewares/RequestHandlerMiddlewareBuilder.d.ts +0 -23
  184. package/dist/esm/target/node-express-server/middlewares/RequestHandlerMiddlewareBuilder.js +0 -154
  185. package/dist/esm/target/node-express-server/middlewares/RequestLoggerMiddlewareBuilder.d.ts +0 -13
  186. package/dist/esm/target/node-express-server/middlewares/RequestLoggerMiddlewareBuilder.js +0 -46
  187. package/dist/esm/testing/impl/SimpleAppDocsEmitter.d.ts +0 -7
  188. package/dist/esm/testing/impl/SimpleAppDocsEmitter.js +0 -180
  189. package/dist/esm/testing/impl/SimpleAppTesterConfigurator.d.ts +0 -14
  190. package/dist/esm/testing/impl/SimpleAppTesterConfigurator.js +0 -35
  191. package/dist/esm/uc/utils/stripUCDLifecycleServer.d.ts +0 -15
  192. package/dist/esm/uc/utils/stripUCDLifecycleServer.js +0 -77
  193. package/dist/esm/uc/utils/ucifcoIsForArray.d.ts +0 -8
  194. package/dist/esm/uc/utils/ucifcoIsForArray.js +0 -13
  195. package/dist/esm/utils/bundling/vite/StripUCDLifecycleServerPlugin.d.ts +0 -2
  196. package/dist/esm/utils/bundling/vite/StripUCDLifecycleServerPlugin.js +0 -18
  197. package/dist/esm/utils/http/toFormData.d.ts +0 -3
  198. package/dist/esm/utils/http/toFormData.js +0 -4
  199. package/dist/esm/utils/http/toJSON.d.ts +0 -3
  200. package/dist/esm/utils/http/toJSON.js +0 -3
  201. package/dist/esm/utils/http/toQueryParams.d.ts +0 -2
  202. package/dist/esm/utils/http/toQueryParams.js +0 -4
  203. package/dist/esm/utils/ioc/ContainerPrinter.d.ts +0 -15
  204. package/dist/esm/utils/ioc/ContainerPrinter.js +0 -58
  205. package/dist/esm/utils/ioc/bindProvider.d.ts +0 -2
  206. package/dist/esm/utils/ioc/bindProvider.js +0 -9
  207. /package/dist/esm/{products/Helper/cli-node-core/index.d.ts → dt/targets/json-schema.js} +0 -0
  208. /package/dist/esm/{products/Helper/index.d.ts → target/lib/openapi/types.js} +0 -0
@@ -4,8 +4,9 @@ import type { AppManifest } from '../../../app/index.js';
4
4
  import type { UCDef, UCHTTPContract, UCInput, UCManager, UCOPIBase } from '../../../uc/index.js';
5
5
  import type { CustomerFacingErrorBuilder } from '../server/CustomerFacingErrorBuilder.js';
6
6
  import type { ServerRequestHandler, ServerRequestHandlerReq, ServerRequestHandlerRes } from '../server/ServerRequestHandler.js';
7
+ import type { CORSMiddlewareBuilder } from './CORSMiddlewareBuilder.js';
7
8
  export declare function buildHandler<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(appManifest: AppManifest, ucd: UCDef<I, OPI0, OPI1>, contract: UCHTTPContract, serverRequestHandler: ServerRequestHandler, ucManager: UCManager, beforeExec?: (c: Context) => Promise<void>): Handler;
8
- export declare function init<E extends Env = BlankEnv>(customerFacingErrorBuilder: CustomerFacingErrorBuilder): Hono<E>;
9
+ export declare function init<E extends Env = BlankEnv>(corsMB: CORSMiddlewareBuilder, customerFacingErrorBuilder: CustomerFacingErrorBuilder): Hono<E>;
9
10
  export declare function mountHandler(contract: UCHTTPContract, hono: Hono, handler: Handler): void;
10
11
  export declare function toReq(c: Context): ServerRequestHandlerReq;
11
12
  export declare function toRes(c: Context): ServerRequestHandlerRes;
@@ -86,9 +86,10 @@ export function buildHandler(appManifest, ucd, contract, serverRequestHandler, u
86
86
  };
87
87
  return handler;
88
88
  }
89
- export function init(customerFacingErrorBuilder) {
89
+ export function init(corsMB, customerFacingErrorBuilder) {
90
90
  const app = new Hono();
91
91
  app.use(secureHeaders());
92
+ app.use(corsMB.exec({}));
92
93
  app.use(logger());
93
94
  app.notFound((c) => {
94
95
  const error = new NotFoundError();
@@ -1,2 +1,6 @@
1
+ import type { SemVerVersion } from '../../dt/index.js';
2
+ import type { HTTPHeaderName } from '../../utils/index.js';
1
3
  export type AuthCookieName = 'auth';
2
4
  export type PublicApiKeyHeaderName = 'X-API-Key' | (string & {});
5
+ export declare const AUTHORIZATION_HEADER_NAME: HTTPHeaderName;
6
+ export declare const DEFAULT_VERSION: SemVerVersion;
@@ -1 +1,2 @@
1
- export {};
1
+ export const AUTHORIZATION_HEADER_NAME = 'Authorization';
2
+ export const DEFAULT_VERSION = '0.1.0';
@@ -1,6 +1,7 @@
1
1
  import type { AppManifest } from '../../app/index.js';
2
- import type { DirPath } from '../../dt/index.js';
2
+ import type { DirPath, URLPath } from '../../dt/index.js';
3
3
  import type { UCDef, UCHTTPContract, UCInput, UCManager, UCOPIBase } from '../../uc/index.js';
4
+ import type { OpenAPISpec } from '../lib/openapi/types.js';
4
5
  import type { ServerManager } from '../lib/server/ServerManager.js';
5
6
  export declare class NextJSServerManager implements ServerManager {
6
7
  overrideUCManager(_ucManager: UCManager): void;
@@ -8,6 +9,7 @@ export declare class NextJSServerManager implements ServerManager {
8
9
  initSync(): void;
9
10
  mount<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(_appManifest: AppManifest, _ucd: UCDef<I, OPI0, OPI1>, _contract: UCHTTPContract): Promise<void>;
10
11
  mountSync<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(_appManifest: AppManifest, _ucd: UCDef<I, OPI0, OPI1>, _contract: UCHTTPContract): void;
12
+ mountOpenAPISpec(_spec: OpenAPISpec, _at: URLPath): Promise<void>;
11
13
  mountStaticDir(_dirPath: DirPath): Promise<void>;
12
14
  start(): Promise<void>;
13
15
  stop(): Promise<void>;
@@ -21,6 +21,9 @@ let NextJSServerManager = class NextJSServerManager {
21
21
  mountSync(_appManifest, _ucd, _contract) {
22
22
  // Nothing to do
23
23
  }
24
+ async mountOpenAPISpec(_spec, _at) {
25
+ // Nothing to do
26
+ }
24
27
  async mountStaticDir(_dirPath) {
25
28
  // Nothing to do
26
29
  }
@@ -41,7 +41,7 @@ let NodeCoreCLIManager = class NodeCoreCLIManager {
41
41
  uc.def.ext?.cmd?.mountAt ?? ucMountingPoint(uc),
42
42
  uc,
43
43
  ]));
44
- if (!command || !command.trim() || command === '--help') {
44
+ if (!command?.trim() || command === '--help') {
45
45
  showHelp(ucs, this.wordingManager);
46
46
  }
47
47
  else if (command === '--version') {
@@ -1,21 +1,24 @@
1
1
  import { type Express } from 'express';
2
2
  import type { AppManifest } from '../../app/index.js';
3
- import type { DirPath } from '../../dt/index.js';
3
+ import type { DirPath, URLPath } from '../../dt/index.js';
4
4
  import type { Configurable, EnvironmentManager, Logger, LoggerSettings, SettingsManager } from '../../std/index.js';
5
5
  import type { UCDef, UCHTTPContract, UCInput, UCManager, UCOPIBase } from '../../uc/index.js';
6
+ import type { OpenAPISpec } from '../lib/openapi/types.js';
6
7
  import { CustomerFacingErrorBuilder } from '../lib/server/CustomerFacingErrorBuilder.js';
7
8
  import { EntrypointsBuilder } from '../lib/server/EntrypointsBuilder.js';
8
9
  import type { ServerManager, ServerManagerSettings } from '../lib/server/ServerManager.js';
9
10
  import { ServerRequestHandler } from '../lib/server/ServerRequestHandler.js';
10
11
  import { ServerSSLCertLoader } from '../lib/server/ServerSSLCertLoader.js';
12
+ import { CORSMiddlewareBuilder } from '../lib/server-express/CORSMiddlewareBuilder.js';
11
13
  import { HelmetMiddlewareBuilder } from '../lib/server-express/HelmetMiddlewareBuilder.js';
12
14
  import type { ListenSettings, StopSettings } from '../lib/server-node/types.js';
13
15
  type S = ListenSettings & Pick<LoggerSettings, 'logger_level'> & Pick<ServerManagerSettings, 'server_tmp_path'> & StopSettings;
14
16
  export declare class NodeExpressServerManager implements Configurable<S>, ServerManager {
17
+ private corsMiddlewareBuilder;
15
18
  private customerFacingErrorBuilder;
16
19
  private entrypointsBuilder;
17
20
  protected environmentManager: EnvironmentManager;
18
- private helmetMB;
21
+ private helmetMiddlewareBuilder;
19
22
  protected logger: Logger;
20
23
  private serverRequestHandler;
21
24
  private serverSSLCertLoader;
@@ -23,7 +26,7 @@ export declare class NodeExpressServerManager implements Configurable<S>, Server
23
26
  private ucManager;
24
27
  protected runtime: Express;
25
28
  private server;
26
- constructor(customerFacingErrorBuilder: CustomerFacingErrorBuilder, entrypointsBuilder: EntrypointsBuilder, environmentManager: EnvironmentManager, helmetMB: HelmetMiddlewareBuilder, logger: Logger, serverRequestHandler: ServerRequestHandler, serverSSLCertLoader: ServerSSLCertLoader, settingsManager: SettingsManager<S>, ucManager: UCManager);
29
+ constructor(corsMiddlewareBuilder: CORSMiddlewareBuilder, customerFacingErrorBuilder: CustomerFacingErrorBuilder, entrypointsBuilder: EntrypointsBuilder, environmentManager: EnvironmentManager, helmetMiddlewareBuilder: HelmetMiddlewareBuilder, logger: Logger, serverRequestHandler: ServerRequestHandler, serverSSLCertLoader: ServerSSLCertLoader, settingsManager: SettingsManager<S>, ucManager: UCManager);
27
30
  s(): S;
28
31
  getRuntime(): Express;
29
32
  overrideUCManager(ucManager: UCManager): void;
@@ -31,6 +34,7 @@ export declare class NodeExpressServerManager implements Configurable<S>, Server
31
34
  initSync(): void;
32
35
  mount<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(appManifest: AppManifest, ucd: UCDef<I, OPI0, OPI1>, contract: UCHTTPContract): Promise<void>;
33
36
  mountSync<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(appManifest: AppManifest, ucd: UCDef<I, OPI0, OPI1>, contract: UCHTTPContract): void;
37
+ mountOpenAPISpec(spec: OpenAPISpec, at: URLPath): Promise<void>;
34
38
  mountStaticDir(dirPath: DirPath): Promise<void>;
35
39
  start(): Promise<void>;
36
40
  stop(): Promise<void>;
@@ -19,14 +19,16 @@ import { CustomerFacingErrorBuilder } from '../lib/server/CustomerFacingErrorBui
19
19
  import { EntrypointsBuilder } from '../lib/server/EntrypointsBuilder.js';
20
20
  import { ServerRequestHandler } from '../lib/server/ServerRequestHandler.js';
21
21
  import { ServerSSLCertLoader } from '../lib/server/ServerSSLCertLoader.js';
22
+ import { CORSMiddlewareBuilder } from '../lib/server-express/CORSMiddlewareBuilder.js';
22
23
  import { buildHandler, init, mountHandler, postInit, } from '../lib/server-express/funcs.js';
23
24
  import { HelmetMiddlewareBuilder } from '../lib/server-express/HelmetMiddlewareBuilder.js';
24
25
  import { listen, stop } from '../lib/server-node/funcs.js';
25
26
  let NodeExpressServerManager = class NodeExpressServerManager {
27
+ corsMiddlewareBuilder;
26
28
  customerFacingErrorBuilder;
27
29
  entrypointsBuilder;
28
30
  environmentManager;
29
- helmetMB;
31
+ helmetMiddlewareBuilder;
30
32
  logger;
31
33
  serverRequestHandler;
32
34
  serverSSLCertLoader;
@@ -34,11 +36,12 @@ let NodeExpressServerManager = class NodeExpressServerManager {
34
36
  ucManager;
35
37
  runtime;
36
38
  server;
37
- constructor(customerFacingErrorBuilder, entrypointsBuilder, environmentManager, helmetMB, logger, serverRequestHandler, serverSSLCertLoader, settingsManager, ucManager) {
39
+ constructor(corsMiddlewareBuilder, customerFacingErrorBuilder, entrypointsBuilder, environmentManager, helmetMiddlewareBuilder, logger, serverRequestHandler, serverSSLCertLoader, settingsManager, ucManager) {
40
+ this.corsMiddlewareBuilder = corsMiddlewareBuilder;
38
41
  this.customerFacingErrorBuilder = customerFacingErrorBuilder;
39
42
  this.entrypointsBuilder = entrypointsBuilder;
40
43
  this.environmentManager = environmentManager;
41
- this.helmetMB = helmetMB;
44
+ this.helmetMiddlewareBuilder = helmetMiddlewareBuilder;
42
45
  this.logger = logger;
43
46
  this.serverRequestHandler = serverRequestHandler;
44
47
  this.serverSSLCertLoader = serverSSLCertLoader;
@@ -64,7 +67,7 @@ let NodeExpressServerManager = class NodeExpressServerManager {
64
67
  this.ucManager = ucManager;
65
68
  }
66
69
  async init() {
67
- this.runtime = init(this.helmetMB, this.s().logger_level, this.s().server_tmp_path);
70
+ this.runtime = init(this.corsMiddlewareBuilder, this.helmetMiddlewareBuilder, this.s().logger_level, this.s().server_tmp_path);
68
71
  await this.createServer();
69
72
  }
70
73
  initSync() {
@@ -76,6 +79,11 @@ let NodeExpressServerManager = class NodeExpressServerManager {
76
79
  mountSync(appManifest, ucd, contract) {
77
80
  this.mountCommon(appManifest, ucd, contract);
78
81
  }
82
+ async mountOpenAPISpec(spec, at) {
83
+ this.runtime.get(at, (_req, res) => {
84
+ res.send(spec);
85
+ });
86
+ }
79
87
  async mountStaticDir(dirPath) {
80
88
  this.runtime.use(express.static(dirPath));
81
89
  }
@@ -105,16 +113,18 @@ let NodeExpressServerManager = class NodeExpressServerManager {
105
113
  };
106
114
  NodeExpressServerManager = __decorate([
107
115
  injectable(),
108
- __param(0, inject(CustomerFacingErrorBuilder)),
109
- __param(1, inject(EntrypointsBuilder)),
110
- __param(2, inject('EnvironmentManager')),
111
- __param(3, inject(HelmetMiddlewareBuilder)),
112
- __param(4, inject('Logger')),
113
- __param(5, inject(ServerRequestHandler)),
114
- __param(6, inject(ServerSSLCertLoader)),
115
- __param(7, inject('SettingsManager')),
116
- __param(8, inject('UCManager')),
117
- __metadata("design:paramtypes", [CustomerFacingErrorBuilder,
116
+ __param(0, inject(CORSMiddlewareBuilder)),
117
+ __param(1, inject(CustomerFacingErrorBuilder)),
118
+ __param(2, inject(EntrypointsBuilder)),
119
+ __param(3, inject('EnvironmentManager')),
120
+ __param(4, inject(HelmetMiddlewareBuilder)),
121
+ __param(5, inject('Logger')),
122
+ __param(6, inject(ServerRequestHandler)),
123
+ __param(7, inject(ServerSSLCertLoader)),
124
+ __param(8, inject('SettingsManager')),
125
+ __param(9, inject('UCManager')),
126
+ __metadata("design:paramtypes", [CORSMiddlewareBuilder,
127
+ CustomerFacingErrorBuilder,
118
128
  EntrypointsBuilder, Object, HelmetMiddlewareBuilder, Object, ServerRequestHandler,
119
129
  ServerSSLCertLoader, Object, Object])
120
130
  ], NodeExpressServerManager);
@@ -1,16 +1,19 @@
1
1
  import type { Hono } from 'hono';
2
2
  import type { AppManifest } from '../../app/index.js';
3
- import type { DirPath } from '../../dt/index.js';
3
+ import type { DirPath, URLPath } from '../../dt/index.js';
4
4
  import type { Configurable, EnvironmentManager, Logger, SettingsManager } from '../../std/index.js';
5
5
  import type { UCDef, UCHTTPContract, UCInput, UCManager, UCOPIBase } from '../../uc/index.js';
6
+ import type { OpenAPISpec } from '../lib/openapi/types.js';
6
7
  import { CustomerFacingErrorBuilder } from '../lib/server/CustomerFacingErrorBuilder.js';
7
8
  import { EntrypointsBuilder } from '../lib/server/EntrypointsBuilder.js';
8
9
  import type { ServerManager } from '../lib/server/ServerManager.js';
9
10
  import { ServerRequestHandler } from '../lib/server/ServerRequestHandler.js';
10
11
  import { ServerSSLCertLoader } from '../lib/server/ServerSSLCertLoader.js';
12
+ import { CORSMiddlewareBuilder } from '../lib/server-hono/CORSMiddlewareBuilder.js';
11
13
  import type { ListenSettings, StopSettings } from '../lib/server-node/types.js';
12
14
  type S = ListenSettings & StopSettings;
13
15
  export declare class NodeHonoServerManager implements Configurable<S>, ServerManager {
16
+ private corsMiddlewareBuilder;
14
17
  private customerFacingErrorBuilder;
15
18
  private entrypointsBuilder;
16
19
  protected environmentManager: EnvironmentManager;
@@ -21,7 +24,7 @@ export declare class NodeHonoServerManager implements Configurable<S>, ServerMan
21
24
  private ucManager;
22
25
  protected runtime: Hono;
23
26
  private server;
24
- constructor(customerFacingErrorBuilder: CustomerFacingErrorBuilder, entrypointsBuilder: EntrypointsBuilder, environmentManager: EnvironmentManager, logger: Logger, serverRequestHandler: ServerRequestHandler, serverSSLCertLoader: ServerSSLCertLoader, settingsManager: SettingsManager<S>, ucManager: UCManager);
27
+ constructor(corsMiddlewareBuilder: CORSMiddlewareBuilder, customerFacingErrorBuilder: CustomerFacingErrorBuilder, entrypointsBuilder: EntrypointsBuilder, environmentManager: EnvironmentManager, logger: Logger, serverRequestHandler: ServerRequestHandler, serverSSLCertLoader: ServerSSLCertLoader, settingsManager: SettingsManager<S>, ucManager: UCManager);
25
28
  s(): S;
26
29
  getRuntime(): Hono;
27
30
  overrideUCManager(ucManager: UCManager): void;
@@ -29,6 +32,7 @@ export declare class NodeHonoServerManager implements Configurable<S>, ServerMan
29
32
  initSync(): void;
30
33
  mount<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(appManifest: AppManifest, ucd: UCDef<I, OPI0, OPI1>, contract: UCHTTPContract): Promise<void>;
31
34
  mountSync<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(appManifest: AppManifest, ucd: UCDef<I, OPI0, OPI1>, contract: UCHTTPContract): void;
35
+ mountOpenAPISpec(spec: OpenAPISpec, at: URLPath): Promise<void>;
32
36
  mountStaticDir(dirPath: DirPath): Promise<void>;
33
37
  start(): Promise<void>;
34
38
  stop(): Promise<void>;
@@ -20,9 +20,11 @@ import { CustomerFacingErrorBuilder } from '../lib/server/CustomerFacingErrorBui
20
20
  import { EntrypointsBuilder } from '../lib/server/EntrypointsBuilder.js';
21
21
  import { ServerRequestHandler } from '../lib/server/ServerRequestHandler.js';
22
22
  import { ServerSSLCertLoader } from '../lib/server/ServerSSLCertLoader.js';
23
+ import { CORSMiddlewareBuilder } from '../lib/server-hono/CORSMiddlewareBuilder.js';
23
24
  import { buildHandler, init, mountHandler } from '../lib/server-hono/funcs.js';
24
25
  import { listen, stop } from '../lib/server-node/funcs.js';
25
26
  let NodeHonoServerManager = class NodeHonoServerManager {
27
+ corsMiddlewareBuilder;
26
28
  customerFacingErrorBuilder;
27
29
  entrypointsBuilder;
28
30
  environmentManager;
@@ -33,7 +35,8 @@ let NodeHonoServerManager = class NodeHonoServerManager {
33
35
  ucManager;
34
36
  runtime;
35
37
  server;
36
- constructor(customerFacingErrorBuilder, entrypointsBuilder, environmentManager, logger, serverRequestHandler, serverSSLCertLoader, settingsManager, ucManager) {
38
+ constructor(corsMiddlewareBuilder, customerFacingErrorBuilder, entrypointsBuilder, environmentManager, logger, serverRequestHandler, serverSSLCertLoader, settingsManager, ucManager) {
39
+ this.corsMiddlewareBuilder = corsMiddlewareBuilder;
37
40
  this.customerFacingErrorBuilder = customerFacingErrorBuilder;
38
41
  this.entrypointsBuilder = entrypointsBuilder;
39
42
  this.environmentManager = environmentManager;
@@ -60,7 +63,7 @@ let NodeHonoServerManager = class NodeHonoServerManager {
60
63
  this.ucManager = ucManager;
61
64
  }
62
65
  async init() {
63
- this.runtime = init(this.customerFacingErrorBuilder);
66
+ this.runtime = init(this.corsMiddlewareBuilder, this.customerFacingErrorBuilder);
64
67
  await this.createServer();
65
68
  }
66
69
  initSync() {
@@ -72,6 +75,11 @@ let NodeHonoServerManager = class NodeHonoServerManager {
72
75
  mountSync(appManifest, ucd, contract) {
73
76
  this.mountCommon(appManifest, ucd, contract);
74
77
  }
78
+ async mountOpenAPISpec(spec, at) {
79
+ this.runtime.get(at, (c) => {
80
+ return c.json(spec);
81
+ });
82
+ }
75
83
  async mountStaticDir(dirPath) {
76
84
  this.runtime.use(serveStatic({ root: dirPath }));
77
85
  }
@@ -109,15 +117,17 @@ let NodeHonoServerManager = class NodeHonoServerManager {
109
117
  };
110
118
  NodeHonoServerManager = __decorate([
111
119
  injectable(),
112
- __param(0, inject(CustomerFacingErrorBuilder)),
113
- __param(1, inject(EntrypointsBuilder)),
114
- __param(2, inject('EnvironmentManager')),
115
- __param(3, inject('Logger')),
116
- __param(4, inject(ServerRequestHandler)),
117
- __param(5, inject(ServerSSLCertLoader)),
118
- __param(6, inject('SettingsManager')),
119
- __param(7, inject('UCManager')),
120
- __metadata("design:paramtypes", [CustomerFacingErrorBuilder,
120
+ __param(0, inject(CORSMiddlewareBuilder)),
121
+ __param(1, inject(CustomerFacingErrorBuilder)),
122
+ __param(2, inject(EntrypointsBuilder)),
123
+ __param(3, inject('EnvironmentManager')),
124
+ __param(4, inject('Logger')),
125
+ __param(5, inject(ServerRequestHandler)),
126
+ __param(6, inject(ServerSSLCertLoader)),
127
+ __param(7, inject('SettingsManager')),
128
+ __param(8, inject('UCManager')),
129
+ __metadata("design:paramtypes", [CORSMiddlewareBuilder,
130
+ CustomerFacingErrorBuilder,
121
131
  EntrypointsBuilder, Object, Object, ServerRequestHandler,
122
132
  ServerSSLCertLoader, Object, Object])
123
133
  ], NodeHonoServerManager);
@@ -1,10 +1,11 @@
1
1
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
2
  import type { AppManifest } from '../../app/index.js';
3
- import type { DirPath } from '../../dt/index.js';
3
+ import type { DirPath, URLPath } from '../../dt/index.js';
4
4
  import { WordingManager } from '../../i18n/index.js';
5
5
  import type { ProductManifest } from '../../product/index.js';
6
6
  import type { Configurable, LoggerSettings, SettingsManager } from '../../std/index.js';
7
7
  import { UCBuilder, type UCDef, type UCHTTPContract, type UCInput, type UCManager, type UCOPIBase } from '../../uc/index.js';
8
+ import type { OpenAPISpec } from '../lib/openapi/types.js';
8
9
  import type { ServerManager } from '../lib/server/ServerManager.js';
9
10
  type S = Pick<LoggerSettings, 'logger_level'>;
10
11
  /**
@@ -34,6 +35,7 @@ export declare class NodeLocalStdioMCPServerManager implements Configurable<S>,
34
35
  initSync(): void;
35
36
  mount<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(appManifest: AppManifest, ucd: UCDef<I, OPI0, OPI1>, contract: UCHTTPContract): Promise<void>;
36
37
  mountSync<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(appManifest: AppManifest, ucd: UCDef<I, OPI0, OPI1>, contract: UCHTTPContract): void;
38
+ mountOpenAPISpec(_spec: OpenAPISpec, _at: URLPath): Promise<void>;
37
39
  mountStaticDir(_dirPath: DirPath): Promise<void>;
38
40
  start(): Promise<void>;
39
41
  stop(): Promise<void>;
@@ -17,6 +17,7 @@ import { inject, injectable } from 'inversify';
17
17
  import { NotAvailableError } from '../../error/index.js';
18
18
  import { WordingManager } from '../../i18n/index.js';
19
19
  import { UCBuilder, ucifIsMandatory, ucMountingPoint, } from '../../uc/index.js';
20
+ import { DEFAULT_VERSION } from '../lib/shared.js';
20
21
  import { propertyType, resError, resObj } from './funcs.js';
21
22
  /**
22
23
  * A simple MCP Server implementation
@@ -67,6 +68,9 @@ let NodeLocalStdioMCPServerManager = class NodeLocalStdioMCPServerManager {
67
68
  mountSync(appManifest, ucd, contract) {
68
69
  this.mountCommon(appManifest, ucd, contract);
69
70
  }
71
+ async mountOpenAPISpec(_spec, _at) {
72
+ // Nothing to do
73
+ }
70
74
  async mountStaticDir(_dirPath) {
71
75
  throw new NotAvailableError('mountStaticDir');
72
76
  }
@@ -90,18 +94,18 @@ let NodeLocalStdioMCPServerManager = class NodeLocalStdioMCPServerManager {
90
94
  const res = {
91
95
  type: 'object',
92
96
  };
93
- if (uc.inputFields.length > 0) {
94
- const properties = {};
95
- for (const f of uc.inputFields) {
96
- const { def, key } = f;
97
- const { desc } = this.wordingManager.ucif(f);
98
- properties[key] = {
99
- ...propertyType(def),
100
- description: desc,
101
- required: ucifIsMandatory(def),
102
- };
103
- }
104
- res.properties = properties;
97
+ if (!uc.hasInput()) {
98
+ return res;
99
+ }
100
+ res.properties = {};
101
+ for (const f of uc.inputFields) {
102
+ const { def, key } = f;
103
+ const { desc } = this.wordingManager.ucif(f);
104
+ res.properties[key] = {
105
+ ...propertyType(def),
106
+ description: desc,
107
+ required: ucifIsMandatory(def),
108
+ };
105
109
  }
106
110
  return res;
107
111
  }
@@ -140,9 +144,10 @@ let NodeLocalStdioMCPServerManager = class NodeLocalStdioMCPServerManager {
140
144
  }
141
145
  }
142
146
  initCommon() {
147
+ const { name, version } = this.productManifest;
143
148
  this.runtime = new Server({
144
- name: this.productManifest.name,
145
- version: '0.1.0',
149
+ name: name,
150
+ version: version ?? DEFAULT_VERSION,
146
151
  }, {
147
152
  capabilities: {
148
153
  tools: {},
@@ -12,8 +12,4 @@ export type PropertyArrayType<T extends PropertyPrimitiveType> = {
12
12
  export type PropertyType<T extends PropertyPrimitiveType = PropertyPrimitiveType> = {
13
13
  type: T;
14
14
  } | PropertyArrayType<T>;
15
- export type Property<T extends PropertyPrimitiveType = PropertyPrimitiveType> = PropertyType<T> & {
16
- description: string | null;
17
- required: boolean;
18
- };
19
15
  export type Tool = ListToolsResult['tools'][0];
@@ -1,4 +1,4 @@
1
1
  import { type ReactElement } from 'react';
2
- import type { UCInput, UCOPIBase } from '../../uc/index.js';
2
+ import { type UCInput, type UCOPIBase } from '../../uc/index.js';
3
3
  import type { UCFormProps } from '../lib/react/form.js';
4
4
  export declare function UCForm<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>({ clearAfterExec, disabled, execState, onSubmit: onSubmitBase, uc, }: UCFormProps<I, OPI0, OPI1>): ReactElement;
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useRef } from 'react';
3
+ import { UCExecRes } from '../../uc/index.js';
3
4
  import { useStyleContext } from '../lib/react/StyleContextProvider.js';
4
5
  import { UCFormField } from './UCFormField.js';
5
6
  import { UCFormSubmitControl } from './UCFormSubmitControl.js';
@@ -8,8 +9,8 @@ export function UCForm({ clearAfterExec, disabled, execState, onSubmit: onSubmit
8
9
  const formRef = useRef(null);
9
10
  const onSubmit = async (e) => {
10
11
  e.preventDefault();
11
- const succeeded = await onSubmitBase();
12
- if (succeeded && clearAfterExec) {
12
+ const res = await onSubmitBase();
13
+ if (res === UCExecRes.SUCCEEDED && clearAfterExec) {
13
14
  formRef.current?.reset();
14
15
  }
15
16
  };
@@ -16,7 +16,7 @@ const ERR_I18N_LABEL_NO_DOT = (key) => `The i18n key '${key}' is a label, thus i
16
16
  const ERR_I18N_MISSING_TRANS = (key, lang) => `The i18n key '${key}' is missing for lang '${lang}'`;
17
17
  let AppI18nChecker = class AppI18nChecker {
18
18
  static { AppI18nChecker_1 = this; }
19
- static I18N_KEY_PATTERN = /(dt_([A-Z][A-Za-z0-9]+)_([A-Za-z0-9]+)_(desc|label))|(err_([A-Za-z_]+))|(uc_([A-Z][A-Za-z0-9]+)_(client_confirm_(cancel|confirm|message|title)|desc|label|i_submit_(changing|idle|initializing|submitting)|op_(0|1)_(empty|label)))|(ucif_([a-z]([A-Za-z0-9]+)?)_(desc|label))|(ucof_([a-z]([A-Za-z0-9]+)?)_(desc|label))|(validation_([a-z]+)_([A-Z][A-Za-z0-9]+))/;
19
+ static I18N_KEY_PATTERN = /(dt_([A-Z][A-Za-z0-9]+)_constr_format)|(dt_([A-Z][A-Za-z0-9]+)_([A-Za-z0-9]+)_(desc|label))|(err_([A-Za-z_]+))|(uc_([A-Z][A-Za-z0-9]+)_(client_confirm_(cancel|confirm|message|title)|desc|label|i_submit_(changing|idle|initializing|submitting)|op_(0|1)_(empty|label)))|(ucif_([a-z]([A-Za-z0-9]+)?)_(desc|label))|(ucof_([a-z]([A-Za-z0-9]+)?)_(desc|label))|(validation_([a-z]+)_([A-Z][A-Za-z0-9]+))/;
20
20
  output;
21
21
  constructor() {
22
22
  this.output = { errors: [] };
@@ -41,7 +41,9 @@ let AppI18nChecker = class AppI18nChecker {
41
41
  if (!matches) {
42
42
  this.output.errors.push(ERR_I18N_KEY_INVALID(key));
43
43
  }
44
- if (key.endsWith('_label') && translation.endsWith('.')) {
44
+ if (key.endsWith('_label') &&
45
+ translation.endsWith('.') &&
46
+ !translation.endsWith('...')) {
45
47
  this.output.errors.push(ERR_I18N_LABEL_NO_DOT(key));
46
48
  }
47
49
  }
@@ -21,6 +21,7 @@ export declare class UC<I extends UCInput | undefined = undefined, OPI0 extends
21
21
  clear(): void;
22
22
  clearSensitiveInputFields(): void;
23
23
  fill(input: UCInputPartial<I>): this;
24
+ hasInput(): boolean;
24
25
  hasInputField(key: UCFieldKey): boolean;
25
26
  hasMediaInInput(): boolean;
26
27
  hasOutputParts(): boolean;
@@ -29,6 +30,7 @@ export declare class UC<I extends UCInput | undefined = undefined, OPI0 extends
29
30
  inputFieldsOrdered(): UCInputField<any>[];
30
31
  inputFieldsInsensitive(): UCInputField<any>[];
31
32
  inputFieldsSensitive(): UCInputField<any>[];
33
+ inputFieldsRepeatable(): UCInputField<any>[];
32
34
  needsInputFilling(): boolean;
33
35
  needsOutputDisplay(): boolean;
34
36
  operatesOnAggregate(): boolean;
package/dist/esm/uc/UC.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { TFile, Validation } from '../dt/index.js';
2
2
  import { isBlank } from '../utils/index.js';
3
- import { ucifIsMandatory, ucifIsSensitive, ucifMustBeFilledManually, } from './input-field.js';
3
+ import { ucifIsMandatory, ucifIsSensitive, ucifMustBeFilledManually, ucifRepeatability, } from './input-field.js';
4
4
  import { AggregateInputDef } from './io/input/AggregateInput.js';
5
5
  import { ListInputDef } from './io/input/ListInput.js';
6
6
  import { UCInputField } from './UCInputField.js';
@@ -44,6 +44,9 @@ export class UC {
44
44
  }
45
45
  return this;
46
46
  }
47
+ hasInput() {
48
+ return this.inputFields.length > 0;
49
+ }
47
50
  hasInputField(key) {
48
51
  return this.inputFields.find((f) => f.key === key) !== undefined;
49
52
  }
@@ -104,6 +107,18 @@ export class UC {
104
107
  inputFieldsSensitive() {
105
108
  return this.inputFields.filter((f) => ucifIsSensitive(f.def));
106
109
  }
110
+ // biome-ignore lint/suspicious/noExplicitAny: can be anything
111
+ inputFieldsRepeatable() {
112
+ const res = [];
113
+ for (const f of this.inputFields) {
114
+ const [isRepeatable] = ucifRepeatability(f.def);
115
+ if (!isRepeatable) {
116
+ continue;
117
+ }
118
+ res.push(f);
119
+ }
120
+ return res;
121
+ }
107
122
  needsInputFilling() {
108
123
  const fields = this.inputFields;
109
124
  if (fields.length === 0) {
@@ -1,11 +1,18 @@
1
1
  import type { AppName } from '../app/index.js';
2
2
  import type { UIntQuantity, UUID } from '../dt/index.js';
3
- import type { Clearable, Initializable, StringKeys } from '../utils/index.js';
3
+ import type { Clearable, EnumOf, Initializable, StringKeys } from '../utils/index.js';
4
4
  import type { UCData } from './data.js';
5
5
  import type { UCExecMode } from './exec.js';
6
6
  import type { UCInput } from './input.js';
7
7
  import type { UCName } from './metadata.js';
8
8
  export type UCDataStoreDatasetName = string;
9
+ export declare const UCDataStoreMode: {
10
+ readonly NONE: "NONE";
11
+ readonly READ: "READ";
12
+ readonly READ_WRITE: "READ_WRITE";
13
+ readonly WRITE: "WRITE";
14
+ };
15
+ export type UCDataStoreMode = EnumOf<typeof UCDataStoreMode>;
9
16
  interface UCDataStoreQueryOpts {
10
17
  }
11
18
  export type UCDataStoreReadFilter<T> = T | T[];
@@ -67,4 +74,5 @@ export interface UCDataStore extends Clearable, Initializable {
67
74
  writeBulk<I extends UCInput | undefined = undefined, D extends UCData | null = null>(records: UCDataStoreRecord<I, D>[], opts?: UCDataStoreWriteOpts): Promise<void>;
68
75
  writeProjection<T extends object>(name: string, data: T, opts?: UCDataStoreWriteProjectionOpts): Promise<void>;
69
76
  }
77
+ export declare function assertCan(op: 'read' | 'write', mode: UCDataStoreMode): void;
70
78
  export {};
@@ -1 +1,33 @@
1
- export {};
1
+ import { UnavailableError } from '../error/index.js';
2
+ export const UCDataStoreMode = {
3
+ NONE: 'NONE',
4
+ READ: 'READ',
5
+ READ_WRITE: 'READ_WRITE',
6
+ WRITE: 'WRITE',
7
+ };
8
+ export function assertCan(op, mode) {
9
+ switch (mode) {
10
+ case 'NONE':
11
+ if (op === 'read') {
12
+ throw new UnavailableError('err_uc_data_store_not_readable');
13
+ }
14
+ if (op === 'write') {
15
+ throw new UnavailableError('err_uc_data_store_not_writable');
16
+ }
17
+ break;
18
+ case 'READ':
19
+ if (op === 'write') {
20
+ throw new UnavailableError('err_uc_data_store_not_writable');
21
+ }
22
+ break;
23
+ case 'READ_WRITE':
24
+ break;
25
+ case 'WRITE':
26
+ if (op === 'read') {
27
+ throw new UnavailableError('err_uc_data_store_not_readable');
28
+ }
29
+ break;
30
+ default:
31
+ mode;
32
+ }
33
+ }
@@ -1,10 +1,10 @@
1
1
  import type { D1Database } from '@cloudflare/workers-types';
2
2
  import type { Configurable, SettingsManager } from '../../std/index.js';
3
3
  import type { UCData } from '../data.js';
4
- import type { UCDataStore, UCDataStoreReadOpts, UCDataStoreReadProjectionOpts, UCDataStoreReadResponse, UCDataStoreRecord, UCDataStoreTx, UCDataStoreWriteOpts, UCDataStoreWriteProjectionOpts, UCDataStoreWriteProjectionSpecificBinding } from '../data-store.js';
4
+ import { type UCDataStore, type UCDataStoreReadOpts, type UCDataStoreReadProjectionOpts, type UCDataStoreReadResponse, type UCDataStoreRecord, type UCDataStoreTx, type UCDataStoreWriteOpts, type UCDataStoreWriteProjectionOpts, type UCDataStoreWriteProjectionSpecificBinding } from '../data-store.js';
5
5
  import type { UCInput } from '../input.js';
6
6
  import type { UCSettings } from '../settings.js';
7
- type S = Pick<UCSettings, 'uc_data_store_ucs_dataset_name'>;
7
+ type S = Pick<UCSettings, 'uc_data_store_mode' | 'uc_data_store_ucs_dataset_name'>;
8
8
  export declare const ROW_COLS: (keyof UCDataStoreRecord)[];
9
9
  /**
10
10
  * @alpha This implementation is still a WIP and needs improvement
@@ -12,6 +12,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  };
13
13
  import { inject, injectable } from 'inversify';
14
14
  import { NotAvailableError, NotImplementedError } from '../../error/index.js';
15
+ import { assertCan, } from '../data-store.js';
15
16
  export const ROW_COLS = [
16
17
  'aggregateId',
17
18
  'appName',
@@ -38,6 +39,7 @@ let CloudflareD1UCDataStore = class CloudflareD1UCDataStore {
38
39
  }
39
40
  s() {
40
41
  return {
42
+ uc_data_store_mode: this.settingsManager.get()('uc_data_store_mode'),
41
43
  uc_data_store_ucs_dataset_name: this.settingsManager.get()('uc_data_store_ucs_dataset_name'),
42
44
  };
43
45
  }
@@ -92,6 +94,7 @@ CREATE INDEX IF NOT EXISTS uc_executions_user_id_index ON uc_executions (userId)
92
94
  }
93
95
  async read(opts) {
94
96
  this.assertClient();
97
+ assertCan('read', this.s().uc_data_store_mode);
95
98
  // TODO : Consider using a query builder (or Google's pipe operator ?) when it gets too complicated or dangerous
96
99
  const query = [
97
100
  `select * from ${this.s().uc_data_store_ucs_dataset_name}`,
@@ -131,6 +134,7 @@ CREATE INDEX IF NOT EXISTS uc_executions_user_id_index ON uc_executions (userId)
131
134
  };
132
135
  }
133
136
  async readProjection(_name, _opts) {
137
+ assertCan('read', this.s().uc_data_store_mode);
134
138
  throw new NotImplementedError('readProjection');
135
139
  }
136
140
  async startTx() {
@@ -144,6 +148,7 @@ CREATE INDEX IF NOT EXISTS uc_executions_user_id_index ON uc_executions (userId)
144
148
  }
145
149
  async write(record, _opts) {
146
150
  this.assertClient();
151
+ assertCan('write', this.s().uc_data_store_mode);
147
152
  const cols = ROW_COLS.join(', ');
148
153
  const placeholders = ROW_COLS.map(() => '?').join(', ');
149
154
  // Use variables only for variables declared here => never for data coming from outside this method !
@@ -166,9 +171,11 @@ CREATE INDEX IF NOT EXISTS uc_executions_user_id_index ON uc_executions (userId)
166
171
  .run();
167
172
  }
168
173
  async writeBulk(_records, _opts) {
174
+ assertCan('write', this.s().uc_data_store_mode);
169
175
  throw new NotImplementedError('writeBulk');
170
176
  }
171
177
  async writeProjection(_name, _data, _opts) {
178
+ assertCan('write', this.s().uc_data_store_mode);
172
179
  throw new NotImplementedError('writeProjection');
173
180
  }
174
181
  setClient(client) {