libmodulor 0.27.0 → 0.28.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 (120) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +1 -1
  3. package/dist/esm/apps/Helper/src/i18n.js +4 -4
  4. package/dist/esm/apps/Helper/src/lib/layers/project.js +6 -6
  5. package/dist/esm/apps/Helper/src/ucds/CreateAppUCD.js +5 -10
  6. package/dist/esm/apps/Helper/src/ucds/CreateProductUCD.js +5 -10
  7. package/dist/esm/apps/Helper/src/ucds/CreateTargetUCD.js +6 -11
  8. package/dist/esm/apps/Helper/src/ucds/TestAppUCD.js +5 -8
  9. package/dist/esm/dt/DataType.d.ts +2 -1
  10. package/dist/esm/dt/DataTypes.d.ts +1 -1
  11. package/dist/esm/dt/DataTypes.js +1 -0
  12. package/dist/esm/dt/final/TErrorCode.d.ts +7 -0
  13. package/dist/esm/dt/final/TErrorCode.js +9 -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/CustomError.d.ts +1 -1
  17. package/dist/esm/error/CustomError.js +2 -2
  18. package/dist/esm/error/ForbiddenAsNotFoundError.js +1 -1
  19. package/dist/esm/error/ForbiddenError.js +1 -1
  20. package/dist/esm/error/IllegalArgumentError.js +2 -2
  21. package/dist/esm/error/InternalServerError.js +1 -1
  22. package/dist/esm/error/NotFoundError.js +1 -1
  23. package/dist/esm/error/UnauthorizedError.js +1 -1
  24. package/dist/esm/error/UnavailableError.d.ts +6 -0
  25. package/dist/esm/error/UnavailableError.js +9 -0
  26. package/dist/esm/error/funcs.js +2 -0
  27. package/dist/esm/error/index.d.ts +1 -0
  28. package/dist/esm/error/index.js +1 -0
  29. package/dist/esm/i18n/locales/de.js +8 -0
  30. package/dist/esm/i18n/locales/en.js +8 -0
  31. package/dist/esm/i18n/locales/es.js +8 -0
  32. package/dist/esm/i18n/locales/fr.js +8 -0
  33. package/dist/esm/i18n/types.d.ts +1 -1
  34. package/dist/esm/products/Helper/i18n.d.ts +8 -0
  35. package/dist/esm/std/impl/SimpleHTTPAPICaller.js +1 -1
  36. package/dist/esm/target/lib/cli/CommandExecutor.js +2 -2
  37. package/dist/esm/target/lib/cli/renderer.d.ts +2 -1
  38. package/dist/esm/target/lib/cli/renderer.js +10 -11
  39. package/dist/esm/target/lib/server/AuthenticationChecker.d.ts +3 -3
  40. package/dist/esm/target/lib/server/AuthenticationChecker.js +5 -5
  41. package/dist/esm/target/node-core-cli/NodeCoreCLIManager.js +1 -1
  42. package/dist/esm/target/react-web-pure/UCForm.d.ts +1 -1
  43. package/dist/esm/target/react-web-pure/UCForm.js +3 -2
  44. package/dist/esm/testing/workers/checkers/AppI18nChecker.js +4 -2
  45. package/dist/esm/uc/data-store.d.ts +9 -1
  46. package/dist/esm/uc/data-store.js +33 -1
  47. package/dist/esm/uc/impl/CloudflareD1UCDataStore.d.ts +2 -2
  48. package/dist/esm/uc/impl/CloudflareD1UCDataStore.js +7 -0
  49. package/dist/esm/uc/impl/InMemoryUCDataStore.d.ts +8 -3
  50. package/dist/esm/uc/impl/InMemoryUCDataStore.js +19 -3
  51. package/dist/esm/uc/impl/KnexUCDataStore.d.ts +2 -2
  52. package/dist/esm/uc/impl/KnexUCDataStore.js +10 -2
  53. package/dist/esm/uc/impl/SimpleUCManager.d.ts +4 -4
  54. package/dist/esm/uc/impl/SimpleUCManager.js +10 -10
  55. package/dist/esm/uc/settings/consts.js +1 -0
  56. package/dist/esm/uc/settings.d.ts +8 -1
  57. package/dist/esm/uc/workers/UCExecChecker.d.ts +3 -3
  58. package/dist/esm/uc/workers/UCExecChecker.js +5 -5
  59. package/dist/esm/utils/index.d.ts +1 -1
  60. package/dist/esm/utils/index.js +1 -1
  61. package/dist/esm/utils/ioc/bindCommon.js +4 -4
  62. package/dist/esm/utils/ioc/bindFactory.d.ts +2 -0
  63. package/dist/esm/utils/ioc/bindFactory.js +9 -0
  64. package/package.json +20 -19
  65. package/dist/esm/apps/Helper/src/lib/app.d.ts +0 -6
  66. package/dist/esm/apps/Helper/src/lib/app.js +0 -12
  67. package/dist/esm/apps/Helper/src/lib/project.d.ts +0 -3
  68. package/dist/esm/apps/Helper/src/lib/project.js +0 -163
  69. package/dist/esm/bundlers/vite/StripUCDLifecycleServerPlugin.d.ts +0 -2
  70. package/dist/esm/bundlers/vite/StripUCDLifecycleServerPlugin.js +0 -18
  71. package/dist/esm/products/Helper/cli-node-core/container.d.ts +0 -3
  72. package/dist/esm/products/Helper/cli-node-core/container.js +0 -26
  73. package/dist/esm/products/Helper/cli-node-core/index.d.ts +0 -1
  74. package/dist/esm/products/Helper/cli-node-core/index.js +0 -9
  75. package/dist/esm/products/Helper/container.d.ts +0 -3
  76. package/dist/esm/products/Helper/container.js +0 -26
  77. package/dist/esm/products/Helper/index.d.ts +0 -1
  78. package/dist/esm/products/Helper/index.js +0 -16
  79. package/dist/esm/target/lib/react/common.d.ts +0 -6
  80. package/dist/esm/target/lib/react/common.js +0 -1
  81. package/dist/esm/target/lib/server/RequestHandler.d.ts +0 -14
  82. package/dist/esm/target/lib/server/RequestHandler.js +0 -1
  83. package/dist/esm/target/lib/server-node/stop.d.ts +0 -2
  84. package/dist/esm/target/lib/server-node/stop.js +0 -18
  85. package/dist/esm/target/node-express-server/lib/AuthCookieCreator.d.ts +0 -21
  86. package/dist/esm/target/node-express-server/lib/AuthCookieCreator.js +0 -50
  87. package/dist/esm/target/node-express-server/middlewares/AuthenticationCheckerMiddlewareBuilder.d.ts +0 -21
  88. package/dist/esm/target/node-express-server/middlewares/AuthenticationCheckerMiddlewareBuilder.js +0 -61
  89. package/dist/esm/target/node-express-server/middlewares/ErrorMiddlewareBuilder.d.ts +0 -12
  90. package/dist/esm/target/node-express-server/middlewares/ErrorMiddlewareBuilder.js +0 -35
  91. package/dist/esm/target/node-express-server/middlewares/HelmetMiddlewareBuilder.d.ts +0 -12
  92. package/dist/esm/target/node-express-server/middlewares/HelmetMiddlewareBuilder.js +0 -39
  93. package/dist/esm/target/node-express-server/middlewares/PublicApiKeyCheckerMiddlewareBuilder.d.ts +0 -18
  94. package/dist/esm/target/node-express-server/middlewares/PublicApiKeyCheckerMiddlewareBuilder.js +0 -44
  95. package/dist/esm/target/node-express-server/middlewares/RequestCheckerMiddlewareBuilder.d.ts +0 -12
  96. package/dist/esm/target/node-express-server/middlewares/RequestCheckerMiddlewareBuilder.js +0 -36
  97. package/dist/esm/target/node-express-server/middlewares/RequestHandlerMiddlewareBuilder.d.ts +0 -23
  98. package/dist/esm/target/node-express-server/middlewares/RequestHandlerMiddlewareBuilder.js +0 -154
  99. package/dist/esm/target/node-express-server/middlewares/RequestLoggerMiddlewareBuilder.d.ts +0 -13
  100. package/dist/esm/target/node-express-server/middlewares/RequestLoggerMiddlewareBuilder.js +0 -46
  101. package/dist/esm/testing/impl/SimpleAppDocsEmitter.d.ts +0 -7
  102. package/dist/esm/testing/impl/SimpleAppDocsEmitter.js +0 -180
  103. package/dist/esm/testing/impl/SimpleAppTesterConfigurator.d.ts +0 -14
  104. package/dist/esm/testing/impl/SimpleAppTesterConfigurator.js +0 -35
  105. package/dist/esm/uc/utils/stripUCDLifecycleServer.d.ts +0 -15
  106. package/dist/esm/uc/utils/stripUCDLifecycleServer.js +0 -77
  107. package/dist/esm/uc/utils/ucifcoIsForArray.d.ts +0 -8
  108. package/dist/esm/uc/utils/ucifcoIsForArray.js +0 -13
  109. package/dist/esm/utils/bundling/vite/StripUCDLifecycleServerPlugin.d.ts +0 -2
  110. package/dist/esm/utils/bundling/vite/StripUCDLifecycleServerPlugin.js +0 -18
  111. package/dist/esm/utils/http/toFormData.d.ts +0 -3
  112. package/dist/esm/utils/http/toFormData.js +0 -4
  113. package/dist/esm/utils/http/toJSON.d.ts +0 -3
  114. package/dist/esm/utils/http/toJSON.js +0 -3
  115. package/dist/esm/utils/http/toQueryParams.d.ts +0 -2
  116. package/dist/esm/utils/http/toQueryParams.js +0 -4
  117. package/dist/esm/utils/ioc/ContainerPrinter.d.ts +0 -15
  118. package/dist/esm/utils/ioc/ContainerPrinter.js +0 -58
  119. package/dist/esm/utils/ioc/bindProvider.d.ts +0 -2
  120. package/dist/esm/utils/ioc/bindProvider.js +0 -9
