libmodulor 0.20.0 → 0.22.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 (110) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +1 -1
  3. package/dist/esm/apps/Helper/src/lib/project.js +7 -7
  4. package/dist/esm/apps/Helper/src/ucds/CreateProjectUCD.d.ts +1 -0
  5. package/dist/esm/apps/Helper/src/ucds/CreateProjectUCD.js +20 -13
  6. package/dist/esm/dt/DataType.d.ts +2 -1
  7. package/dist/esm/dt/DataTypes.js +1 -0
  8. package/dist/esm/dt/Validation.js +1 -1
  9. package/dist/esm/dt/final/TGitSSHURL.d.ts +4 -3
  10. package/dist/esm/dt/final/TGitSSHURL.js +1 -1
  11. package/dist/esm/dt/final/TSSHPrivateKey.js +1 -3
  12. package/dist/esm/dt/final/TTransportType.d.ts +8 -0
  13. package/dist/esm/dt/final/TTransportType.js +16 -0
  14. package/dist/esm/dt/index.d.ts +1 -0
  15. package/dist/esm/dt/index.js +1 -0
  16. package/dist/esm/error/funcs.d.ts +2 -0
  17. package/dist/esm/error/funcs.js +19 -0
  18. package/dist/esm/error/index.d.ts +1 -0
  19. package/dist/esm/error/index.js +1 -0
  20. package/dist/esm/index.d.ts +2 -0
  21. package/dist/esm/index.js +2 -0
  22. package/dist/esm/std/HTTPAPICallExecutor.d.ts +16 -7
  23. package/dist/esm/std/HTTPAPICaller.d.ts +8 -1
  24. package/dist/esm/std/LLMManager.d.ts +20 -3
  25. package/dist/esm/std/impl/ConsoleLogger.js +2 -2
  26. package/dist/esm/std/impl/FakeClockManager.d.ts +6 -0
  27. package/dist/esm/std/impl/FakeClockManager.js +19 -0
  28. package/dist/esm/std/impl/FakeHTTPAPICallExecutor.js +19 -18
  29. package/dist/esm/std/impl/FakeLLMManager.d.ts +4 -0
  30. package/dist/esm/std/impl/FakeLLMManager.js +40 -0
  31. package/dist/esm/std/impl/FetchHTTPAPICallExecutor.js +1 -1
  32. package/dist/esm/std/impl/MistralAILLMManager.js +12 -0
  33. package/dist/esm/std/impl/NodeFormDataBuilder.js +3 -1
  34. package/dist/esm/std/impl/OllamaLLMManager.d.ts +7 -2
  35. package/dist/esm/std/impl/OllamaLLMManager.js +32 -5
  36. package/dist/esm/std/impl/OpenAILLMManager.js +9 -0
  37. package/dist/esm/std/impl/SimpleHTTPAPICaller.d.ts +7 -3
  38. package/dist/esm/std/impl/SimpleHTTPAPICaller.js +67 -16
  39. package/dist/esm/target/lib/cli/CommandExecutor.js +11 -3
  40. package/dist/esm/target/lib/react/UCPanel.d.ts +4 -2
  41. package/dist/esm/target/lib/react/UCPanel.js +2 -6
  42. package/dist/esm/target/lib/react/form.d.ts +5 -6
  43. package/dist/esm/target/lib/react/form.js +7 -10
  44. package/dist/esm/target/lib/react/useUC.d.ts +4 -4
  45. package/dist/esm/target/lib/server/ServerRequestHandler.d.ts +3 -2
  46. package/dist/esm/target/lib/server/ServerRequestHandler.js +2 -2
  47. package/dist/esm/target/lib/server-express/funcs.js +52 -1
  48. package/dist/esm/target/lib/server-hono/funcs.js +65 -2
  49. package/dist/esm/target/node-mcp-server/NodeLocalStdioMCPServerManager.js +1 -0
  50. package/dist/esm/target/react-native-pure/UCForm.d.ts +1 -1
  51. package/dist/esm/target/react-native-pure/UCForm.js +2 -2
  52. package/dist/esm/target/react-native-pure/UCFormField.d.ts +1 -1
  53. package/dist/esm/target/react-native-pure/UCFormField.js +3 -4
  54. package/dist/esm/target/react-native-pure/UCFormFieldControl.js +13 -7
  55. package/dist/esm/target/react-web-pure/UCForm.d.ts +1 -1
  56. package/dist/esm/target/react-web-pure/UCForm.js +2 -2
  57. package/dist/esm/target/react-web-pure/UCFormField.d.ts +1 -1
  58. package/dist/esm/target/react-web-pure/UCFormField.js +3 -4
  59. package/dist/esm/target/react-web-pure/UCFormFieldControl.js +7 -4
  60. package/dist/esm/testing/AppTester.d.ts +1 -1
  61. package/dist/esm/testing/AppTester.js +3 -2
  62. package/dist/esm/testing/impl/SimpleHTMLAppTestReportEmitter.js +1 -1
  63. package/dist/esm/testing/impl/TypeScriptLibUCDefASTParser.js +2 -2
  64. package/dist/esm/testing/impl/VitestAppTestSuiteEmitter.js +6 -3
  65. package/dist/esm/testing/uc-input.js +13 -12
  66. package/dist/esm/testing/workers/UCExecutor.js +41 -3
  67. package/dist/esm/uc/UC.d.ts +7 -7
  68. package/dist/esm/uc/UC.js +4 -3
  69. package/dist/esm/uc/UCInputField.d.ts +6 -3
  70. package/dist/esm/uc/UCInputField.js +39 -29
  71. package/dist/esm/uc/ext.d.ts +7 -1
  72. package/dist/esm/uc/impl/HTTPUCTransporter.d.ts +2 -2
  73. package/dist/esm/uc/impl/HTTPUCTransporter.js +3 -1
  74. package/dist/esm/uc/impl/SimpleUCManager.d.ts +3 -3
  75. package/dist/esm/uc/impl/SimpleUCManager.js +23 -4
  76. package/dist/esm/uc/index.d.ts +0 -1
  77. package/dist/esm/uc/index.js +0 -1
  78. package/dist/esm/uc/input-field.d.ts +2 -19
  79. package/dist/esm/uc/input-field.js +0 -19
  80. package/dist/esm/uc/input.d.ts +13 -7
  81. package/dist/esm/uc/lifecycle/client/SendClientMain.d.ts +1 -1
  82. package/dist/esm/uc/lifecycle/client/SendClientMain.js +5 -2
  83. package/dist/esm/uc/main.d.ts +8 -1
  84. package/dist/esm/uc/manager.d.ts +11 -2
  85. package/dist/esm/uc/output.d.ts +1 -0
  86. package/dist/esm/uc/output.js +10 -1
  87. package/dist/esm/uc/transporter.d.ts +7 -1
  88. package/dist/esm/uc/utils/rInput.js +4 -3
  89. package/dist/esm/uc/utils/rVal.d.ts +5 -5
  90. package/dist/esm/uc/utils/rVal.js +1 -12
  91. package/dist/esm/uc/value.d.ts +1 -2
  92. package/dist/esm/uc/workers/UCInputFilesProcessor.js +3 -3
  93. package/dist/esm/utils/async/types.d.ts +2 -0
  94. package/dist/esm/utils/async/types.js +1 -0
  95. package/dist/esm/utils/http/NDJSONStreamManager.d.ts +12 -0
  96. package/dist/esm/utils/http/NDJSONStreamManager.js +42 -0
  97. package/dist/esm/utils/http/SSEStreamManager.d.ts +12 -0
  98. package/dist/esm/utils/http/SSEStreamManager.js +57 -0
  99. package/dist/esm/utils/http/nd-json.d.ts +1 -0
  100. package/dist/esm/utils/http/nd-json.js +2 -0
  101. package/dist/esm/utils/http/sse.d.ts +14 -0
  102. package/dist/esm/utils/http/sse.js +24 -0
  103. package/dist/esm/utils/http/status.d.ts +4 -0
  104. package/dist/esm/utils/http/status.js +9 -0
  105. package/dist/esm/utils/index.d.ts +6 -0
  106. package/dist/esm/utils/index.js +4 -0
  107. package/dist/esm/utils/streams/types.d.ts +17 -0
  108. package/dist/esm/utils/streams/types.js +1 -0
  109. package/package.json +15 -15
  110. package/pnpm-workspace.yaml +1 -0
