libmodulor 0.24.0 → 0.25.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 (73) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +1 -1
  3. package/dist/esm/apps/Helper/src/lib/project.js +6 -6
  4. package/dist/esm/dt/Validation.d.ts +2 -2
  5. package/dist/esm/dt/base/TBase.d.ts +2 -0
  6. package/dist/esm/dt/base/TBase.js +3 -0
  7. package/dist/esm/dt/base/TObject.d.ts +6 -4
  8. package/dist/esm/dt/base/TObject.js +4 -5
  9. package/dist/esm/dt/base/TString.d.ts +2 -1
  10. package/dist/esm/dt/base/TString.js +22 -0
  11. package/dist/esm/dt/final/TFile.d.ts +13 -4
  12. package/dist/esm/dt/final/TFile.js +70 -8
  13. package/dist/esm/dt/final/TFileExtension.d.ts +1 -1
  14. package/dist/esm/dt/final/TFileMimeType.d.ts +2 -6
  15. package/dist/esm/dt/final/TFileMimeType.js +0 -6
  16. package/dist/esm/dt/final/TFilePath.d.ts +7 -0
  17. package/dist/esm/dt/final/TFilePath.js +5 -1
  18. package/dist/esm/dt/index.d.ts +1 -1
  19. package/dist/esm/i18n/WordingManager.d.ts +2 -1
  20. package/dist/esm/i18n/WordingManager.js +23 -2
  21. package/dist/esm/i18n/locales/de.js +8 -0
  22. package/dist/esm/i18n/locales/en.js +8 -0
  23. package/dist/esm/i18n/locales/es.js +8 -0
  24. package/dist/esm/i18n/locales/fr.js +8 -0
  25. package/dist/esm/i18n/types.d.ts +2 -2
  26. package/dist/esm/std/FSManager.d.ts +7 -5
  27. package/dist/esm/std/FSManager.js +5 -6
  28. package/dist/esm/std/FormDataBuilder.d.ts +2 -1
  29. package/dist/esm/std/impl/NodeFSManager.js +3 -2
  30. package/dist/esm/target/lib/react/StyleContextProvider.d.ts +1 -0
  31. package/dist/esm/target/lib/react/form.d.ts +1 -1
  32. package/dist/esm/target/lib/react/form.js +1 -0
  33. package/dist/esm/target/lib/react/useAction.d.ts +1 -1
  34. package/dist/esm/target/lib/react/useAction.js +13 -12
  35. package/dist/esm/target/lib/server-express/funcs.js +2 -1
  36. package/dist/esm/target/lib/web/input.d.ts +1 -0
  37. package/dist/esm/target/lib/web/input.js +5 -1
  38. package/dist/esm/target/react-native-pure/UCFormField.js +2 -1
  39. package/dist/esm/target/react-native-pure/UCFormFieldControl.js +6 -4
  40. package/dist/esm/target/react-native-pure/UCFormFieldErr.d.ts +1 -1
  41. package/dist/esm/target/react-native-pure/UCFormFieldErr.js +4 -1
  42. package/dist/esm/target/react-native-pure/UCFormFieldHelp.d.ts +4 -0
  43. package/dist/esm/target/react-native-pure/UCFormFieldHelp.js +15 -0
  44. package/dist/esm/target/react-web-pure/UCFormField.js +2 -1
  45. package/dist/esm/target/react-web-pure/UCFormFieldErr.d.ts +1 -1
  46. package/dist/esm/target/react-web-pure/UCFormFieldErr.js +4 -1
  47. package/dist/esm/target/react-web-pure/UCFormFieldHelp.d.ts +4 -0
  48. package/dist/esm/target/react-web-pure/UCFormFieldHelp.js +14 -0
  49. package/dist/esm/testing/impl/SimpleAppDocsEmitter/SimpleAppDocsEmitter.d.ts +7 -0
  50. package/dist/esm/testing/impl/SimpleAppDocsEmitter/SimpleAppDocsEmitter.js +59 -0
  51. package/dist/esm/testing/impl/SimpleAppDocsEmitter/markdown.d.ts +2 -0
  52. package/dist/esm/testing/impl/SimpleAppDocsEmitter/markdown.js +10 -0
  53. package/dist/esm/testing/impl/SimpleAppDocsEmitter/sequence-diagram.d.ts +2 -0
  54. package/dist/esm/testing/impl/SimpleAppDocsEmitter/sequence-diagram.js +92 -0
  55. package/dist/esm/testing/impl/SimpleAppDocsEmitter/tech-summary.d.ts +2 -0
  56. package/dist/esm/testing/impl/SimpleAppDocsEmitter/tech-summary.js +27 -0
  57. package/dist/esm/testing/impl/SimpleAppDocsEmitter/uc-summary.d.ts +2 -0
  58. package/dist/esm/testing/impl/SimpleAppDocsEmitter/uc-summary.js +63 -0
  59. package/dist/esm/testing/impl/newNodeAppTester.js +1 -1
  60. package/dist/esm/testing/uc-input.js +5 -2
  61. package/dist/esm/uc/exec.d.ts +42 -21
  62. package/dist/esm/uc/exec.js +48 -13
  63. package/dist/esm/uc/input-field.d.ts +6 -4
  64. package/dist/esm/uc/input-field.js +4 -5
  65. package/dist/esm/uc/side-effect.d.ts +10 -8
  66. package/dist/esm/uc/side-effect.js +5 -6
  67. package/dist/esm/uc/workers/UCInputFilesProcessor.js +3 -3
  68. package/dist/esm/uc/workers/UCInputValidator.js +2 -1
  69. package/dist/esm/uc/workers/UCOutputFilesProcessor.js +1 -1
  70. package/dist/esm/utils/bundling/webpack/loader.js +1 -1
  71. package/dist/esm/utils/index.d.ts +1 -1
  72. package/dist/esm/utils/types/utility-types.d.ts +4 -0
  73. package/package.json +16 -14