@@ -1,4 +1,4 @@
1
- import { type Provider } from 'inversify';
1
+ import { type Factory } from 'inversify';
2
2
  import type { AppManifest } from '../../../app/index.js';
3
3
  import type { Logger, Worker } from '../../../std/index.js';
4
4
  import { type UC, type UCAuth, type UCDef, type UCInput, type UCOPIBase, type UCPolicy } from '../../../uc/index.js';
@@ -23,8 +23,8 @@ export declare class AuthenticationChecker implements Worker<Input, Promise<Outp
23
23
  private jwtAuthenticationChecker;
24
24
  private privateApiKeyAuthenticationChecker;
25
25
  private logger;
26
- private ucPolicyProvider;
27
- constructor(basicAuthenticationChecker: BasicAuthenticationChecker, jwtAuthenticationChecker: JWTAuthenticationChecker, privateApiKeyAuthenticationChecker: PrivateApiKeyAuthenticationChecker, logger: Logger, ucPolicyProvider: Provider<UCPolicy>);
26
+ private ucPolicyFactory;
27
+ constructor(basicAuthenticationChecker: BasicAuthenticationChecker, jwtAuthenticationChecker: JWTAuthenticationChecker, privateApiKeyAuthenticationChecker: PrivateApiKeyAuthenticationChecker, logger: Logger, ucPolicyFactory: Factory<UCPolicy>);
28
28
  exec<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>({ authCookie, authorizationHeader, uc, }: Input<I, OPI0, OPI1>): Promise<Output>;
29
29
  }
30
30
  export {};