@@ -0,0 +1,42 @@
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 NDJSONStreamManager_1;
8
+ import { injectable } from 'inversify';
9
+ import { NDJSON_DATA_SEP } from './nd-json.js';
10
+ let NDJSONStreamManager = class NDJSONStreamManager {
11
+ static { NDJSONStreamManager_1 = this; }
12
+ static DEFAULT_ENCODING = 'utf-8';
13
+ async exec({ encoding = NDJSONStreamManager_1.DEFAULT_ENCODING, onData, reader, }) {
14
+ const decoder = new TextDecoder(encoding);
15
+ let buffer = '';
16
+ while (true) {
17
+ const { done, value } = await reader.read();
18
+ if (done) {
19
+ return;
20
+ }
21
+ buffer += decoder.decode(value, { stream: true });
22
+ const parts = buffer.split(NDJSON_DATA_SEP);
23
+ // Remove the last part that is potentially not complete yet.
24
+ buffer = parts.pop() ?? '';
25
+ for (const part of parts) {
26
+ const lines = part.split(NDJSON_DATA_SEP);
27
+ for (const line of lines) {
28
+ try {
29
+ onData(JSON.parse(line));
30
+ }
31
+ catch (_err) {
32
+ // Ignore invalid message
33
+ }
34
+ }
35
+ }
36
+ }
37
+ }
38
+ };
39
+ NDJSONStreamManager = NDJSONStreamManager_1 = __decorate([
40
+ injectable()
41
+ ], NDJSONStreamManager);
42
+ export { NDJSONStreamManager };
@@ -0,0 +1,12 @@
1
+ import type { HTTPAPICallExecutorResBody, Worker } from '../../std/index.js';
2
+ type Encoding = 'utf-8';
3
+ interface I<D extends object = object> {
4
+ encoding?: Encoding | undefined;
5
+ onData: (data: D) => Promise<void>;
6
+ reader: ReturnType<HTTPAPICallExecutorResBody['getReader']>;
7
+ }
8
+ export declare class SSEStreamManager implements Worker<I, Promise<void>> {
9
+ private static DEFAULT_ENCODING;
10
+ exec({ encoding, onData, reader, }: I): Promise<void>;
11
+ }
12
+ export {};
@@ -0,0 +1,57 @@
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 SSEStreamManager_1;
8
+ import { injectable } from 'inversify';
9
+ import { throwCustomError } from '../../error/index.js';
10
+ import { isSSEError, parseDataLine, SSE_DATA_SEP, SSE_MSG_SEP } from './sse.js';
11
+ let SSEStreamManager = class SSEStreamManager {
12
+ static { SSEStreamManager_1 = this; }
13
+ static DEFAULT_ENCODING = 'utf-8';
14
+ async exec({ encoding = SSEStreamManager_1.DEFAULT_ENCODING, onData, reader, }) {
15
+ const decoder = new TextDecoder(encoding);
16
+ let buffer = '';
17
+ while (true) {
18
+ const { done, value } = await reader.read();
19
+ if (done) {
20
+ return;
21
+ }
22
+ buffer += decoder.decode(value, { stream: true });
23
+ const parts = buffer.split(SSE_MSG_SEP);
24
+ // Remove the last part that is potentially not complete yet.
25
+ buffer = parts.pop() ?? '';
26
+ for (const part of parts) {
27
+ const lines = part.split(SSE_DATA_SEP);
28
+ let data = '';
29
+ for (const line of lines) {
30
+ data += parseDataLine(line);
31
+ }
32
+ if (!data) {
33
+ continue;
34
+ }
35
+ let parsedData;
36
+ try {
37
+ parsedData = JSON.parse(data);
38
+ }
39
+ catch (_err) {
40
+ // Ignore invalid message
41
+ continue;
42
+ }
43
+ if (isSSEError(parsedData)) {
44
+ const { message, status } = parsedData;
45
+ throwCustomError(message, status);
46
+ }
47
+ else {
48
+ onData(parsedData);
49
+ }
50
+ }
51
+ }
52
+ }
53
+ };
54
+ SSEStreamManager = SSEStreamManager_1 = __decorate([
55
+ injectable()
56
+ ], SSEStreamManager);
57
+ export { SSEStreamManager };
@@ -0,0 +1 @@
1
+ export declare const NDJSON_DATA_SEP = "\n";
@@ -0,0 +1,2 @@
1
+ // https://github.com/ndjson/ndjson-spec
2
+ export const NDJSON_DATA_SEP = '\n';
@@ -0,0 +1,14 @@
1
+ import type { ErrorMessage, HTTPStatusNumber } from '../../dt/index.js';
2
+ export declare const SSE_HEADERS: [string, string][];
3
+ export declare const SSE_DATA_PREFIX = "data:";
4
+ export declare const SSE_DATA_SEP = "\n";
5
+ export declare const SSE_MSG_SEP = "\n\n";
6
+ export type SSEStreamDataCleanUpFunc = () => void;
7
+ export interface SSEError {
8
+ message: ErrorMessage;
9
+ status: HTTPStatusNumber;
10
+ }
11
+ export declare function fmtSSEError(err: SSEError): string;
12
+ export declare function fmtSingleDataMsg<D extends object = object>(data: D): string;
13
+ export declare function isSSEError(err: unknown): err is SSEError;
14
+ export declare function parseDataLine(line: string): string;
@@ -0,0 +1,24 @@
1
+ // https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events
2
+ export const SSE_HEADERS = [
3
+ ['Cache-Control', 'no-cache'],
4
+ ['Content-Type', 'text/event-stream'],
5
+ ['Connection', 'keep-alive'],
6
+ ];
7
+ export const SSE_DATA_PREFIX = 'data:';
8
+ export const SSE_DATA_SEP = '\n';
9
+ export const SSE_MSG_SEP = '\n\n';
10
+ export function fmtSSEError(err) {
11
+ return `${SSE_DATA_PREFIX} ${JSON.stringify(err)}${SSE_MSG_SEP}`;
12
+ }
13
+ export function fmtSingleDataMsg(data) {
14
+ return `${SSE_DATA_PREFIX} ${JSON.stringify(data)}${SSE_MSG_SEP}`;
15
+ }
16
+ export function isSSEError(err) {
17
+ return 'message' in err && 'status' in err;
18
+ }
19
+ export function parseDataLine(line) {
20
+ if (!line.startsWith(SSE_DATA_PREFIX)) {
21
+ return '';
22
+ }
23
+ return `${line.slice(SSE_DATA_PREFIX.length).trim()}${SSE_DATA_SEP}`;
24
+ }
@@ -0,0 +1,4 @@
1
+ import type { HTTPStatusNumber } from '../../dt/index.js';
2
+ export declare function isError(status: HTTPStatusNumber): boolean;
3
+ export declare function isClientError(status: HTTPStatusNumber): boolean;
4
+ export declare function isServerError(status: HTTPStatusNumber): boolean;
@@ -0,0 +1,9 @@
1
+ export function isError(status) {
2
+ return status >= 400;
3
+ }
4
+ export function isClientError(status) {
5
+ return status >= 400 && status < 500;
6
+ }
7
+ export function isServerError(status) {
8
+ return status >= 500;
9
+ }
@@ -1,17 +1,23 @@
1
1
  export { sleep } from './async/sleep.js';
