libmodulor 0.28.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 (100) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +2 -2
  3. package/dist/esm/apps/Helper/src/lib/layers/project.js +3 -3
  4. package/dist/esm/dt/base/TBase.d.ts +2 -0
  5. package/dist/esm/dt/base/TBase.js +5 -0
  6. package/dist/esm/dt/base/TBoolean.d.ts +2 -0
  7. package/dist/esm/dt/base/TBoolean.js +3 -0
  8. package/dist/esm/dt/base/TInt.d.ts +2 -0
  9. package/dist/esm/dt/base/TInt.js +3 -0
  10. package/dist/esm/dt/base/TNumber.d.ts +2 -0
  11. package/dist/esm/dt/base/TNumber.js +3 -0
  12. package/dist/esm/dt/base/TObject.d.ts +2 -0
  13. package/dist/esm/dt/base/TObject.js +29 -0
  14. package/dist/esm/dt/final/TApiKey.d.ts +2 -0
  15. package/dist/esm/dt/final/TApiKey.js +3 -0
  16. package/dist/esm/dt/final/TDateISO8601.d.ts +2 -0
  17. package/dist/esm/dt/final/TDateISO8601.js +3 -0
  18. package/dist/esm/dt/final/TDomainName.d.ts +2 -0
  19. package/dist/esm/dt/final/TDomainName.js +3 -0
  20. package/dist/esm/dt/final/TEmail.d.ts +2 -0
  21. package/dist/esm/dt/final/TEmail.js +3 -0
  22. package/dist/esm/dt/final/TEncryptionKey.d.ts +2 -0
  23. package/dist/esm/dt/final/TEncryptionKey.js +3 -0
  24. package/dist/esm/dt/final/TFile.d.ts +2 -0
  25. package/dist/esm/dt/final/TFile.js +3 -0
  26. package/dist/esm/dt/final/TIPv4.d.ts +2 -0
  27. package/dist/esm/dt/final/TIPv4.js +3 -0
  28. package/dist/esm/dt/final/TIPv6.d.ts +2 -0
  29. package/dist/esm/dt/final/TIPv6.js +3 -0
  30. package/dist/esm/dt/final/TJWT.d.ts +2 -0
  31. package/dist/esm/dt/final/TJWT.js +3 -0
  32. package/dist/esm/dt/final/TPassword.d.ts +2 -0
  33. package/dist/esm/dt/final/TPassword.js +3 -0
  34. package/dist/esm/dt/final/TSSHPrivateKey.d.ts +2 -0
  35. package/dist/esm/dt/final/TSSHPrivateKey.js +3 -0
  36. package/dist/esm/dt/final/TTime.d.ts +2 -0
  37. package/dist/esm/dt/final/TTime.js +3 -0
  38. package/dist/esm/dt/final/TURL.d.ts +2 -0
  39. package/dist/esm/dt/final/TURL.js +3 -0
  40. package/dist/esm/dt/index.d.ts +1 -0
  41. package/dist/esm/dt/targets/json-schema.d.ts +24 -0
  42. package/dist/esm/dt/targets/json-schema.js +1 -0
  43. package/dist/esm/error/funcs.d.ts +3 -0
  44. package/dist/esm/error/funcs.js +1 -1
  45. package/dist/esm/error/index.d.ts +1 -1
  46. package/dist/esm/error/index.js +1 -1
  47. package/dist/esm/product/manifest.d.ts +2 -0
  48. package/dist/esm/std/impl/SimpleMapI18nManager.d.ts +1 -1
  49. package/dist/esm/std/impl/SimpleMapI18nManager.js +4 -2
  50. package/dist/esm/target/edge-worker-hono-server/SyncEdgeWorkerHonoServerManager.d.ts +6 -2
  51. package/dist/esm/target/edge-worker-hono-server/SyncEdgeWorkerHonoServerManager.js +17 -9
  52. package/dist/esm/target/index.d.ts +1 -0
  53. package/dist/esm/target/lib/openapi/OpenAPISpecBuilder.d.ts +25 -0
  54. package/dist/esm/target/lib/openapi/OpenAPISpecBuilder.js +131 -0
  55. package/dist/esm/target/lib/openapi/consts.d.ts +2 -0
  56. package/dist/esm/target/lib/openapi/consts.js +1 -0
  57. package/dist/esm/target/lib/openapi/funcs.d.ts +16 -0
  58. package/dist/esm/target/lib/openapi/funcs.js +249 -0
  59. package/dist/esm/target/lib/openapi/input.d.ts +16 -0
  60. package/dist/esm/target/lib/openapi/input.js +33 -0
  61. package/dist/esm/target/lib/openapi/types.d.ts +109 -0
  62. package/dist/esm/target/lib/openapi/types.js +1 -0
  63. package/dist/esm/target/lib/rn/input.d.ts +3 -0
  64. package/dist/esm/target/lib/server/AuthCookieCreator.d.ts +2 -1
  65. package/dist/esm/target/lib/server/ServerBooter.d.ts +4 -2
  66. package/dist/esm/target/lib/server/ServerBooter.js +34 -11
  67. package/dist/esm/target/lib/server/ServerManager.d.ts +19 -9
  68. package/dist/esm/target/lib/server/ServerRequestHandler.d.ts +0 -1
  69. package/dist/esm/target/lib/server/ServerRequestHandler.js +2 -2
  70. package/dist/esm/target/lib/server/consts.d.ts +4 -0
  71. package/dist/esm/target/lib/server/consts.js +22 -0
  72. package/dist/esm/target/lib/server-express/CORSMiddlewareBuilder.d.ts +15 -0
  73. package/dist/esm/target/lib/server-express/CORSMiddlewareBuilder.js +55 -0
  74. package/dist/esm/target/lib/server-express/funcs.d.ts +2 -1
  75. package/dist/esm/target/lib/server-express/funcs.js +7 -2
  76. package/dist/esm/target/lib/server-hono/CORSMiddlewareBuilder.d.ts +14 -0
  77. package/dist/esm/target/lib/server-hono/CORSMiddlewareBuilder.js +46 -0
  78. package/dist/esm/target/lib/server-hono/funcs.d.ts +2 -1
  79. package/dist/esm/target/lib/server-hono/funcs.js +2 -1
  80. package/dist/esm/target/lib/shared.d.ts +4 -0
  81. package/dist/esm/target/lib/shared.js +2 -1
  82. package/dist/esm/target/nextjs-server/NextJSServerManager.d.ts +3 -1
  83. package/dist/esm/target/nextjs-server/NextJSServerManager.js +3 -0
  84. package/dist/esm/target/node-express-server/NodeExpressServerManager.d.ts +7 -3
  85. package/dist/esm/target/node-express-server/NodeExpressServerManager.js +24 -14
  86. package/dist/esm/target/node-hono-server/NodeHonoServerManager.d.ts +6 -2
  87. package/dist/esm/target/node-hono-server/NodeHonoServerManager.js +21 -11
  88. package/dist/esm/target/node-mcp-server/NodeLocalStdioMCPServerManager.d.ts +3 -1
  89. package/dist/esm/target/node-mcp-server/NodeLocalStdioMCPServerManager.js +19 -14
  90. package/dist/esm/target/node-mcp-server/types.d.ts +0 -4
  91. package/dist/esm/uc/UC.d.ts +2 -0
  92. package/dist/esm/uc/UC.js +16 -1
  93. package/dist/esm/uc/metadata.d.ts +7 -0
  94. package/dist/esm/uc/metadata.js +10 -0
  95. package/dist/esm/uc/output-field.d.ts +1 -0
  96. package/dist/esm/uc/output-field.js +13 -1
  97. package/dist/esm/uc/utils/ucHTTPContract.js +1 -1
  98. package/dist/esm/utils/http/types.d.ts +5 -0
  99. package/dist/esm/utils/index.d.ts +1 -1
  100. package/package.json +8 -8
