libmodulor 0.28.0 → 0.30.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 (189) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/README.md +3 -3
  3. package/dist/esm/apps/Helper/src/lib/layers/product.js +1 -1
  4. package/dist/esm/apps/Helper/src/lib/layers/project.js +7 -7
  5. package/dist/esm/apps/Helper/src/lib/layers/target.js +27 -11
  6. package/dist/esm/convention.d.ts +2 -0
  7. package/dist/esm/convention.js +1 -0
  8. package/dist/esm/dt/base/TBase.d.ts +2 -0
  9. package/dist/esm/dt/base/TBase.js +5 -0
  10. package/dist/esm/dt/base/TBoolean.d.ts +2 -0
  11. package/dist/esm/dt/base/TBoolean.js +3 -0
  12. package/dist/esm/dt/base/TInt.d.ts +2 -0
  13. package/dist/esm/dt/base/TInt.js +3 -0
  14. package/dist/esm/dt/base/TNumber.d.ts +2 -0
  15. package/dist/esm/dt/base/TNumber.js +3 -0
  16. package/dist/esm/dt/base/TObject.d.ts +2 -0
  17. package/dist/esm/dt/base/TObject.js +37 -0
  18. package/dist/esm/dt/final/TApiKey.d.ts +2 -0
  19. package/dist/esm/dt/final/TApiKey.js +3 -0
  20. package/dist/esm/dt/final/TDateISO8601.d.ts +2 -0
  21. package/dist/esm/dt/final/TDateISO8601.js +3 -0
  22. package/dist/esm/dt/final/TDomainName.d.ts +2 -0
  23. package/dist/esm/dt/final/TDomainName.js +3 -0
  24. package/dist/esm/dt/final/TEmail.d.ts +2 -0
  25. package/dist/esm/dt/final/TEmail.js +3 -0
  26. package/dist/esm/dt/final/TEncryptionKey.d.ts +2 -0
  27. package/dist/esm/dt/final/TEncryptionKey.js +3 -0
  28. package/dist/esm/dt/final/TFile.d.ts +2 -0
  29. package/dist/esm/dt/final/TFile.js +3 -0
  30. package/dist/esm/dt/final/TIPv4.d.ts +2 -0
  31. package/dist/esm/dt/final/TIPv4.js +3 -0
  32. package/dist/esm/dt/final/TIPv6.d.ts +2 -0
  33. package/dist/esm/dt/final/TIPv6.js +3 -0
  34. package/dist/esm/dt/final/TJWT.d.ts +2 -0
  35. package/dist/esm/dt/final/TJWT.js +3 -0
  36. package/dist/esm/dt/final/TPassword.d.ts +2 -0
  37. package/dist/esm/dt/final/TPassword.js +3 -0
  38. package/dist/esm/dt/final/TSSHPrivateKey.d.ts +2 -0
  39. package/dist/esm/dt/final/TSSHPrivateKey.js +3 -0
  40. package/dist/esm/dt/final/TTime.d.ts +2 -0
  41. package/dist/esm/dt/final/TTime.js +3 -0
  42. package/dist/esm/dt/final/TURL.d.ts +2 -0
  43. package/dist/esm/dt/final/TURL.js +3 -0
  44. package/dist/esm/dt/index.d.ts +1 -0
  45. package/dist/esm/dt/targets/json-schema.d.ts +36 -0
  46. package/dist/esm/error/funcs.d.ts +4 -0
  47. package/dist/esm/error/funcs.js +5 -1
  48. package/dist/esm/error/index.d.ts +1 -1
  49. package/dist/esm/error/index.js +1 -1
  50. package/dist/esm/i18n/locales/de.js +2 -0
  51. package/dist/esm/i18n/locales/en.js +2 -0
  52. package/dist/esm/i18n/locales/es.js +2 -0
  53. package/dist/esm/i18n/locales/fr.js +2 -0
  54. package/dist/esm/i18n/types.d.ts +1 -1
  55. package/dist/esm/index.d.ts +3 -0
  56. package/dist/esm/index.js +3 -0
  57. package/dist/esm/index.node-express.d.ts +2 -0
  58. package/dist/esm/index.node-express.js +1 -0
  59. package/dist/esm/index.node-hono.d.ts +2 -0
  60. package/dist/esm/index.node-hono.js +1 -0
  61. package/dist/esm/index.node-mcp-express.d.ts +3 -0
  62. package/dist/esm/index.node-mcp-express.js +2 -0
  63. package/dist/esm/index.node-mcp-hono.d.ts +3 -0
  64. package/dist/esm/index.node-mcp-hono.js +2 -0
  65. package/dist/esm/index.node-mcp.d.ts +3 -1
  66. package/dist/esm/index.node-mcp.js +3 -1
  67. package/dist/esm/product/manifest.d.ts +2 -0
  68. package/dist/esm/products/Helper/i18n.d.ts +2 -0
  69. package/dist/esm/std/impl/SimpleMapI18nManager.d.ts +1 -1
  70. package/dist/esm/std/impl/SimpleMapI18nManager.js +4 -2
  71. package/dist/esm/std/lib/settings.js +4 -5
  72. package/dist/esm/target/edge-worker-hono-server/SyncEdgeWorkerHonoServerManager.d.ts +8 -2
  73. package/dist/esm/target/edge-worker-hono-server/SyncEdgeWorkerHonoServerManager.js +20 -9
  74. package/dist/esm/target/index.d.ts +2 -1
  75. package/dist/esm/target/index.js +1 -1
  76. package/dist/esm/target/lib/client/AuthDataStore.d.ts +5 -0
  77. package/dist/esm/target/lib/client/AuthDataStore.js +1 -0
  78. package/dist/esm/target/lib/client/impl/InMemoryAuthDataStore.d.ts +7 -0
  79. package/dist/esm/target/lib/client/impl/InMemoryAuthDataStore.js +20 -0
  80. package/dist/esm/target/lib/client/impl/MixedServerClientManager.d.ts +15 -0
  81. package/dist/esm/target/lib/client/impl/MixedServerClientManager.js +44 -0
  82. package/dist/esm/target/lib/json-schema/error.d.ts +3 -0
  83. package/dist/esm/target/lib/json-schema/error.js +14 -0
  84. package/dist/esm/target/lib/json-schema/input.d.ts +16 -0
  85. package/dist/esm/target/lib/json-schema/input.js +67 -0
  86. package/dist/esm/target/lib/json-schema/output.d.ts +19 -0
  87. package/dist/esm/target/lib/json-schema/output.js +128 -0
  88. package/dist/esm/target/lib/manifest.d.ts +32 -1
  89. package/dist/esm/target/lib/manifest.js +22 -1
  90. package/dist/esm/target/lib/mcp-server/MCPServerRequestHandler.d.ts +16 -0
  91. package/dist/esm/target/lib/mcp-server/MCPServerRequestHandler.js +54 -0
  92. package/dist/esm/target/lib/mcp-server/consts.d.ts +1 -0
  93. package/dist/esm/target/lib/mcp-server/consts.js +1 -0
  94. package/dist/esm/target/lib/mcp-server/funcs.d.ts +13 -0
  95. package/dist/esm/target/lib/mcp-server/funcs.js +84 -0
  96. package/dist/esm/target/lib/mcp-server/http/MCPHTTPRequestHandlerBuilder.d.ts +14 -0
  97. package/dist/esm/target/lib/mcp-server/http/MCPHTTPRequestHandlerBuilder.js +1 -0
  98. package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressFakeRequestHandlerBuilder.d.ts +5 -0
  99. package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressFakeRequestHandlerBuilder.js +18 -0
  100. package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressProtocolRequestHandlerBuilder.d.ts +15 -0
  101. package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressProtocolRequestHandlerBuilder.js +88 -0
  102. package/dist/esm/target/lib/mcp-server/http/express/types.d.ts +3 -0
  103. package/dist/esm/target/lib/mcp-server/http/express/types.js +1 -0
  104. package/dist/esm/target/lib/mcp-server/http/funcs.d.ts +6 -0
  105. package/dist/esm/target/lib/mcp-server/http/funcs.js +50 -0
  106. package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoFakeRequestHandlerBuilder.d.ts +5 -0
  107. package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoFakeRequestHandlerBuilder.js +18 -0
  108. package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoProtocolRequestHandlerBuilder.d.ts +15 -0
  109. package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoProtocolRequestHandlerBuilder.js +88 -0
  110. package/dist/esm/target/lib/mcp-server/http/hono/types.d.ts +3 -0
  111. package/dist/esm/target/lib/mcp-server/http/hono/types.js +1 -0
  112. package/dist/esm/target/lib/mcp-server/stdio/MCPStdioRequestHandler.d.ts +31 -0
  113. package/dist/esm/target/lib/mcp-server/stdio/MCPStdioRequestHandler.js +108 -0
  114. package/dist/esm/target/lib/mcp-server/stdio/MCPStdioUCClientConfirmManager.d.ts +7 -0
  115. package/dist/esm/target/lib/mcp-server/stdio/MCPStdioUCClientConfirmManager.js +36 -0
  116. package/dist/esm/target/lib/mcp-server/stdio/consts.d.ts +2 -0
  117. package/dist/esm/target/lib/mcp-server/stdio/consts.js +3 -0
  118. package/dist/esm/target/lib/mcp-server/stdio/funcs.d.ts +2 -0
  119. package/dist/esm/target/lib/mcp-server/stdio/funcs.js +10 -0
  120. package/dist/esm/target/lib/mcp-server/stdio/input.d.ts +10 -0
  121. package/dist/esm/target/lib/mcp-server/stdio/input.js +15 -0
  122. package/dist/esm/target/lib/mcp-server/types.d.ts +2 -0
  123. package/dist/esm/target/lib/mcp-server/types.js +1 -0
  124. package/dist/esm/target/lib/openapi/OpenAPISpecBuilder.d.ts +25 -0
  125. package/dist/esm/target/lib/openapi/OpenAPISpecBuilder.js +135 -0
  126. package/dist/esm/target/lib/openapi/funcs.d.ts +11 -0
  127. package/dist/esm/target/lib/openapi/funcs.js +148 -0
  128. package/dist/esm/target/lib/openapi/types.d.ts +98 -0
  129. package/dist/esm/target/lib/openapi/types.js +1 -0
  130. package/dist/esm/target/lib/rn/input.d.ts +3 -0
  131. package/dist/esm/target/lib/server/AuthCookieCreator.d.ts +2 -1
  132. package/dist/esm/target/lib/server/ServerBooter.d.ts +4 -2
  133. package/dist/esm/target/lib/server/ServerBooter.js +44 -11
  134. package/dist/esm/target/lib/server/ServerManager.d.ts +29 -9
  135. package/dist/esm/target/lib/server/ServerRequestHandler.d.ts +10 -6
  136. package/dist/esm/target/lib/server/ServerRequestHandler.js +35 -25
  137. package/dist/esm/target/lib/server/consts.d.ts +4 -0
  138. package/dist/esm/target/lib/server/consts.js +26 -0
  139. package/dist/esm/target/lib/server-express/CORSMiddlewareBuilder.d.ts +15 -0
  140. package/dist/esm/target/lib/server-express/CORSMiddlewareBuilder.js +55 -0
  141. package/dist/esm/target/lib/server-express/funcs.d.ts +2 -1
  142. package/dist/esm/target/lib/server-express/funcs.js +6 -5
  143. package/dist/esm/target/lib/server-hono/CORSMiddlewareBuilder.d.ts +14 -0
  144. package/dist/esm/target/lib/server-hono/CORSMiddlewareBuilder.js +46 -0
  145. package/dist/esm/target/lib/server-hono/funcs.d.ts +2 -1
  146. package/dist/esm/target/lib/server-hono/funcs.js +6 -3
  147. package/dist/esm/target/lib/shared.d.ts +5 -0
  148. package/dist/esm/target/lib/shared.js +3 -1
  149. package/dist/esm/target/nextjs-server/NextJSServerManager.d.ts +5 -1
  150. package/dist/esm/target/nextjs-server/NextJSServerManager.js +6 -0
  151. package/dist/esm/target/node-express-server/NodeExpressServerManager.d.ts +12 -4
  152. package/dist/esm/target/node-express-server/NodeExpressServerManager.js +34 -15
  153. package/dist/esm/target/node-hono-server/NodeHonoServerManager.d.ts +11 -3
  154. package/dist/esm/target/node-hono-server/NodeHonoServerManager.js +31 -12
  155. package/dist/esm/target/{node-mcp-server/NodeLocalStdioMCPServerManager.d.ts → node-mcp-server-stdio/NodeMCPStdioServerManager.d.ts} +12 -21
  156. package/dist/esm/target/node-mcp-server-stdio/NodeMCPStdioServerManager.js +108 -0
  157. package/dist/esm/testing/impl/newNodeAppTester.js +5 -0
  158. package/dist/esm/uc/UC.d.ts +2 -0
  159. package/dist/esm/uc/UC.js +16 -1
  160. package/dist/esm/uc/cardinality.d.ts +7 -0
  161. package/dist/esm/uc/cardinality.js +14 -0
  162. package/dist/esm/uc/examples.d.ts +2 -0
  163. package/dist/esm/uc/examples.js +12 -0
  164. package/dist/esm/uc/helpers/UCOutputReader.d.ts +2 -2
  165. package/dist/esm/uc/helpers/UCOutputReader.js +2 -2
  166. package/dist/esm/uc/index.d.ts +2 -0
  167. package/dist/esm/uc/index.js +2 -0
  168. package/dist/esm/uc/input-field.d.ts +3 -6
  169. package/dist/esm/uc/input-field.js +5 -21
  170. package/dist/esm/uc/metadata.d.ts +7 -0
  171. package/dist/esm/uc/metadata.js +10 -0
  172. package/dist/esm/uc/opi.d.ts +3 -1
  173. package/dist/esm/uc/opi.js +4 -1
  174. package/dist/esm/uc/output-field.d.ts +14 -1
  175. package/dist/esm/uc/output-field.js +11 -1
  176. package/dist/esm/uc/utils/ucHTTPContract.js +1 -1
  177. package/dist/esm/utils/bundling/funcs.js +1 -1
  178. package/dist/esm/utils/bundling/vite/plugin.d.ts +1 -1
  179. package/dist/esm/utils/http/types.d.ts +5 -0
  180. package/dist/esm/utils/index.d.ts +2 -1
  181. package/dist/esm/utils/index.js +1 -0
  182. package/dist/esm/utils/streams/funcs.d.ts +2 -0
  183. package/dist/esm/utils/streams/funcs.js +10 -0
  184. package/package.json +25 -14
  185. package/dist/esm/target/node-mcp-server/NodeLocalStdioMCPServerManager.js +0 -183
  186. package/dist/esm/target/node-mcp-server/funcs.d.ts +0 -7
  187. package/dist/esm/target/node-mcp-server/funcs.js +0 -45
  188. package/dist/esm/target/node-mcp-server/types.d.ts +0 -19
  189. /package/dist/esm/{target/node-mcp-server/types.js → dt/targets/json-schema.js} +0 -0