2
+ export type { AbortFunc, RegisterAbortFunc } from './async/types.js';
2
3
  export type { Clearable } from './concerns/Clearable.js';
3
4
  export type { Initializable } from './concerns/Initializable.js';
4
5
  export type { SrcImporter } from './esm/srcImporter.js';
5
6
  export { fromFormData, toFormData } from './http/form-data.js';
6
7
  export { HTTPRequestBuilder } from './http/HTTPRequestBuilder.js';
7
8
  export { toJSON } from './http/json.js';
9
+ export { NDJSONStreamManager } from './http/NDJSONStreamManager.js';
8
10
  export { fromQueryParams, toQueryParams } from './http/query-params.js';
11
+ export { SSEStreamManager } from './http/SSEStreamManager.js';
12
+ export { fmtSingleDataMsg, fmtSSEError, isSSEError, parseDataLine, SSE_HEADERS, } from './http/sse.js';
13
+ export { isClientError, isError, isServerError } from './http/status.js';
9
14
  export type { HTTPDataEnvelope, HTTPReqData } from './http/types.js';
10
15
  export { bindProvider } from './ioc/bindProvider.js';
11
16
  export { CONTAINER_OPTS } from './ioc/container.js';
12
17
  export type { Class } from './ioc/types.js';
13
18
  export { fmt as fmtNumber } from './numbers/fmt.js';