@@ -1,5 +1,6 @@
1
- import { TFile } from '../dt/index.js';
1
+ import { TFile, TFilePath } from '../dt/index.js';
2
2
  import { ucifIsMandatory, ucifMustBeFilledManually, ucifRepeatability, } from '../uc/index.js';
3
+ import { range } from '../utils/index.js';
3
4
  export const DEFAULT_UC_INPUT_FILLERS = [
4
5
  'ALL_WITH_EXAMPLES',
5
6
  'ONLY_MANDATORY_WITH_EXAMPLES',
@@ -39,7 +40,9 @@ function fillWithExample(f) {
39
40
  if (type instanceof TFile) {
40
41
  const example = type.getExamples()?.[0] ?? type.example();
41
42
  // TODO : Consider building a real file with real data (e.g. image, pdf, txt, etc.)
42
- const val = new File(['01010101010101010101010101010101'], example.path, {
43
+ // A fake file filled with 0s and 1s
44
+ const blob = range(TFilePath.FILE_SIZE).map((i) => (i % 2).toString());
45
+ const val = new File(blob, example.uri, {
43
46
  type: example.type,
44
47
  });
45
48
  const [isRepeatable] = ucifRepeatability(f.def);
@@ -1,38 +1,59 @@
1
+ import type { EnumOf } from '../utils/index.js';
1
2
  /**
2
3
  * Mode of execution of a use case
3
- *
4
- * Unlike all the other enums, the values are lowercased for compatibility reasons.
5
- * Indeed, this value is persisted in the database so we need to support all existing deployments.
6
4
  */
7
- export declare enum UCExecMode {
5
+ export declare const UCExecMode: {
8
6
  /**
9
7
  * The use case has been executed programmatically
10
8
  */
11
- AUTO = "auto",
9
+ readonly AUTO: "auto";
12
10
  /**
13
11
  * The use case has been executed explicitly by a user
14
12
  */
15
- USER = "user"
16
- }
13
+ readonly USER: "user";
14
+ };
15
+ export type UCExecMode = EnumOf<typeof UCExecMode>;
17
16
  /**
18
17
  * Result of execution of a use case
19
- *
20
- * - `aborted` : The user aborted the exec (e.g. by not confirming)
21
- * - `failed` : The exec failed
22
- * - `succeeded` : The exec succeeded
23
18
  */
24
- export type UCExecRes = 'aborted' | 'failed' | 'succeeded';
19
+ export declare const UCExecRes: {
20
+ /**
21
+ * The user aborted the exec (e.g. by not confirming)
22
+ */
23
+ readonly ABORTED: "aborted";
24
+ /**
25
+ * The execution failed
26
+ */
27
+ readonly FAILED: "failed";
28
+ /**
29
+ * The execution succeeded
30
+ */
31
+ readonly SUCCEEDED: "succeeded";
32
+ };
33
+ export type UCExecRes = EnumOf<typeof UCExecRes>;
25
34
  /**
26
35
  * State of execution of a use case
27
- *
28
- * - `changing` : An action triggered a change, fields should be disabled
29
- * - `idle` : It can be touched and filled by the user
30
- * - `initializing` : It's initializing in some way, fields should be disabled
31
- * - `submitting` : It's submitting, fields should be disabled and some indicator should show the processing
32
- *
33
36
  * It applies to a form, but it can be applied and generalized to any other interaction mechanism (i.e. cli, voice...).
34
37
  */
35
- export type UCExecState = 'changing' | 'idle' | 'initializing' | 'submitting';
38
+ export declare const UCExecState: {
39
+ /**
40
+ * An action triggered a change, fields should be disabled
41
+ */
42
+ readonly CHANGING: "changing";
43
+ /**
44
+ * It can be touched and filled by the user
45
+ */
46
+ readonly IDLE: "idle";
47
+ /**
48
+ * It's initializing in some way, fields should be disabled
49
+ */
50
+ readonly INITIALIZING: "initializing";
51
+ /**
52
+ * It's submitting, fields should be disabled and some indicator should show the processing
53
+ */
54
+ readonly SUBMITTING: "submitting";
55
+ };
56
+ export type UCExecState = EnumOf<typeof UCExecState>;
36
57
  /**
37
58
  * Check whether the execution corresponds to a "disabled" state
38
59
  *
@@ -45,8 +66,8 @@ export declare function ucIsDisabled(execState: UCExecState): boolean;
45
66
  /**
46
67
  * Check whether the execution corresponds to a "loading" state
47
68
  *
48
- * Typically, this is used to show a `loading` indicator. Thus, it's `true` when `execState === 'submitting'`.
49
- * Note that it's not for `changing` or `initializing` because these are not triggered by the user per sé.
69
+ * Typically, this is used to show a `loading` indicator. Thus, it's `true` when `execState === UCExecState.SUBMITTING`.
70
+ * Note that it's not for `UCExecState.CHANGING` or `UCExecState.INITIALIZING` because these are not triggered by the user per sé.
50
71
  *
51
72
  * @param execState
52
73
  * @returns
@@ -1,20 +1,55 @@
1
1
  /**
2
2
  * Mode of execution of a use case
3
- *
4
- * Unlike all the other enums, the values are lowercased for compatibility reasons.
5
- * Indeed, this value is persisted in the database so we need to support all existing deployments.
6
3
  */
7
- export var UCExecMode;
8
- (function (UCExecMode) {
4
+ export const UCExecMode = {
9
5
  /**
10
6
  * The use case has been executed programmatically
11
7
  */
12
- UCExecMode["AUTO"] = "auto";
8
+ AUTO: 'auto',
13
9
  /**
14
10
  * The use case has been executed explicitly by a user
15
11
  */
16
- UCExecMode["USER"] = "user";
17
- })(UCExecMode || (UCExecMode = {}));
12
+ USER: 'user',
13
+ };
14
+ /**
15
+ * Result of execution of a use case
16
+ */
17
+ export const UCExecRes = {
18
+ /**
19
+ * The user aborted the exec (e.g. by not confirming)
20
+ */
21
+ ABORTED: 'aborted',
22
+ /**
23
+ * The execution failed
24
+ */
25
+ FAILED: 'failed',
26
+ /**
27
+ * The execution succeeded
28
+ */
29
+ SUCCEEDED: 'succeeded',
30
+ };
31
+ /**
32
+ * State of execution of a use case
33
+ * It applies to a form, but it can be applied and generalized to any other interaction mechanism (i.e. cli, voice...).
34
+ */
35
+ export const UCExecState = {
36
+ /**
37
+ * An action triggered a change, fields should be disabled
38
+ */
39
+ CHANGING: 'changing',
40
+ /**
41
+ * It can be touched and filled by the user
42
+ */
43
+ IDLE: 'idle',
44
+ /**
45
+ * It's initializing in some way, fields should be disabled
46
+ */
47
+ INITIALIZING: 'initializing',
48
+ /**
49
+ * It's submitting, fields should be disabled and some indicator should show the processing
50
+ */
51
+ SUBMITTING: 'submitting',
52
+ };
18
53
  /**
19
54
  * Check whether the execution corresponds to a "disabled" state
20
55
  *
@@ -24,19 +59,19 @@ export var UCExecMode;
24
59
  * @returns
25
60
  */
26
61
  export function ucIsDisabled(execState) {
27
- return execState !== 'idle';
62
+ return execState !== UCExecState.IDLE;
28
63
  }
29
64
  /**
30
65
  * Check whether the execution corresponds to a "loading" state
31
66
  *
32
- * Typically, this is used to show a `loading` indicator. Thus, it's `true` when `execState === 'submitting'`.
33
- * Note that it's not for `changing` or `initializing` because these are not triggered by the user per sé.
67
+ * Typically, this is used to show a `loading` indicator. Thus, it's `true` when `execState === UCExecState.SUBMITTING`.
68
+ * Note that it's not for `UCExecState.CHANGING` or `UCExecState.INITIALIZING` because these are not triggered by the user per sé.
34
69
  *
35
70
  * @param execState
36
71
  * @returns
37
72
  */
38
73
  export function ucIsLoading(execState) {
39
- return execState === 'submitting';
74
+ return execState === UCExecState.SUBMITTING;
40
75
  }
41
76
  /**
42
77
  * Check whether the execution corresponds to an "error" result
@@ -45,5 +80,5 @@ export function ucIsLoading(execState) {
45
80
  * @returns
46
81
  */
47
82
  export function ucIsOnErr(execRes) {
48
- return execRes === 'failed';
83
+ return execRes === UCExecRes.FAILED;
49
84
  }
@@ -1,16 +1,18 @@
1
1
  import type { DataType, TBase, UIntQuantity } from '../dt/index.js';
2
+ import type { EnumOf } from '../utils/index.js';
2
3
  import type { UCFieldKey } from './def.js';
3
4
  import type { Value } from './value.js';
4
- export declare enum UCInputFieldFillingMode {
5
+ export declare const UCInputFieldFillingMode: {
5
6
  /**
6
7
  * Set programmatically on behalf of the user (e.g. a foreign key id for a given object)
7
8
  */
8
- AUTO_PRE = "AUTO_PRE",
9
+ readonly AUTO_PRE: "AUTO_PRE";
9
10
  /**
10
11
  * Set manually by the user (e.g. a form field, a cli flag, etc.)
11
12
  */
12
- MANUAL = "MANUAL"
13
- }
13
+ readonly MANUAL: "MANUAL";
14
+ };
15
+ export type UCInputFieldFillingMode = EnumOf<typeof UCInputFieldFillingMode>;
14
16
  export interface UCInputFieldDefCardinality {
15
17
  max?: UIntQuantity;
16
18
  min?: UIntQuantity;
@@ -1,14 +1,13 @@
1
- export var UCInputFieldFillingMode;
2
- (function (UCInputFieldFillingMode) {
1
+ export const UCInputFieldFillingMode = {
3
2
  /**
4
3
  * Set programmatically on behalf of the user (e.g. a foreign key id for a given object)
5
4
  */
6
- UCInputFieldFillingMode["AUTO_PRE"] = "AUTO_PRE";
5
+ AUTO_PRE: 'AUTO_PRE',
7
6
  /**
8
7
  * Set manually by the user (e.g. a form field, a cli flag, etc.)
9
8
  */
10
- UCInputFieldFillingMode["MANUAL"] = "MANUAL";
11
- })(UCInputFieldFillingMode || (UCInputFieldFillingMode = {}));
9
+ MANUAL: 'MANUAL',
10
+ };
12
11
  export function ucifExamples(def) {
13
12
  const { type } = def;
14
13
  const examples = type.getExamples();
@@ -1,8 +1,9 @@
1
- export declare enum UCOutputSideEffectType {
1
+ import type { EnumOf } from '../utils/index.js';
2
+ export declare const UCOutputSideEffectType: {
2
3
  /**
3
4
  * Trigger a clearing of the auth on the calling system (e.g. `SignOut`).
4
5
  */
5
- CLEAR_AUTH = "CLEAR_AUTH",
6
+ readonly CLEAR_AUTH: "CLEAR_AUTH";
6
7
  /**
7
8
  * Trigger a redirect on the calling system (e.g. after the final round of an OAuth1 flow)
8
9
  *
@@ -11,18 +12,19 @@ export declare enum UCOutputSideEffectType {
11
12
  *
12
13
  * It expects a field `redirect: URL` in `output.parts._0.items[0]`.
13
14
  */
14
- REDIRECT = "REDIRECT",
15
+ readonly REDIRECT: "REDIRECT";
15
16
  /**
16
17
  * Trigger a setting of the auth on the calling system (e.g. `SignIn` / `SignUp`).
17
18
  *
18
19
  * It expects a field `jwt: JWT` in `output.parts._0.items[0]`.
19
20
  */
20
- SET_AUTH = "SET_AUTH"
21
- }
21
+ readonly SET_AUTH: "SET_AUTH";
22
+ };
23
+ export type UCOutputSideEffectType = EnumOf<typeof UCOutputSideEffectType>;
22
24
  export type UCOutputSideEffect = {
23
- type: UCOutputSideEffectType.CLEAR_AUTH;
25
+ type: typeof UCOutputSideEffectType.CLEAR_AUTH;
24
26
  } | {
25
- type: UCOutputSideEffectType.REDIRECT;
27
+ type: typeof UCOutputSideEffectType.REDIRECT;
26
28
  } | {
27
- type: UCOutputSideEffectType.SET_AUTH;
29
+ type: typeof UCOutputSideEffectType.SET_AUTH;
28
30
  };
@@ -1,9 +1,8 @@
1
- export var UCOutputSideEffectType;
2
- (function (UCOutputSideEffectType) {
1
+ export const UCOutputSideEffectType = {
3
2
  /**
4
3
  * Trigger a clearing of the auth on the calling system (e.g. `SignOut`).
5
4
  */
6
- UCOutputSideEffectType["CLEAR_AUTH"] = "CLEAR_AUTH";
5
+ CLEAR_AUTH: 'CLEAR_AUTH',
7
6
  /**
8
7
  * Trigger a redirect on the calling system (e.g. after the final round of an OAuth1 flow)
9
8
  *
@@ -12,11 +11,11 @@ export var UCOutputSideEffectType;
12
11
  *
13
12
  * It expects a field `redirect: URL` in `output.parts._0.items[0]`.
14
13
  */
15
- UCOutputSideEffectType["REDIRECT"] = "REDIRECT";
14
+ REDIRECT: 'REDIRECT',
16
15
  /**
17
16
  * Trigger a setting of the auth on the calling system (e.g. `SignIn` / `SignUp`).
18
17
  *
19
18
  * It expects a field `jwt: JWT` in `output.parts._0.items[0]`.
20
19
  */
21
- UCOutputSideEffectType["SET_AUTH"] = "SET_AUTH";
22
- })(UCOutputSideEffectType || (UCOutputSideEffectType = {}));
20
+ SET_AUTH: 'SET_AUTH',
21
+ };
@@ -66,9 +66,9 @@ let UCInputFilesProcessor = class UCInputFilesProcessor {
66
66
  await this.fsManager.touch(destPath, await file.arrayBuffer());
67
67
  }
68
68
  else {
69
- const { path } = file;
70
- await this.fsManager.cp(path, destPath);
71
- await this.fsManager.rm(path);
69
+ const { uri } = file;
70
+ await this.fsManager.cp(uri, destPath);
71
+ await this.fsManager.rm(uri);
72
72
  }
73
73
  return fileNameRef;
74
74
  }
@@ -34,7 +34,8 @@ let UCInputValidator = class UCInputValidator {
34
34
  let message = this.i18nManager.t(key, { vars: { expected } });
35
35
  if (field) {
36
36
  const { label } = this.wordingManager.ucif(field);
37
- message = `${label} ${message ? message.toLowerCase() : ''}`.trim();
37
+ message = `${message.charAt(0).toLowerCase()}${message.slice(1)}`;
38
+ message = `${label} ${message}`.trim();
38
39
  }
39
40
  throw new IllegalArgumentError(message);
40
41
  }
@@ -44,7 +44,7 @@ let UCOutputFilesProcessor = class UCOutputFilesProcessor {
44
44
  filePath = this.fsManager.path(this.s().uc_files_directory_path, fileName); // => /path/to/files/20230110143732-155eb8d3-9af5-430e-b856-248007859df1.jpg
45
45
  }
46
46
  else {
47
- filePath = fileNameRef.path;
47
+ filePath = fileNameRef.uri;
48
48
  }
49
49
  if (keepOnlyFileName) {
50
50
  const { base } = await this.fsManager.info(filePath);
@@ -1,7 +1,7 @@
1
1
  import { assertTransformedCorrectly, isFileEligible, } from '../funcs.js';
2
2
  import { transform } from '../typescript.js';
3
3
  export default function loader(source) {
4
- // @ts-expect-error -- magically made available by Webpack at execution
4
+ // @ts-expect-error : magically made available by Webpack at execution
5
5
  const fileName = this.resourcePath;
6
6
  if (!isFileEligible(fileName, ['ts'])) {
7
7
  return source;
@@ -23,4 +23,4 @@ export { humanize } from './strings/humanize.js';
23
23
  export { truncate } from './strings/truncate.js';
24
24
  export { fmtBold, fmtCommand, fmtPadEndFor, fmtSection, } from './terminal/fmt.js';
25
25
  export { assertIsDefined, isBlank, range, sample, tupleOf, } from './types/funcs.js';
26
- export type { ExtractStrict, RecursiveNonNullable, StringKeys, } from './types/utility-types.js';
26
+ export type { EnumOf, ExtractStrict, RecursiveNonNullable, StringKeys, } from './types/utility-types.js';
@@ -1,3 +1,7 @@
1
+ /**
2
+ * Get an enum-like type with the keys of the object
3
+ */
4
+ export type EnumOf<T extends object> = T[keyof T];
1
5
  /**
2
6
  * Extract a subset of a union type in a strict manner
3
7
  *
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.24.0",
4
+ "version": "0.25.0",
5
5
  "license": "LGPL-3.0",
6
6
  "author": "Chafik H'nini <chafik.hnini@gmail.com>",
7
7
  "homepage": "https://libmodulor.c100k.eu",
@@ -96,33 +96,35 @@
96
96
  "lint:ci": "biome check"
97
97
  },
98
98
  "devDependencies": {
99
- "@biomejs/biome": "^2.3.8",
99
+ "@biomejs/biome": "^2.3.10",
100
100
  "@react-native-community/slider": "^4.5.7",
101
101
  "@types/react": "^19.2.7",
102
102
  "@types/react-dom": "^19.2.3",
103
103
  "babel-plugin-parameter-decorator": "^1.0.16",
104
104
  "babel-plugin-transform-typescript-metadata": "^0.3.2",
105
- "expo": "^54.0.25",
106
- "wrangler": "^4.51.0"
105
+ "expo": "^54.0.29",
106
+ "expo-document-picker": "~14.0.8",
107
+ "expo-image-picker": "^17.0.10",
108
+ "wrangler": "^4.55.0"
107
109
  },
108
110
  "peerDependencies": {
109
- "@hono/node-server": "^1.19.6",
110
- "@modelcontextprotocol/sdk": "^1.23.0",
111
+ "@hono/node-server": "^1.19.7",
112
+ "@modelcontextprotocol/sdk": "^1.25.1",
111
113
  "@stricli/core": "^1.2.4",
112
114
  "buffer": "^6.0.3",
113
115
  "cookie-parser": "^1.4.7",
114
- "express": "^5.1.0",
116
+ "express": "^5.2.1",
115
117
  "express-fileupload": "^1.5.2",
116
- "fast-check": "^4.3.0",
118
+ "fast-check": "^4.4.0",
117
119
  "helmet": "^8.1.0",
118
- "hono": "^4.10.7",
119
- "inversify": "^7.10.4",
120
- "jose": "^6.1.2",
120
+ "hono": "^4.11.1",
121
+ "inversify": "^7.10.7",
122
+ "jose": "^6.1.3",
121
123
  "knex": "^3.1.0",
122
- "next": "^15.5.7",
124
+ "next": "^15.5.9",
123
125
  "pg": "^8.16.3",
124
- "react": "^19.2.1",
125
- "react-dom": "^19.2.1",
126
+ "react": "^19.2.3",
127
+ "react-dom": "^19.2.3",
126
128
  "react-native": "^0.81.5",
127
129
  "reflect-metadata": "^0.2.2",
128
130
  "sqlite3": "^5.1.7",