@@ -19,27 +19,32 @@ 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;
33
+ mcpHTTPRequestHandlerBuilder;
31
34
  serverRequestHandler;
32
35
  serverSSLCertLoader;
33
36
  settingsManager;
34
37
  ucManager;
35
38
  runtime;
36
39
  server;
37
- constructor(customerFacingErrorBuilder, entrypointsBuilder, environmentManager, helmetMB, logger, serverRequestHandler, serverSSLCertLoader, settingsManager, ucManager) {
40
+ constructor(corsMiddlewareBuilder, customerFacingErrorBuilder, entrypointsBuilder, environmentManager, helmetMiddlewareBuilder, logger, mcpHTTPRequestHandlerBuilder, serverRequestHandler, serverSSLCertLoader, settingsManager, ucManager) {
41
+ this.corsMiddlewareBuilder = corsMiddlewareBuilder;
38
42
  this.customerFacingErrorBuilder = customerFacingErrorBuilder;
39
43
  this.entrypointsBuilder = entrypointsBuilder;
40
44
  this.environmentManager = environmentManager;
41
- this.helmetMB = helmetMB;
45
+ this.helmetMiddlewareBuilder = helmetMiddlewareBuilder;
42
46
  this.logger = logger;
47
+ this.mcpHTTPRequestHandlerBuilder = mcpHTTPRequestHandlerBuilder;
43
48
  this.serverRequestHandler = serverRequestHandler;
44
49
  this.serverSSLCertLoader = serverSSLCertLoader;
45
50
  this.settingsManager = settingsManager;
@@ -64,7 +69,7 @@ let NodeExpressServerManager = class NodeExpressServerManager {
64
69
  this.ucManager = ucManager;
65
70
  }
66
71
  async init() {
67
- this.runtime = init(this.helmetMB, this.s().logger_level, this.s().server_tmp_path);
72
+ this.runtime = init(this.corsMiddlewareBuilder, this.helmetMiddlewareBuilder, this.s().logger_level, this.s().server_tmp_path);
68
73
  await this.createServer();
69
74
  }
70
75
  initSync() {
@@ -76,6 +81,17 @@ let NodeExpressServerManager = class NodeExpressServerManager {
76
81
  mountSync(appManifest, ucd, contract) {
77
82
  this.mountCommon(appManifest, ucd, contract);
78
83
  }
84
+ async mountMCP(ucs, at) {
85
+ this.runtime.post(at, this.mcpHTTPRequestHandlerBuilder.exec({
86
+ ucManager: this.ucManager,
87
+ ucs,
88
+ }));
89
+ }
90
+ async mountOpenAPISpec(spec, at) {
91
+ this.runtime.get(at, (_req, res) => {
92
+ res.send(spec);
93
+ });
94
+ }
79
95
  async mountStaticDir(dirPath) {
80
96
  this.runtime.use(express.static(dirPath));
81
97
  }
@@ -105,17 +121,20 @@ let NodeExpressServerManager = class NodeExpressServerManager {
105
121
  };
106
122
  NodeExpressServerManager = __decorate([
107
123
  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,
118
- EntrypointsBuilder, Object, HelmetMiddlewareBuilder, Object, ServerRequestHandler,
124
+ __param(0, inject(CORSMiddlewareBuilder)),
125
+ __param(1, inject(CustomerFacingErrorBuilder)),
126
+ __param(2, inject(EntrypointsBuilder)),
127
+ __param(3, inject('EnvironmentManager')),
128
+ __param(4, inject(HelmetMiddlewareBuilder)),
129
+ __param(5, inject('Logger')),
130
+ __param(6, inject('MCPHTTPRequestHandlerBuilder')),
131
+ __param(7, inject(ServerRequestHandler)),
132
+ __param(8, inject(ServerSSLCertLoader)),
133
+ __param(9, inject('SettingsManager')),
134
+ __param(10, inject('UCManager')),
135
+ __metadata("design:paramtypes", [CORSMiddlewareBuilder,
136
+ CustomerFacingErrorBuilder,
137
+ EntrypointsBuilder, Object, HelmetMiddlewareBuilder, Object, Object, ServerRequestHandler,
119
138
  ServerSSLCertLoader, Object, Object])
120
139
  ], NodeExpressServerManager);
121
140
  export { NodeExpressServerManager };
@@ -1,27 +1,33 @@
1
- import type { Hono } from 'hono';
1
+ import type { Hono, MiddlewareHandler } 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
+ import type { ProductUCsLoaderOutput } from '../../product/index.js';
4
5
  import type { Configurable, EnvironmentManager, Logger, SettingsManager } from '../../std/index.js';
5
6
  import type { UCDef, UCHTTPContract, UCInput, UCManager, UCOPIBase } from '../../uc/index.js';
7
+ import type { MCPHTTPRequestHandlerBuilder } from '../lib/mcp-server/http/MCPHTTPRequestHandlerBuilder.js';
8
+ import type { OpenAPISpec } from '../lib/openapi/types.js';
6
9
  import { CustomerFacingErrorBuilder } from '../lib/server/CustomerFacingErrorBuilder.js';
7
10
  import { EntrypointsBuilder } from '../lib/server/EntrypointsBuilder.js';
8
11
  import type { ServerManager } from '../lib/server/ServerManager.js';
9
12
  import { ServerRequestHandler } from '../lib/server/ServerRequestHandler.js';
10
13
  import { ServerSSLCertLoader } from '../lib/server/ServerSSLCertLoader.js';
14
+ import { CORSMiddlewareBuilder } from '../lib/server-hono/CORSMiddlewareBuilder.js';
11
15
  import type { ListenSettings, StopSettings } from '../lib/server-node/types.js';
12
16
  type S = ListenSettings & StopSettings;
13
17
  export declare class NodeHonoServerManager implements Configurable<S>, ServerManager {
18
+ private corsMiddlewareBuilder;
14
19
  private customerFacingErrorBuilder;
15
20
  private entrypointsBuilder;
16
21
  protected environmentManager: EnvironmentManager;
17
22
  private logger;
23
+ private mcpHTTPRequestHandlerBuilder;
18
24
  private serverRequestHandler;
19
25
  private serverSSLCertLoader;
20
26
  private settingsManager;
21
27
  private ucManager;
22
28
  protected runtime: Hono;
23
29
  private server;
24
- constructor(customerFacingErrorBuilder: CustomerFacingErrorBuilder, entrypointsBuilder: EntrypointsBuilder, environmentManager: EnvironmentManager, logger: Logger, serverRequestHandler: ServerRequestHandler, serverSSLCertLoader: ServerSSLCertLoader, settingsManager: SettingsManager<S>, ucManager: UCManager);
30
+ constructor(corsMiddlewareBuilder: CORSMiddlewareBuilder, customerFacingErrorBuilder: CustomerFacingErrorBuilder, entrypointsBuilder: EntrypointsBuilder, environmentManager: EnvironmentManager, logger: Logger, mcpHTTPRequestHandlerBuilder: MCPHTTPRequestHandlerBuilder<MiddlewareHandler>, serverRequestHandler: ServerRequestHandler, serverSSLCertLoader: ServerSSLCertLoader, settingsManager: SettingsManager<S>, ucManager: UCManager);
25
31
  s(): S;
26
32
  getRuntime(): Hono;
27
33
  overrideUCManager(ucManager: UCManager): void;
@@ -29,6 +35,8 @@ export declare class NodeHonoServerManager implements Configurable<S>, ServerMan
29
35
  initSync(): void;
30
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>;
31
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
+ mountMCP(ucs: ProductUCsLoaderOutput, at: URLPath): Promise<void>;
39
+ mountOpenAPISpec(spec: OpenAPISpec, at: URLPath): Promise<void>;
32
40
  mountStaticDir(dirPath: DirPath): Promise<void>;
33
41
  start(): Promise<void>;
34
42
  stop(): Promise<void>;
@@ -20,24 +20,29 @@ 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;
29
31
  logger;
32
+ mcpHTTPRequestHandlerBuilder;
30
33
  serverRequestHandler;
31
34
  serverSSLCertLoader;
32
35
  settingsManager;
33
36
  ucManager;
34
37
  runtime;
35
38
  server;
36
- constructor(customerFacingErrorBuilder, entrypointsBuilder, environmentManager, logger, serverRequestHandler, serverSSLCertLoader, settingsManager, ucManager) {
39
+ constructor(corsMiddlewareBuilder, customerFacingErrorBuilder, entrypointsBuilder, environmentManager, logger, mcpHTTPRequestHandlerBuilder, serverRequestHandler, serverSSLCertLoader, settingsManager, ucManager) {
40
+ this.corsMiddlewareBuilder = corsMiddlewareBuilder;
37
41
  this.customerFacingErrorBuilder = customerFacingErrorBuilder;
38
42
  this.entrypointsBuilder = entrypointsBuilder;
39
43
  this.environmentManager = environmentManager;
40
44
  this.logger = logger;
45
+ this.mcpHTTPRequestHandlerBuilder = mcpHTTPRequestHandlerBuilder;
41
46
  this.serverRequestHandler = serverRequestHandler;
42
47
  this.serverSSLCertLoader = serverSSLCertLoader;
43
48
  this.settingsManager = settingsManager;
@@ -60,7 +65,7 @@ let NodeHonoServerManager = class NodeHonoServerManager {
60
65
  this.ucManager = ucManager;
61
66
  }
62
67
  async init() {
63
- this.runtime = init(this.customerFacingErrorBuilder);
68
+ this.runtime = init(this.corsMiddlewareBuilder, this.customerFacingErrorBuilder);
64
69
  await this.createServer();
65
70
  }
66
71
  initSync() {
@@ -72,6 +77,17 @@ let NodeHonoServerManager = class NodeHonoServerManager {
72
77
  mountSync(appManifest, ucd, contract) {
73
78
  this.mountCommon(appManifest, ucd, contract);
74
79
  }
80
+ async mountMCP(ucs, at) {
81
+ this.runtime.post(at, this.mcpHTTPRequestHandlerBuilder.exec({
82
+ ucManager: this.ucManager,
83
+ ucs,
84
+ }));
85
+ }
86
+ async mountOpenAPISpec(spec, at) {
87
+ this.runtime.get(at, (c) => {
88
+ return c.json(spec);
89
+ });
90
+ }
75
91
  async mountStaticDir(dirPath) {
76
92
  this.runtime.use(serveStatic({ root: dirPath }));
77
93
  }
@@ -109,16 +125,19 @@ let NodeHonoServerManager = class NodeHonoServerManager {
109
125
  };
110
126
  NodeHonoServerManager = __decorate([
111
127
  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,
121
- EntrypointsBuilder, Object, Object, ServerRequestHandler,
128
+ __param(0, inject(CORSMiddlewareBuilder)),
129
+ __param(1, inject(CustomerFacingErrorBuilder)),
130
+ __param(2, inject(EntrypointsBuilder)),
131
+ __param(3, inject('EnvironmentManager')),
132
+ __param(4, inject('Logger')),
133
+ __param(5, inject('MCPHTTPRequestHandlerBuilder')),
134
+ __param(6, inject(ServerRequestHandler)),
135
+ __param(7, inject(ServerSSLCertLoader)),
136
+ __param(8, inject('SettingsManager')),
137
+ __param(9, inject('UCManager')),
138
+ __metadata("design:paramtypes", [CORSMiddlewareBuilder,
139
+ CustomerFacingErrorBuilder,
140
+ EntrypointsBuilder, Object, Object, Object, ServerRequestHandler,
122
141
  ServerSSLCertLoader, Object, Object])
123
142
  ], NodeHonoServerManager);
124
143
  export { NodeHonoServerManager };
@@ -1,46 +1,37 @@
1
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.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
- import type { ProductManifest } from '../../product/index.js';
5
+ import type { ProductManifest, ProductUCsLoaderOutput } 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 { MCPStdioRequestHandler } from '../lib/mcp-server/stdio/MCPStdioRequestHandler.js';
9
+ import type { OpenAPISpec } from '../lib/openapi/types.js';
8
10
  import type { ServerManager } from '../lib/server/ServerManager.js';
9
11
  type S = Pick<LoggerSettings, 'logger_level'>;
10
- /**
11
- * A simple MCP Server implementation
12
- *
13
- * Although it implements {@link ServerManager}, this implementation is not necessarily a "server".
14
- * Indeed, it uses a local `Transport` so it must be considered the same as a {@link NodeCoreCLIManager}.
15
- * Therefore, it calls `execClient` and not `execServer`.
16
- * This way, Claude AI, or any other client is just a wrapper on top of it.
17
- *
18
- * @alpha This implementation still has lots of TODOs and has not been tested in real conditions. It needs to be stabilized before usage.
19
- */
20
- export declare class NodeLocalStdioMCPServerManager implements Configurable<S>, ServerManager {
12
+ export declare class NodeMCPStdioServerManager implements Configurable<S>, ServerManager {
13
+ private requestHandler;
21
14
  private productManifest;
22
15
  private settingsManager;
23
16
  private ucBuilder;
24
17
  private ucManager;
25
18
  private wordingManager;
26
- protected runtime: Server;
19
+ protected runtime: McpServer;
27
20
  private transport;
28
- private appManifests;
29
- private tools;
30
- constructor(productManifest: ProductManifest, settingsManager: SettingsManager<S>, ucBuilder: UCBuilder, ucManager: UCManager, wordingManager: WordingManager);
21
+ constructor(requestHandler: MCPStdioRequestHandler, productManifest: ProductManifest, settingsManager: SettingsManager<S>, ucBuilder: UCBuilder, ucManager: UCManager, wordingManager: WordingManager);
31
22
  s(): S;
32
23
  overrideUCManager(ucManager: UCManager): void;
33
24
  init(): Promise<void>;
34
25
  initSync(): void;
35
26
  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
27
  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;
28
+ mountMCP(_ucs: ProductUCsLoaderOutput, _at: URLPath): Promise<void>;
29
+ mountOpenAPISpec(_spec: OpenAPISpec, _at: URLPath): Promise<void>;
37
30
  mountStaticDir(_dirPath: DirPath): Promise<void>;
38
31
  start(): Promise<void>;
39
32
  stop(): Promise<void>;
40
33
  warmUp(): Promise<void>;
41
- private buildInputSchema;
42
- private execRequest;
43
34
  private initCommon;
44
- mountCommon<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
+ private mountCommon;
45
36
  }
46
37
  export {};
@@ -0,0 +1,108 @@
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 { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
14
+ import { inject, injectable } from 'inversify';
15
+ import { WordingManager } from '../../i18n/index.js';
16
+ import { UCBuilder, } from '../../uc/index.js';
17
+ import { init, toolConfig } from '../lib/mcp-server/funcs.js';
18
+ import { assertLoggerLevel } from '../lib/mcp-server/stdio/funcs.js';
19
+ import { MCPStdioRequestHandler } from '../lib/mcp-server/stdio/MCPStdioRequestHandler.js';
20
+ let NodeMCPStdioServerManager = class NodeMCPStdioServerManager {
21
+ requestHandler;
22
+ productManifest;
23
+ settingsManager;
24
+ ucBuilder;
25
+ ucManager;
26
+ wordingManager;
27
+ runtime;
28
+ transport;
29
+ constructor(requestHandler, productManifest, settingsManager, ucBuilder, ucManager, wordingManager) {
30
+ this.requestHandler = requestHandler;
31
+ this.productManifest = productManifest;
32
+ this.settingsManager = settingsManager;
33
+ this.ucBuilder = ucBuilder;
34
+ this.ucManager = ucManager;
35
+ this.wordingManager = wordingManager;
36
+ }
37
+ s() {
38
+ return {
39
+ logger_level: this.settingsManager.get()('logger_level'),
40
+ };
41
+ }
42
+ overrideUCManager(ucManager) {
43
+ this.ucManager = ucManager;
44
+ }
45
+ async init() {
46
+ this.initCommon();
47
+ }
48
+ initSync() {
49
+ this.initCommon();
50
+ }
51
+ async mount(appManifest, ucd, contract) {
52
+ this.mountCommon(appManifest, ucd, contract);
53
+ }
54
+ mountSync(appManifest, ucd, contract) {
55
+ this.mountCommon(appManifest, ucd, contract);
56
+ }
57
+ async mountMCP(_ucs, _at) {
58
+ // Nothing to do
59
+ }
60
+ async mountOpenAPISpec(_spec, _at) {
61
+ // Nothing to do
62
+ }
63
+ async mountStaticDir(_dirPath) {
64
+ // Nothing to do
65
+ }
66
+ async start() {
67
+ await this.runtime.connect(this.transport);
68
+ }
69
+ async stop() {
70
+ await this.runtime.close();
71
+ await this.transport.close();
72
+ }
73
+ async warmUp() {
74
+ // Nothing to do
75
+ }
76
+ initCommon() {
77
+ this.runtime = init(this.productManifest);
78
+ assertLoggerLevel(this.s().logger_level);
79
+ this.transport = new StdioServerTransport();
80
+ }
81
+ mountCommon(appManifest, ucd, contract) {
82
+ const uc = this.ucBuilder.exec({
83
+ appManifest,
84
+ auth: null,
85
+ def: ucd,
86
+ });
87
+ const mountingPoint = uc.def.ext?.cmd?.mountAt ?? contract.mountingPoint;
88
+ const wording = this.wordingManager.uc(uc.def);
89
+ const config = toolConfig(uc, 'client', wording);
90
+ this.runtime.registerTool(mountingPoint, config, (toolInput) => this.requestHandler.exec({
91
+ appManifest,
92
+ toolInput,
93
+ ucd,
94
+ ucManager: this.ucManager,
95
+ }));
96
+ }
97
+ };
98
+ NodeMCPStdioServerManager = __decorate([
99
+ injectable(),
100
+ __param(0, inject(MCPStdioRequestHandler)),
101
+ __param(1, inject('ProductManifest')),
102
+ __param(2, inject('SettingsManager')),
103
+ __param(3, inject(UCBuilder)),
104
+ __param(4, inject('UCManager')),
105
+ __param(5, inject(WordingManager)),
106
+ __metadata("design:paramtypes", [MCPStdioRequestHandler, Object, Object, UCBuilder, Object, WordingManager])
107
+ ], NodeMCPStdioServerManager);
108
+ export { NodeMCPStdioServerManager };
@@ -1,6 +1,7 @@
1
1
  import { Container } from 'inversify';
2
2
  import { TApiKey, TPassword, TUsername, } from '../../dt/index.js';
3
3
  import { STD_DEFAULT_JWT_MANAGER_SETTINGS, } from '../../std/index.js';
4
+ import { MCPHTTPExpressFakeRequestHandlerBuilder } from '../../target/lib/mcp-server/http/express/MCPHTTPExpressFakeRequestHandlerBuilder.js';
4
5
  import { TARGET_DEFAULT_SERVER_MANAGER_SETTINGS } from '../../target/lib/server/consts.js';
5
6
  import { NodeExpressServerManager } from '../../target/node-express-server/NodeExpressServerManager.js';
6
7
  import { FAKE_USER_ADMIN, FAKE_USER_REGULAR } from '../../uc/index.js';
@@ -38,6 +39,10 @@ export async function newNodeAppTester(serverPortRangeStart, idx, args) {
38
39
  .bind('ServerManager')
39
40
  .to(NodeExpressServerManager)
40
41
  .inSingletonScope();
42
+ container
43
+ .bind('MCPHTTPRequestHandlerBuilder')
44
+ .to(MCPHTTPExpressFakeRequestHandlerBuilder)
45
+ .inSingletonScope();
41
46
  container
42
47
  .bind('UCDefASTParser')
43
48
  .to(TypeScriptLibUCDefASTParser);
@@ -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) {
@@ -0,0 +1,7 @@
1
+ import type { UIntQuantity } from '../dt/index.js';
2
+ export interface UCFieldDefCardinality {
3
+ max?: UIntQuantity;
4
+ min?: UIntQuantity;
5
+ }
6
+ export declare function ucfIsMandatory(cardinality?: UCFieldDefCardinality): boolean;
7
+ export declare function ucfRepeatability(cardinality?: UCFieldDefCardinality): [boolean, UIntQuantity];
@@ -0,0 +1,14 @@
1
+ export function ucfIsMandatory(cardinality) {
2
+ const min = cardinality?.min;
3
+ if (min === undefined) {
4
+ return true;
5
+ }
6
+ return min > 0;
7
+ }
8
+ export function ucfRepeatability(cardinality) {
9
+ const max = cardinality?.max;
10
+ if (max === undefined) {
11
+ return [false, 0];
12
+ }
13
+ return [max > 1, max];
14
+ }
@@ -0,0 +1,2 @@
1
+ import type { DataType, TBase } from '../dt/index.js';
2
+ export declare function ucfExamples<T extends DataType>(type: TBase<T>): T[] | undefined;
@@ -0,0 +1,12 @@
1
+ export function ucfExamples(type) {
2
+ const examples = type.getExamples();
3
+ // Leaving the value `undefined` means you want the default value
4
+ if (examples === undefined) {
5
+ return [type.example()];
6
+ }
7
+ // Setting the examples to `[]` means you don't want them
8
+ if (examples.length === 0) {
9
+ return undefined;
10
+ }
11
+ return examples;
12
+ }
@@ -1,8 +1,8 @@
1
- import { type DataType } from '../../dt/index.js';
1
+ import type { DataType } from '../../dt/index.js';
2
2
  import type { StringKeys } from '../../utils/index.js';
3
3
  import type { UCDef } from '../def.js';
4
4
  import type { UCInput } from '../input.js';
5
- import type { UCOPIBase } from '../opi.js';
5
+ import { type UCOPIBase } from '../opi.js';
6
6
  import type { UCOutput, UCOutputPartIdx, UCOutputPartKey } from '../output.js';
7
7
  import type { UCOutputPart, UCOutputPartDef } from '../output-part.js';
8
8
  import type { UC } from '../UC.js';
@@ -1,4 +1,4 @@
1
- import { TUUID } from '../../dt/index.js';
1
+ import { UCOPIBaseDefFields } from '../opi.js';
2
2
  import { UCOutputField } from '../UCOutputField.js';
3
3
  const ERR_NO_FIELD = (key) => `No field ${key} is defined for this use case`;
4
4
  const ERR_NO_IO_OUTPUT = 'No output is defined for this use case';
@@ -65,7 +65,7 @@ export class UCOutputReader {
65
65
  return undefined;
66
66
  }
67
67
  const { fields, layout, order, related } = partDef;
68
- const allFields = { id: { type: new TUUID() }, ...fields };
68
+ const allFields = { ...UCOPIBaseDefFields, ...fields };
69
69
  const allFieldsKeys = order ?? Object.keys(allFields);
70
70
  let items = [];
71
71
  let total = 0;
@@ -1,9 +1,11 @@
1
1
  export * from './auth/consts.js';
2
2
  export * from './auth.js';
3
+ export * from './cardinality.js';
3
4
  export * from './client.js';
4
5
  export * from './data.js';
5
6
  export * from './data-store.js';
6
7
  export * from './def.js';
8
+ export * from './examples.js';
7
9
  export * from './exec.js';
8
10
  export * from './ext.js';
9
11
  export * from './file.js';
@@ -1,9 +1,11 @@
1
1
  export * from './auth/consts.js';
2
2
  export * from './auth.js';
3
+ export * from './cardinality.js';
3
4
  export * from './client.js';
4
5
  export * from './data.js';
5
6
  export * from './data-store.js';
6
7
  export * from './def.js';
8
+ export * from './examples.js';
7
9
  export * from './exec.js';
8
10
  export * from './ext.js';
9
11
  export * from './file.js';
@@ -1,5 +1,6 @@
1
1
  import type { DataType, TBase, UIntQuantity } from '../dt/index.js';
2
2
  import type { EnumOf } from '../utils/index.js';
3
+ import { type UCFieldDefCardinality } from './cardinality.js';
3
4
  import type { UCFieldKey } from './def.js';
4
5
  import type { Value } from './value.js';
5
6
  export declare const UCInputFieldFillingMode: {
@@ -13,23 +14,19 @@ export declare const UCInputFieldFillingMode: {
13
14
  readonly MANUAL: "MANUAL";
14
15
  };
15
16
  export type UCInputFieldFillingMode = EnumOf<typeof UCInputFieldFillingMode>;
16
- export interface UCInputFieldDefCardinality {
17
- max?: UIntQuantity;
18
- min?: UIntQuantity;
19
- }
20
17
  /**
21
18
  * Definition of a use case input field
22
19
  */
23
20
  export interface UCInputFieldDef<T extends DataType> {
24
21
  /**
25
- * A field can have 0, 1 or n values. This field defines the rules.
22
+ * A field can have 0, 1 or n values.
26
23
  *
27
24
  * @defaultValue { max: 1, min: 1 } => the user must absolutely provide one value only
28
25
  *
29
26
  * @example { max: 5, min: 0 } => the user must provide at most 5 values or none
30
27
  * @example { min: 0 } => the user must provide 0 values or none
31
28
  */
32
- cardinality?: UCInputFieldDefCardinality;
29
+ cardinality?: UCFieldDefCardinality;
33
30
  /**
34
31
  * @defaultValue {@link UCInputFieldFillingMode.MANUAL}
35
32
  */
@@ -1,3 +1,5 @@
1
+ import { ucfIsMandatory, ucfRepeatability, } from './cardinality.js';
2
+ import { ucfExamples } from './examples.js';
1
3
  export const UCInputFieldFillingMode = {
2
4
  /**
3
5
  * Set programmatically on behalf of the user (e.g. a foreign key id for a given object)
@@ -9,17 +11,7 @@ export const UCInputFieldFillingMode = {
9
11
  MANUAL: 'MANUAL',
10
12
  };
11
13
  export function ucifExamples(def) {
12
- const { type } = def;
13
- const examples = type.getExamples();
14
- // Leaving the value `undefined` means you want the default value
15
- if (examples === undefined) {
16
- return [type.example()];
17
- }
18
- // Setting the examples to `[]` means you don't want them
19
- if (examples.length === 0) {
20
- return undefined;
21
- }
22
- return examples;
14
+ return ucfExamples(def.type);
23
15
  }
24
16
  export function ucifHint(def) {
25
17
  if (ucifIsSensitive(def)) {
@@ -52,18 +44,10 @@ export function ucifId(key, prefix = 'inputfield', separator = '-') {
52
44
  return `${prefix}${separator}${key}`;
53
45
  }
54
46
  export function ucifIsMandatory(def) {
55
- const min = def.cardinality?.min;
56
- if (min === undefined) {
57
- return true;
58
- }
59
- return min > 0;
47
+ return ucfIsMandatory(def.cardinality);
60
48
  }
61
49
  export function ucifRepeatability(def) {
62
- const max = def.cardinality?.max;
63
- if (max === undefined) {
64
- return [false, 0];
65
- }
66
- return [max > 1, max];
50
+ return ucfRepeatability(def.cardinality);
67
51
  }
68
52
  export function ucifIsSensitive(def) {
69
53
  const { sensitive, type } = def;