@@ -21,13 +21,13 @@ let AuthenticationChecker = class AuthenticationChecker {
21
21
  jwtAuthenticationChecker;
22
22
  privateApiKeyAuthenticationChecker;
23
23
  logger;
24
- ucPolicyProvider;
25
- constructor(basicAuthenticationChecker, jwtAuthenticationChecker, privateApiKeyAuthenticationChecker, logger, ucPolicyProvider) {
24
+ ucPolicyFactory;
25
+ constructor(basicAuthenticationChecker, jwtAuthenticationChecker, privateApiKeyAuthenticationChecker, logger, ucPolicyFactory) {
26
26
  this.basicAuthenticationChecker = basicAuthenticationChecker;
27
27
  this.jwtAuthenticationChecker = jwtAuthenticationChecker;
28
28
  this.privateApiKeyAuthenticationChecker = privateApiKeyAuthenticationChecker;
29
29
  this.logger = logger;
30
- this.ucPolicyProvider = ucPolicyProvider;
30
+ this.ucPolicyFactory = ucPolicyFactory;
31
31
  }
32
32
  async exec({ authCookie, authorizationHeader, uc, }) {
33
33
  this.logger.trace('Checking auth', {
@@ -43,7 +43,7 @@ let AuthenticationChecker = class AuthenticationChecker {
43
43
  return output;
44
44
  }
45
45
  const authType = sec?.authType ?? DEFAULT_UC_SEC_AT;
46
- const policy = (await this.ucPolicyProvider(server.policy));
46
+ const policy = (await this.ucPolicyFactory(server.policy));
47
47
  const canBeExecutedPreAuth = await policy.canBeExecutedPreAuth();
48
48
  if (canBeExecutedPreAuth) {
49
49
  const { allowed } = await policy.exec({
@@ -101,7 +101,7 @@ AuthenticationChecker = __decorate([
101
101
  __param(1, inject(JWTAuthenticationChecker)),
102
102
  __param(2, inject(PrivateApiKeyAuthenticationChecker)),
103
103
  __param(3, inject('Logger')),
104
- __param(4, inject('Provider<UCPolicy>')),
104
+ __param(4, inject('Factory<UCPolicy>')),
105
105
  __metadata("design:paramtypes", [BasicAuthenticationChecker,
106
106
  JWTAuthenticationChecker,
107
107
  PrivateApiKeyAuthenticationChecker, Object, Function])
@@ -41,7 +41,7 @@ let NodeCoreCLIManager = class NodeCoreCLIManager {
41
41
  uc.def.ext?.cmd?.mountAt ?? ucMountingPoint(uc),
42
42
  uc,
43
43
  ]));
44
- if (!command || !command.trim() || command === '--help') {
44
+ if (!command?.trim() || command === '--help') {
45
45
  showHelp(ucs, this.wordingManager);
46
46
  }
47
47
  else if (command === '--version') {
@@ -1,4 +1,4 @@
1
1
  import { type ReactElement } from 'react';
2
- import type { UCInput, UCOPIBase } from '../../uc/index.js';
2
+ import { type UCInput, type UCOPIBase } from '../../uc/index.js';
3
3
  import type { UCFormProps } from '../lib/react/form.js';
4
4
  export declare function UCForm<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>({ clearAfterExec, disabled, execState, onSubmit: onSubmitBase, uc, }: UCFormProps<I, OPI0, OPI1>): ReactElement;
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useRef } from 'react';
3
+ import { UCExecRes } from '../../uc/index.js';
3
4
  import { useStyleContext } from '../lib/react/StyleContextProvider.js';
4
5
  import { UCFormField } from './UCFormField.js';
5
6
  import { UCFormSubmitControl } from './UCFormSubmitControl.js';
@@ -8,8 +9,8 @@ export function UCForm({ clearAfterExec, disabled, execState, onSubmit: onSubmit
8
9
  const formRef = useRef(null);
9
10
  const onSubmit = async (e) => {
10
11
  e.preventDefault();
11
- const succeeded = await onSubmitBase();
12
- if (succeeded && clearAfterExec) {
12
+ const res = await onSubmitBase();
13
+ if (res === UCExecRes.SUCCEEDED && clearAfterExec) {
13
14
  formRef.current?.reset();
14
15
  }
15
16
  };
@@ -16,7 +16,7 @@ const ERR_I18N_LABEL_NO_DOT = (key) => `The i18n key '${key}' is a label, thus i
16
16
  const ERR_I18N_MISSING_TRANS = (key, lang) => `The i18n key '${key}' is missing for lang '${lang}'`;
17
17
  let AppI18nChecker = class AppI18nChecker {
18
18
  static { AppI18nChecker_1 = this; }
19
- static I18N_KEY_PATTERN = /(dt_([A-Z][A-Za-z0-9]+)_([A-Za-z0-9]+)_(desc|label))|(err_([A-Za-z_]+))|(uc_([A-Z][A-Za-z0-9]+)_(client_confirm_(cancel|confirm|message|title)|desc|label|i_submit_(changing|idle|initializing|submitting)|op_(0|1)_(empty|label)))|(ucif_([a-z]([A-Za-z0-9]+)?)_(desc|label))|(ucof_([a-z]([A-Za-z0-9]+)?)_(desc|label))|(validation_([a-z]+)_([A-Z][A-Za-z0-9]+))/;
19
+ static I18N_KEY_PATTERN = /(dt_([A-Z][A-Za-z0-9]+)_constr_format)|(dt_([A-Z][A-Za-z0-9]+)_([A-Za-z0-9]+)_(desc|label))|(err_([A-Za-z_]+))|(uc_([A-Z][A-Za-z0-9]+)_(client_confirm_(cancel|confirm|message|title)|desc|label|i_submit_(changing|idle|initializing|submitting)|op_(0|1)_(empty|label)))|(ucif_([a-z]([A-Za-z0-9]+)?)_(desc|label))|(ucof_([a-z]([A-Za-z0-9]+)?)_(desc|label))|(validation_([a-z]+)_([A-Z][A-Za-z0-9]+))/;
20
20
  output;
21
21
  constructor() {
22
22
  this.output = { errors: [] };
@@ -41,7 +41,9 @@ let AppI18nChecker = class AppI18nChecker {
41
41
  if (!matches) {
42
42
  this.output.errors.push(ERR_I18N_KEY_INVALID(key));
43
43
  }
44
- if (key.endsWith('_label') && translation.endsWith('.')) {
44
+ if (key.endsWith('_label') &&
45
+ translation.endsWith('.') &&
46
+ !translation.endsWith('...')) {
45
47
  this.output.errors.push(ERR_I18N_LABEL_NO_DOT(key));
46
48
  }
47
49
  }
@@ -1,11 +1,18 @@
1
1
  import type { AppName } from '../app/index.js';
2
2
  import type { UIntQuantity, UUID } from '../dt/index.js';
3
- import type { Clearable, Initializable, StringKeys } from '../utils/index.js';
3
+ import type { Clearable, EnumOf, Initializable, StringKeys } from '../utils/index.js';
4
4
  import type { UCData } from './data.js';
5
5
  import type { UCExecMode } from './exec.js';
6
6
  import type { UCInput } from './input.js';
7
7
  import type { UCName } from './metadata.js';
8
8
  export type UCDataStoreDatasetName = string;
9
+ export declare const UCDataStoreMode: {
10
+ readonly NONE: "NONE";
11
+ readonly READ: "READ";
12
+ readonly READ_WRITE: "READ_WRITE";
13
+ readonly WRITE: "WRITE";
14
+ };
15
+ export type UCDataStoreMode = EnumOf<typeof UCDataStoreMode>;
9
16
  interface UCDataStoreQueryOpts {
10
17
  }
11
18
  export type UCDataStoreReadFilter<T> = T | T[];
@@ -67,4 +74,5 @@ export interface UCDataStore extends Clearable, Initializable {
67
74
  writeBulk<I extends UCInput | undefined = undefined, D extends UCData | null = null>(records: UCDataStoreRecord<I, D>[], opts?: UCDataStoreWriteOpts): Promise<void>;
68
75
  writeProjection<T extends object>(name: string, data: T, opts?: UCDataStoreWriteProjectionOpts): Promise<void>;
69
76
  }
77
+ export declare function assertCan(op: 'read' | 'write', mode: UCDataStoreMode): void;
70
78
  export {};
@@ -1 +1,33 @@
1
- export {};
1
+ import { UnavailableError } from '../error/index.js';
2
+ export const UCDataStoreMode = {
3
+ NONE: 'NONE',
4
+ READ: 'READ',
5
+ READ_WRITE: 'READ_WRITE',
6
+ WRITE: 'WRITE',
7
+ };
8
+ export function assertCan(op, mode) {
9
+ switch (mode) {
10
+ case 'NONE':
11
+ if (op === 'read') {
12
+ throw new UnavailableError('err_uc_data_store_not_readable');
13
+ }
14
+ if (op === 'write') {
15
+ throw new UnavailableError('err_uc_data_store_not_writable');
16
+ }
17
+ break;
18
+ case 'READ':
19
+ if (op === 'write') {
20
+ throw new UnavailableError('err_uc_data_store_not_writable');
21
+ }
22
+ break;
23
+ case 'READ_WRITE':
24
+ break;
25
+ case 'WRITE':
26
+ if (op === 'read') {
27
+ throw new UnavailableError('err_uc_data_store_not_readable');
28
+ }
29
+ break;
30
+ default:
31
+ mode;
32
+ }
33
+ }
@@ -1,10 +1,10 @@
1
1
  import type { D1Database } from '@cloudflare/workers-types';
2
2
  import type { Configurable, SettingsManager } from '../../std/index.js';
3
3
  import type { UCData } from '../data.js';
4
- import type { UCDataStore, UCDataStoreReadOpts, UCDataStoreReadProjectionOpts, UCDataStoreReadResponse, UCDataStoreRecord, UCDataStoreTx, UCDataStoreWriteOpts, UCDataStoreWriteProjectionOpts, UCDataStoreWriteProjectionSpecificBinding } from '../data-store.js';
4
+ import { type UCDataStore, type UCDataStoreReadOpts, type UCDataStoreReadProjectionOpts, type UCDataStoreReadResponse, type UCDataStoreRecord, type UCDataStoreTx, type UCDataStoreWriteOpts, type UCDataStoreWriteProjectionOpts, type UCDataStoreWriteProjectionSpecificBinding } from '../data-store.js';
5
5
  import type { UCInput } from '../input.js';
6
6
  import type { UCSettings } from '../settings.js';
7
- type S = Pick<UCSettings, 'uc_data_store_ucs_dataset_name'>;
7
+ type S = Pick<UCSettings, 'uc_data_store_mode' | 'uc_data_store_ucs_dataset_name'>;
8
8
  export declare const ROW_COLS: (keyof UCDataStoreRecord)[];
9
9
  /**
10
10
  * @alpha This implementation is still a WIP and needs improvement
@@ -12,6 +12,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  };
13
13
  import { inject, injectable } from 'inversify';
14
14
  import { NotAvailableError, NotImplementedError } from '../../error/index.js';
15
+ import { assertCan, } from '../data-store.js';
15
16
  export const ROW_COLS = [
16
17
  'aggregateId',
17
18
  'appName',
@@ -38,6 +39,7 @@ let CloudflareD1UCDataStore = class CloudflareD1UCDataStore {
38
39
  }
39
40
  s() {
40
41
  return {
42
+ uc_data_store_mode: this.settingsManager.get()('uc_data_store_mode'),
41
43
  uc_data_store_ucs_dataset_name: this.settingsManager.get()('uc_data_store_ucs_dataset_name'),
42
44
  };
43
45
  }
@@ -92,6 +94,7 @@ CREATE INDEX IF NOT EXISTS uc_executions_user_id_index ON uc_executions (userId)
92
94
  }
93
95
  async read(opts) {
94
96
  this.assertClient();
97
+ assertCan('read', this.s().uc_data_store_mode);
95
98
  // TODO : Consider using a query builder (or Google's pipe operator ?) when it gets too complicated or dangerous
96
99
  const query = [
97
100
  `select * from ${this.s().uc_data_store_ucs_dataset_name}`,
@@ -131,6 +134,7 @@ CREATE INDEX IF NOT EXISTS uc_executions_user_id_index ON uc_executions (userId)
131
134
  };
132
135
  }
133
136
  async readProjection(_name, _opts) {
137
+ assertCan('read', this.s().uc_data_store_mode);
134
138
  throw new NotImplementedError('readProjection');
135
139
  }
136
140
  async startTx() {
@@ -144,6 +148,7 @@ CREATE INDEX IF NOT EXISTS uc_executions_user_id_index ON uc_executions (userId)
144
148
  }
145
149
  async write(record, _opts) {
146
150
  this.assertClient();
151
+ assertCan('write', this.s().uc_data_store_mode);
147
152
  const cols = ROW_COLS.join(', ');
148
153
  const placeholders = ROW_COLS.map(() => '?').join(', ');
149
154
  // Use variables only for variables declared here => never for data coming from outside this method !
@@ -166,9 +171,11 @@ CREATE INDEX IF NOT EXISTS uc_executions_user_id_index ON uc_executions (userId)
166
171
  .run();
167
172
  }
168
173
  async writeBulk(_records, _opts) {
174
+ assertCan('write', this.s().uc_data_store_mode);
169
175
  throw new NotImplementedError('writeBulk');
170
176
  }
171
177
  async writeProjection(_name, _data, _opts) {
178
+ assertCan('write', this.s().uc_data_store_mode);
172
179
  throw new NotImplementedError('writeProjection');
173
180
  }
174
181
  setClient(client) {
@@ -1,11 +1,16 @@
1
+ import type { Configurable, SettingsManager } from '../../std/index.js';
1
2
  import type { UCData } from '../data.js';
2
- import type { UCDataStore, UCDataStoreReadOpts, UCDataStoreReadResponse, UCDataStoreRecord, UCDataStoreTx, UCDataStoreWriteProjectionSpecificBinding } from '../data-store.js';
3
+ import { type UCDataStore, type UCDataStoreReadOpts, type UCDataStoreReadResponse, type UCDataStoreRecord, type UCDataStoreTx, type UCDataStoreWriteProjectionSpecificBinding } from '../data-store.js';
3
4
  import type { UCInput } from '../input.js';
5
+ import type { UCSettings } from '../settings.js';
4
6
  type TxState = 'committed' | 'pending' | 'rollbacked';
5
- export declare class InMemoryUCDataStore implements UCDataStore {
7
+ type S = Pick<UCSettings, 'uc_data_store_mode'>;
8
+ export declare class InMemoryUCDataStore implements Configurable<S>, UCDataStore {
9
+ protected settingsManager: SettingsManager<S>;
6
10
  entries: UCDataStoreRecord<any, any>[];
7
11
  tx: TxState | undefined;
8
- constructor();
12
+ constructor(settingsManager: SettingsManager<S>);
13
+ s(): S;
9
14
  clear(): Promise<void>;
10
15
  destroy(): Promise<void>;
11
16
  exists(): Promise<boolean>;
@@ -7,8 +7,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
- import { injectable } from 'inversify';
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { inject, injectable } from 'inversify';
11
14
  import { NotImplementedError } from '../../error/index.js';
15
+ import { assertCan, } from '../data-store.js';
12
16
  function predicate(key, filter) {
13
17
  if (filter === null) {
14
18
  return (r) => r[key] === null;
@@ -19,12 +23,19 @@ function predicate(key, filter) {
19
23
  return (r) => r[key] === filter;
20
24
  }
21
25
  let InMemoryUCDataStore = class InMemoryUCDataStore {
26
+ settingsManager;
22
27
  // biome-ignore lint/suspicious/noExplicitAny: can be anything
23
28
  entries;
24
29
  tx;
25
- constructor() {
30
+ constructor(settingsManager) {
31
+ this.settingsManager = settingsManager;
26
32
  this.entries = [];
27
33
  }
34
+ s() {
35
+ return {
36
+ uc_data_store_mode: this.settingsManager.get()('uc_data_store_mode'),
37
+ };
38
+ }
28
39
  async clear() {
29
40
  this.entries = [];
30
41
  }
@@ -41,6 +52,7 @@ let InMemoryUCDataStore = class InMemoryUCDataStore {
41
52
  // Nothing to do
42
53
  }
43
54
  async read(opts) {
55
+ assertCan('read', this.s().uc_data_store_mode);
44
56
  let items = this
45
57
  .entries;
46
58
  // Filter
@@ -70,6 +82,7 @@ let InMemoryUCDataStore = class InMemoryUCDataStore {
70
82
  };
71
83
  }
72
84
  async readProjection() {
85
+ assertCan('read', this.s().uc_data_store_mode);
73
86
  return [];
74
87
  }
75
88
  async startTx() {
@@ -94,14 +107,17 @@ let InMemoryUCDataStore = class InMemoryUCDataStore {
94
107
  this.writeBulk([record]);
95
108
  }
96
109
  async writeBulk(records) {
110
+ assertCan('write', this.s().uc_data_store_mode);
97
111
  this.entries.push(...records);
98
112
  }
99
113
  async writeProjection() {
114
+ assertCan('write', this.s().uc_data_store_mode);
100
115
  throw new NotImplementedError('writeProjection');
101
116
  }
102
117
  };
103
118
  InMemoryUCDataStore = __decorate([
104
119
  injectable(),
105
- __metadata("design:paramtypes", [])
120
+ __param(0, inject('SettingsManager')),
121
+ __metadata("design:paramtypes", [Object])
106
122
  ], InMemoryUCDataStore);
107
123
  export { InMemoryUCDataStore };
@@ -2,7 +2,7 @@ import { type Knex } from 'knex';
2
2
  import type { FilePath, UIntQuantity } from '../../dt/index.js';
3
3
  import type { Configurable, Settings, SettingsManager } from '../../std/index.js';
4
4
  import type { UCData } from '../data.js';
5
- import type { UCDataStore, UCDataStoreReadOpts, UCDataStoreReadProjectionOpts, UCDataStoreReadResponse, UCDataStoreRecord, UCDataStoreTx, UCDataStoreWriteOpts, UCDataStoreWriteProjectionOpts, UCDataStoreWriteProjectionSpecificBinding } from '../data-store.js';
5
+ import { type UCDataStore, type UCDataStoreReadOpts, type UCDataStoreReadProjectionOpts, type UCDataStoreReadResponse, type UCDataStoreRecord, type UCDataStoreTx, type UCDataStoreWriteOpts, type UCDataStoreWriteProjectionOpts, type UCDataStoreWriteProjectionSpecificBinding } from '../data-store.js';
6
6
  import type { UCInput } from '../input.js';
7
7
  import type { UCSettings } from '../settings.js';
8
8
  /**
@@ -16,7 +16,7 @@ export interface KnexUCDataStoreSettings extends Settings {
16
16
  knex_uc_data_store_pool_min: UIntQuantity;
17
17
  knex_uc_data_store_type: 'pg' | 'sqlite3';
18
18
  }
19
- type S = KnexUCDataStoreSettings & Pick<UCSettings, 'uc_data_store_ucs_dataset_name'>;
19
+ type S = KnexUCDataStoreSettings & Pick<UCSettings, 'uc_data_store_mode' | 'uc_data_store_ucs_dataset_name'>;
20
20
  export declare class KnexUCDataStore implements Configurable<S>, UCDataStore {
21
21
  protected settingsManager: SettingsManager<S>;
22
22
  protected config: Knex.Config;
@@ -13,6 +13,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
13
13
  import { inject, injectable } from 'inversify';
14
14
  import knex, {} from 'knex';
15
15
  import { NotAvailableError, NotCallableError } from '../../error/index.js';
16
+ import { assertCan, } from '../data-store.js';
16
17
  const FILTERS_MAPPING = new Map([
17
18
  ['aggregateId', 'aggregate_id'],
18
19
  ['appName', 'app_name'],
@@ -37,6 +38,7 @@ let KnexUCDataStore = class KnexUCDataStore {
37
38
  knex_uc_data_store_pool_max: this.settingsManager.get()('knex_uc_data_store_pool_max'),
38
39
  knex_uc_data_store_pool_min: this.settingsManager.get()('knex_uc_data_store_pool_min'),
39
40
  knex_uc_data_store_type: this.settingsManager.get()('knex_uc_data_store_type'),
41
+ uc_data_store_mode: this.settingsManager.get()('uc_data_store_mode'),
40
42
  uc_data_store_ucs_dataset_name: this.settingsManager.get()('uc_data_store_ucs_dataset_name'),
41
43
  };
42
44
  }
@@ -58,6 +60,7 @@ let KnexUCDataStore = class KnexUCDataStore {
58
60
  throw new NotCallableError('initSync', 'init', 'async-only');
59
61
  }
60
62
  async read(opts) {
63
+ assertCan('read', this.s().uc_data_store_mode);
61
64
  const query = this.client(this.s().uc_data_store_ucs_dataset_name);
62
65
  // Filter
63
66
  if (opts?.filters) {
@@ -87,6 +90,7 @@ let KnexUCDataStore = class KnexUCDataStore {
87
90
  };
88
91
  }
89
92
  async readProjection(name, opts) {
93
+ assertCan('read', this.s().uc_data_store_mode);
90
94
  const query = this.client(name);
91
95
  // Sort
92
96
  if (opts?.orderBy) {
@@ -123,6 +127,7 @@ let KnexUCDataStore = class KnexUCDataStore {
123
127
  await this.writeBulk([record], opts);
124
128
  }
125
129
  async writeBulk(records, opts) {
130
+ assertCan('write', this.s().uc_data_store_mode);
126
131
  const query = this.client(this.s().uc_data_store_ucs_dataset_name).insert(records.map((r) => this.mapRecordToRow(r)));
127
132
  if (opts?.tx) {
128
133
  query.transacting(opts.tx.ref);
@@ -130,6 +135,7 @@ let KnexUCDataStore = class KnexUCDataStore {
130
135
  await query;
131
136
  }
132
137
  async writeProjection(name, data, opts) {
138
+ assertCan('write', this.s().uc_data_store_mode);
133
139
  const dataToInsert = {};
134
140
  for (const [k, v] of Object.entries(data)) {
135
141
  const specificBinding = opts?.specificBindings?.[k];
@@ -183,8 +189,10 @@ let KnexUCDataStore = class KnexUCDataStore {
183
189
  return;
184
190
  }
185
191
  Array.isArray(value)
186
- ? query.whereIn(col, value)
187
- : query.where(col, value);
192
+ ? // @ts-expect-error : https://github.com/knex/knex/pull/6428
193
+ query.whereIn(col, value)
194
+ : // @ts-expect-error : https://github.com/knex/knex/pull/6428
195
+ query.where(col, value);
188
196
  }
189
197
  mapRecordToRow(record) {
190
198
  return {
@@ -1,4 +1,4 @@
1
- import { type Provider } from 'inversify';
1
+ import { type Factory } from 'inversify';
2
2
  import type { ClockManager, CryptoManager, Logger } from '../../std/index.js';
3
3
  import type { UCClientConfirmManager } from '../client.js';
4
4
  import type { UCData } from '../data.js';
@@ -23,10 +23,10 @@ export declare class SimpleUCManager implements UCManager {
23
23
  private ucExecChecker;
24
24
  private ucInputFilesProcessor;
25
25
  private ucInputValidator;
26
- private ucInitProvider;
27
- private ucMainProvider;
26
+ private ucInitFactory;
27
+ private ucMainFactory;
28
28
  private tx?;
29
- constructor(ucClientConfirmManager: UCClientConfirmManager, clockManager: ClockManager, cryptoManager: CryptoManager, logger: Logger, ucDataStore: UCDataStore, ucExecChecker: UCExecChecker, ucInputFilesProcessor: UCInputFilesProcessor, ucInputValidator: UCInputValidator, ucInitProvider: Provider<UCInit>, ucMainProvider: Provider<UCMain>);
29
+ constructor(ucClientConfirmManager: UCClientConfirmManager, clockManager: ClockManager, cryptoManager: CryptoManager, logger: Logger, ucDataStore: UCDataStore, ucExecChecker: UCExecChecker, ucInputFilesProcessor: UCInputFilesProcessor, ucInputValidator: UCInputValidator, ucInitFactory: Factory<UCInit>, ucMainFactory: Factory<UCMain>);
30
30
  commitTx(): Promise<void>;
31
31
  confirmClient<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(uc: UC<I, OPI0, OPI1>): Promise<boolean>;
32
32
  execClient<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(uc: UC<I, OPI0, OPI1>, opts?: UCManagerExecClientOpts<I, OPI0, OPI1>): Promise<UCOutputReader<I, OPI0, OPI1>>;
@@ -27,11 +27,11 @@ let SimpleUCManager = class SimpleUCManager {
27
27
  ucExecChecker;
28
28
  ucInputFilesProcessor;
29
29
  ucInputValidator;
30
- ucInitProvider;
31
- ucMainProvider;
30
+ ucInitFactory;
31
+ ucMainFactory;
32
32
  // WARNING : This property makes this class "thread unsafe". Be careful how you inject it into your components.
33
33
  tx;
34
- constructor(ucClientConfirmManager, clockManager, cryptoManager, logger, ucDataStore, ucExecChecker, ucInputFilesProcessor, ucInputValidator, ucInitProvider, ucMainProvider) {
34
+ constructor(ucClientConfirmManager, clockManager, cryptoManager, logger, ucDataStore, ucExecChecker, ucInputFilesProcessor, ucInputValidator, ucInitFactory, ucMainFactory) {
35
35
  this.ucClientConfirmManager = ucClientConfirmManager;
36
36
  this.clockManager = clockManager;
37
37
  this.cryptoManager = cryptoManager;
@@ -40,8 +40,8 @@ let SimpleUCManager = class SimpleUCManager {
40
40
  this.ucExecChecker = ucExecChecker;
41
41
  this.ucInputFilesProcessor = ucInputFilesProcessor;
42
42
  this.ucInputValidator = ucInputValidator;
43
- this.ucInitProvider = ucInitProvider;
44
- this.ucMainProvider = ucMainProvider;
43
+ this.ucInitFactory = ucInitFactory;
44
+ this.ucMainFactory = ucMainFactory;
45
45
  this.tx = undefined;
46
46
  }
47
47
  async commitTx() {
@@ -80,7 +80,7 @@ let SimpleUCManager = class SimpleUCManager {
80
80
  if (server === undefined) {
81
81
  await this.ucInputFilesProcessor.exec({ uc });
82
82
  }
83
- const main = (await this.ucMainProvider(client.main));
83
+ const main = (await this.ucMainFactory(client.main));
84
84
  const streamOpts = opts?.stream;
85
85
  const output = await main.exec({
86
86
  opts: {
@@ -113,7 +113,7 @@ let SimpleUCManager = class SimpleUCManager {
113
113
  }
114
114
  this.ucInputValidator.exec({ uc });
115
115
  await this.ucInputFilesProcessor.exec({ uc });
116
- const main = (await this.ucMainProvider(server.main));
116
+ const main = (await this.ucMainFactory(server.main));
117
117
  const output = main.exec({
118
118
  opts: {
119
119
  stream: opts?.stream,
@@ -132,7 +132,7 @@ let SimpleUCManager = class SimpleUCManager {
132
132
  return;
133
133
  }
134
134
  this.logger.info('Initializing ucd', { name: metadata.name });
135
- const init = (await this.ucInitProvider(server.init));
135
+ const init = (await this.ucInitFactory(server.init));
136
136
  await init.exec();
137
137
  }
138
138
  async startTx() {
@@ -179,8 +179,8 @@ SimpleUCManager = __decorate([
179
179
  __param(5, inject(UCExecChecker)),
180
180
  __param(6, inject(UCInputFilesProcessor)),
181
181
  __param(7, inject(UCInputValidator)),
182
- __param(8, inject('Provider<UCInit>')),
183
- __param(9, inject('Provider<UCMain>')),
182
+ __param(8, inject('Factory<UCInit>')),
183
+ __param(9, inject('Factory<UCMain>')),
184
184
  __metadata("design:paramtypes", [Object, Object, Object, Object, Object, UCExecChecker,
185
185
  UCInputFilesProcessor,
186
186
  UCInputValidator, Function, Function])
@@ -1,4 +1,5 @@
1
1
  export const UC_DEFAULT_SETTINGS = {
2
+ uc_data_store_mode: 'READ_WRITE',
2
3
  uc_data_store_ucs_dataset_name: 'uc_executions',
3
4
  uc_disabled_use_cases: [],
4
5
  uc_file_ref_prefix: '$ref:',
@@ -1,9 +1,15 @@
1
1
  import type { FilePath } from '../dt/index.js';
2
2
  import type { Settings } from '../std/index.js';
3
- import type { UCDataStoreDatasetName } from './data-store.js';
3
+ import type { UCDataStoreDatasetName, UCDataStoreMode } from './data-store.js';
4
4
  import type { UCFileInputFieldRefPrefix } from './file.js';
5
5
  import type { UCName } from './metadata.js';
6
6
  export interface UCSettings extends Settings {
7
+ /**
8
+ * The mode of the data store.
9
+ *
10
+ * @default UC_DEFAULT_SETTINGS.uc_data_store_mode
11
+ */
12
+ uc_data_store_mode: UCDataStoreMode;
7
13
  /**
8
14
  * The name of the collection/table storing the persisted use cases in the data store
9
15
  *
@@ -22,6 +28,7 @@ export interface UCSettings extends Settings {
22
28
  uc_disabled_use_cases: UCName[];
23
29
  /**
24
30
  * The prefix of the file path when the use case has been processed, before storing
31
+ *
25
32
  * @default UC_DEFAULT_SETTINGS.uc_file_ref_prefix
26
33
  */
27
34
  uc_file_ref_prefix: UCFileInputFieldRefPrefix;
@@ -1,4 +1,4 @@
1
- import { type Provider } from 'inversify';
1
+ import { type Factory } from 'inversify';
2
2
  import type { ProductManifest } from '../../product/index.js';
3
3
  import type { Configurable, SettingsManager, Worker } from '../../std/index.js';
4
4
  import type { UCDefLifecycle } from '../def.js';
@@ -16,8 +16,8 @@ type S = Pick<UCSettings, 'uc_disabled_use_cases'>;
16
16
  export declare class UCExecChecker implements Configurable<S>, Worker<Input, Promise<Output>> {
17
17
  private productManifest;
18
18
  private settingsManager;
19
- private ucPolicyProvider;
20
- constructor(productManifest: ProductManifest, settingsManager: SettingsManager<S>, ucPolicyProvider: Provider<UCPolicy>);
19
+ private ucPolicyFactory;
20
+ constructor(productManifest: ProductManifest, settingsManager: SettingsManager<S>, ucPolicyFactory: Factory<UCPolicy>);
21
21
  s(): S;
22
22
  exec<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>({ lifecycle, uc }: Input<I, OPI0, OPI1>): Promise<Output>;
23
23
  }
@@ -14,11 +14,11 @@ import { inject, injectable } from 'inversify';
14
14
  let UCExecChecker = class UCExecChecker {
15
15
  productManifest;
16
16
  settingsManager;
17
- ucPolicyProvider;
18
- constructor(productManifest, settingsManager, ucPolicyProvider) {
17
+ ucPolicyFactory;
18
+ constructor(productManifest, settingsManager, ucPolicyFactory) {
19
19
  this.productManifest = productManifest;
20
20
  this.settingsManager = settingsManager;
21
- this.ucPolicyProvider = ucPolicyProvider;
21
+ this.ucPolicyFactory = ucPolicyFactory;
22
22
  }
23
23
  s() {
24
24
  return {
@@ -47,7 +47,7 @@ let UCExecChecker = class UCExecChecker {
47
47
  const ucds = app.ucds?.exclude ?? [];
48
48
  output.allowed = !ucds.includes(metadata.name);
49
49
  if (output.allowed) {
50
- const policy = (await this.ucPolicyProvider(client.policy));
50
+ const policy = (await this.ucPolicyFactory(client.policy));
51
51
  const { allowed } = await policy.exec({ uc });
52
52
  output.allowed = allowed;
53
53
  }
@@ -68,7 +68,7 @@ UCExecChecker = __decorate([
68
68
  injectable(),
69
69
  __param(0, inject('ProductManifest')),
70
70
  __param(1, inject('SettingsManager')),
71
- __param(2, inject('Provider<UCPolicy>')),
71
+ __param(2, inject('Factory<UCPolicy>')),
72
72
  __metadata("design:paramtypes", [Object, Object, Function])
73
73
  ], UCExecChecker);
74
74
  export { UCExecChecker };
@@ -12,7 +12,7 @@ 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
14
  export type { HTTPDataEnvelope, HTTPReqData } from './http/types.js';
15
- export { bindProvider } from './ioc/bindProvider.js';
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';
18
18
  export { fmt as fmtNumber } from './numbers/fmt.js';
@@ -7,7 +7,7 @@ export { fromQueryParams, toQueryParams } from './http/query-params.js';
7
7
  export { SSEStreamManager } from './http/SSEStreamManager.js';
8
8
  export { fmtSingleDataMsg, fmtSSEError, isSSEError, parseDataLine, SSE_HEADERS, } from './http/sse.js';
9
9
  export { isClientError, isError, isServerError } from './http/status.js';
10
- export { bindProvider } from './ioc/bindProvider.js';
10
+ export { bindFactory } from './ioc/bindFactory.js';
11
11
  export { CONTAINER_OPTS } from './ioc/container.js';
12
12
  export { fmt as fmtNumber } from './numbers/fmt.js';
13
13
  export { baseFromSquareUnit, isSquareUnit, } from './numbers/units.js';
@@ -16,7 +16,7 @@ import { InMemoryUCDataStore } from '../../uc/impl/InMemoryUCDataStore.js';
16
16
  import { SimpleUCManager } from '../../uc/impl/SimpleUCManager.js';
17
17
  import { StaticUCClientConfirmManager } from '../../uc/impl/StaticUCClientConfirmManager.js';
18
18
  import { UC_DEFAULT_SETTINGS, } from '../../uc/index.js';
19
- import { bindProvider } from './bindProvider.js';
19
+ import { bindFactory } from './bindFactory.js';
20
20
  export function bindCommon(container) {
21
21
  // settings
22
22
  container.bind('Settings').toConstantValue({
@@ -55,9 +55,9 @@ export function bindCommon(container) {
55
55
  .to(SettingsServerClientManager);
56
56
  container.bind('XMLManager').to(NoopXMLManager);
57
57
  // uc
58
- bindProvider(container, 'UCInit');
59
- bindProvider(container, 'UCMain');
60
- bindProvider(container, 'UCPolicy');
58
+ bindFactory(container, 'UCInit');
59
+ bindFactory(container, 'UCMain');
60
+ bindFactory(container, 'UCPolicy');
61
61
  container
62
62
  .bind('UCClientConfirmManager')
63
63
  .to(StaticUCClientConfirmManager);
@@ -0,0 +1,2 @@
1
+ import type { Container } from 'inversify';
2
+ export declare function bindFactory<T>(container: Container, identifier: string): void;
@@ -0,0 +1,9 @@
1
+ export function bindFactory(container, identifier) {
2
+ container
3
+ .bind(`Factory<${identifier}>`)
4
+ .toFactory((context) => {
5
+ return async (clazz) => {
6
+ return context.get(clazz);
7
+ };
8
+ });
9
+ }