14
19
  export { baseFromSquareUnit, type CoreUnit, isSquareUnit, type SquareableUnit, type SquareUnit, type Unit, } from './numbers/units.js';
20
+ export type { StreamConfig, StreamOnClose, StreamOnData, StreamOnDone, } from './streams/types.js';
15
21
  export { capitalize, isCapitalized } from './strings/capitalize.js';
16
22
  export { humanize } from './strings/humanize.js';
17
23
  export { truncate } from './strings/truncate.js';
@@ -2,7 +2,11 @@ export { sleep } from './async/sleep.js';
2
2
  export { fromFormData, toFormData } from './http/form-data.js';
3
3
  export { HTTPRequestBuilder } from './http/HTTPRequestBuilder.js';
4
4
  export { toJSON } from './http/json.js';
5
+ export { NDJSONStreamManager } from './http/NDJSONStreamManager.js';
5
6
  export { fromQueryParams, toQueryParams } from './http/query-params.js';
7
+ export { SSEStreamManager } from './http/SSEStreamManager.js';
8
+ export { fmtSingleDataMsg, fmtSSEError, isSSEError, parseDataLine, SSE_HEADERS, } from './http/sse.js';
9
+ export { isClientError, isError, isServerError } from './http/status.js';
6
10
  export { bindProvider } from './ioc/bindProvider.js';