@@ -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
  }
@@ -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];
@@ -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,4 +1,5 @@
1
1
  import type { AppName } from '../app/index.js';
2
+ import { UC_INPUT_SUFFIX, UC_OPI0_SUFFIX, UC_OPI1_SUFFIX } from '../convention.js';
2
3
  import type { IconCode } from '../icon/index.js';
3
4
  /**
4
5
  * The type of action the use case performs
@@ -14,6 +15,9 @@ export type FQUCNameSeparator = '_';
14
15
  * It's made with the {@link AppName} and the {@link UCName} linked by {@link FQUCNameSeparator}.
15
16
  */
16
17
  export type FQUCName = `${AppName}${FQUCNameSeparator}${UCName}`;
18
+ export type FQUCInputName = `${FQUCName}${typeof UC_INPUT_SUFFIX}`;
19
+ export type FQUCOPI0Name = `${FQUCName}${typeof UC_OPI0_SUFFIX}`;
20
+ export type FQUCOPI1Name = `${FQUCName}${typeof UC_OPI1_SUFFIX}`;
17
21
  export interface UCMetadata {
18
22
  action: UCAction;
19
23
  beta?: boolean;
@@ -24,4 +28,7 @@ export interface UCMetadata {
24
28
  }
25
29
  export declare const FQ_UC_NAME_SEPARATOR: FQUCNameSeparator;
26
30
  export declare function formatFQUCName(appName: AppName, ucName: UCName): FQUCName;
31
+ export declare function formatFQUCInputName(fqUCName: FQUCName): FQUCInputName;
32
+ export declare function formatFQUCOPI0Name(fqUCName: FQUCName): FQUCOPI0Name;
33
+ export declare function formatFQUCOPI1Name(fqUCName: FQUCName): FQUCOPI1Name;
27
34
  export declare function parseFQUCName(value: string): [AppName, UCName];
@@ -1,9 +1,19 @@
1
+ import { UC_INPUT_SUFFIX, UC_OPI0_SUFFIX, UC_OPI1_SUFFIX, } from '../convention.js';
1
2
  import { isCapitalized } from '../utils/index.js';
2
3
  const ERR_INVALID_FQ_UC_NAME = (value) => `Invalid fully qualified use case name : ${value}`;
3
4
  export const FQ_UC_NAME_SEPARATOR = '_';
4
5
  export function formatFQUCName(appName, ucName) {
5
6
  return [appName, ucName].join(FQ_UC_NAME_SEPARATOR);
6
7
  }
8
+ export function formatFQUCInputName(fqUCName) {
9
+ return `${fqUCName}${UC_INPUT_SUFFIX}`;
10
+ }
11
+ export function formatFQUCOPI0Name(fqUCName) {
12
+ return `${fqUCName}${UC_OPI0_SUFFIX}`;
13
+ }
14
+ export function formatFQUCOPI1Name(fqUCName) {
15
+ return `${fqUCName}${UC_OPI1_SUFFIX}`;
16
+ }
7
17
  export function parseFQUCName(value) {
8
18
  const elements = value.split(FQ_UC_NAME_SEPARATOR);
9
19
  if (elements.length !== 2) {
@@ -15,3 +15,4 @@ export interface UCOutputFieldDef<OPI extends UCOPIBase, T extends DataType> {
15
15
  totalType?: 'sum';
16
16
  type: TBase<T>;
17
17
  }
18
+ export declare function ucofExamples<OPI extends UCOPIBase, T extends DataType>(def: UCOutputFieldDef<OPI, T>): T[] | undefined;
@@ -1 +1,13 @@
1
- export {};
1
+ export function ucofExamples(def) {
2
+ const { type } = def;
3
+ const examples = type.getExamples();
4
+ // Leaving the value `undefined` means you want the default value
5
+ if (examples === undefined) {
6
+ return [type.example()];
7
+ }
8
+ // Setting the examples to `[]` means you don't want them
9
+ if (examples.length === 0) {
10
+ return undefined;
11
+ }
12
+ return examples;
13
+ }
@@ -7,7 +7,7 @@ const ACTION_HTTP_METHOD_MAPPING = {
7
7
  Update: 'PUT',
8
8
  View: 'GET',
9
9
  };
10
- const METHODS_WITH_NO_BODY = ['GET', 'HEAD'];
10
+ const METHODS_WITH_NO_BODY = ['DELETE', 'GET', 'HEAD'];
11
11
  export function ucHTTPContract(uc, pathPrefix = '/api/v1') {
12
12
  const { ext, metadata } = uc.def;
13
13
  const { action } = metadata;
@@ -1,2 +1,7 @@
1
+ import type { URL } from '../../dt/index.js';
2
+ export type HTTPCSPType = 'defaultSrc' | 'imgSrc' | 'scriptSrc';
3
+ export type HTTPCSPValue = URL[];
4
+ export type HTTPCookieSameSite = 'lax' | 'none' | 'strict';
1
5
  export type HTTPDataEnvelope = 'form-data' | 'json' | 'query-params';
2
6
  export type HTTPReqData = Record<string, unknown>;
7
+ export type HTTPHeaderName = 'Accept' | 'Authorization' | 'Content-Type' | 'Cookie' | 'Origin' | 'X-Requested-With' | (string & {});
@@ -11,7 +11,7 @@ export { fromQueryParams, toQueryParams } from './http/query-params.js';
11
11
  export { SSEStreamManager } from './http/SSEStreamManager.js';
12
12
  export { fmtSingleDataMsg, fmtSSEError, isSSEError, parseDataLine, SSE_HEADERS, } from './http/sse.js';
13
13
  export { isClientError, isError, isServerError } from './http/status.js';
14
- export type { HTTPDataEnvelope, HTTPReqData } from './http/types.js';
14
+ export type { HTTPCookieSameSite, HTTPCSPType, HTTPCSPValue, HTTPDataEnvelope, HTTPHeaderName, HTTPReqData, } from './http/types.js';
15
15
  export { bindFactory } from './ioc/bindFactory.js';
16
16
  export { CONTAINER_OPTS } from './ioc/container.js';
17
17
  export type { Class } from './ioc/types.js';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "libmodulor",
3
3
  "description": "A TypeScript library to create platform-agnostic applications",
4
- "version": "0.28.0",
4
+ "version": "0.29.0",
5
5
  "license": "LGPL-3.0",
6
6
  "author": "Chafik H'nini <chafik.hnini@gmail.com>",
7
7
  "homepage": "https://libmodulor.c100k.eu",
@@ -97,7 +97,7 @@
97
97
  "test": "tsc && vitest run"
98
98
  },
99
99
  "devDependencies": {
100
- "@biomejs/biome": "^2.4.13",
100
+ "@biomejs/biome": "^2.4.14",
101
101
  "@react-native-community/slider": "^4.5.7",
102
102
  "@types/react": "^19.2.14",
103
103
  "@types/react-dom": "^19.2.3",
@@ -105,9 +105,9 @@
105
105
  "babel-plugin-transform-typescript-metadata": "^0.3.2",
106
106
  "expo": "55.0.11",
107
107
  "expo-document-picker": "~14.0.8",
108
- "expo-image-picker": "^17.0.10",
108
+ "expo-image-picker": "^17.0.11",
109
109
  "react-native-safe-area-context": "^5.7.0",
110
- "wrangler": "^4.84.1"
110
+ "wrangler": "^4.90.0"
111
111
  },
112
112
  "peerDependencies": {
113
113
  "@hono/node-server": "^1.19.14",
@@ -119,11 +119,11 @@
119
119
  "express-fileupload": "^1.5.2",
120
120
  "fast-check": "^4.7.0",
121
121
  "helmet": "^8.1.0",
122
- "hono": "^4.12.15",
122
+ "hono": "^4.12.18",
123
123
  "inversify": "^7.11.0",
124
- "jose": "^6.2.2",
125
- "knex": "^3.2.9",
126
- "next": "^15.5.15",
124
+ "jose": "^6.2.3",
125
+ "knex": "^3.2.10",
126
+ "next": "^15.5.18",
127
127
  "pg": "^8.20.0",
128
128
  "react": "19.2.3",
129
129
  "react-dom": "19.2.3",