7
11
  export { CONTAINER_OPTS } from './ioc/container.js';
8
12
  export { fmt as fmtNumber } from './numbers/fmt.js';
@@ -0,0 +1,17 @@
1
+ export type StreamOnClose = () => Promise<void>;
2
+ export type StreamOnData<D extends object> = (data: D) => Promise<void>;
3
+ export type StreamOnDone = () => Promise<void>;
4
+ export interface StreamConfig<D extends object> {
5
+ /**
6
+ * When the consumer closes the stream
7
+ */
8
+ onClose: StreamOnClose;
9
+ /**
10
+ * When the provider sends data
11
+ */
12
+ onData: StreamOnData<D>;
13
+ /**
14
+ * When the provider is done sending data
15
+ */
16
+ onDone: StreamOnDone;
17
+ }
@@ -0,0 +1 @@
1
+ export {};
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.20.0",
4
+ "version": "0.22.0",
5
5
  "license": "LGPL-3.0",
6
6
  "author": "Chafik H'nini <chafik.hnini@gmail.com>",
7
7
  "homepage": "https://libmodulor.c100k.eu",
@@ -81,31 +81,31 @@
81
81
  "lint:ci": "biome check"
82
82
  },
83
83
  "devDependencies": {
84
- "@biomejs/biome": "^2.1.2"
84
+ "@biomejs/biome": "^2.2.7"
85
85
  },
86
86
  "peerDependencies": {
87
- "@hono/node-server": "^1.17.1",
88
- "@modelcontextprotocol/sdk": "^1.16.0",
89
- "@stricli/core": "^1.2.0",
87
+ "@hono/node-server": "^1.19.5",
88
+ "@modelcontextprotocol/sdk": "^1.20.1",
89
+ "@stricli/core": "^1.2.4",
90
90
  "buffer": "^6.0.3",
91
91
  "cookie-parser": "^1.4.7",
92
92
  "express": "^5.1.0",
93
93
  "express-fileupload": "^1.5.2",
94
- "fast-check": "^4.2.0",
94
+ "fast-check": "^4.3.0",
95
95
  "helmet": "^8.1.0",
96
- "hono": "^4.8.5",
97
- "inversify": "^7.6.1",
98
- "jose": "^6.0.12",
96
+ "hono": "^4.10.2",
97
+ "inversify": "^7.10.3",
98
+ "jose": "^6.1.0",
99
99
  "knex": "^3.1.0",
100
- "next": "^15.4.2",
100
+ "next": "^15.5.6",
101
101
  "pg": "^8.16.3",
102
- "react": "^19.1.0",
103
- "react-dom": "^19.1.0",
104
- "react-native": "^0.79.5",
102
+ "react": "^19.2.0",
103
+ "react-dom": "^19.2.0",
104
+ "react-native": "^0.81.5",
105
105
  "reflect-metadata": "^0.2.2",
106
106
  "sqlite3": "^5.1.7",
107
- "typescript": "^5.8.3",
108
- "vite": "^6.3.5",
107
+ "typescript": "^5.9.3",
108
+ "vite": "^6.4.1",
109
109
  "vitest": "^3.2.4"
110
110
  },
111
111
  "peerDependenciesMeta": {
@@ -1,3 +1,4 @@
1
+ minimumReleaseAge: 2880
1
2
  packages:
2
3
  - examples/basic
3
4
  - examples/standalone