libmodulor 0.25.0 → 0.27.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 (123) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +32 -151
  3. package/dist/esm/app/workers/AppUCsLoader.d.ts +2 -3
  4. package/dist/esm/apps/Helper/src/i18n.d.ts +39 -2
  5. package/dist/esm/apps/Helper/src/i18n.js +15 -1
  6. package/dist/esm/apps/Helper/src/lib/SrcFilesGenerator.d.ts +13 -0
  7. package/dist/esm/apps/Helper/src/lib/SrcFilesGenerator.js +37 -0
  8. package/dist/esm/apps/Helper/src/lib/consts.d.ts +2 -0
  9. package/dist/esm/apps/Helper/src/lib/consts.js +2 -0
  10. package/dist/esm/apps/Helper/src/lib/funcs.d.ts +4 -0
  11. package/dist/esm/apps/Helper/src/lib/funcs.js +9 -0
  12. package/dist/esm/apps/Helper/src/lib/io.d.ts +10 -0
  13. package/dist/esm/apps/Helper/src/lib/io.js +22 -0
  14. package/dist/esm/apps/Helper/src/lib/layers/app.d.ts +3 -0
  15. package/dist/esm/apps/Helper/src/lib/layers/app.js +30 -0
  16. package/dist/esm/apps/Helper/src/lib/layers/product.d.ts +3 -0
  17. package/dist/esm/apps/Helper/src/lib/layers/product.js +27 -0
  18. package/dist/esm/apps/Helper/src/lib/layers/project.d.ts +4 -0
  19. package/dist/esm/apps/Helper/src/lib/layers/project.js +163 -0
  20. package/dist/esm/apps/Helper/src/lib/layers/target.d.ts +3 -0
  21. package/dist/esm/apps/Helper/src/lib/layers/target.js +202 -0
  22. package/dist/esm/apps/Helper/src/lib/layers/uc.d.ts +3 -0
  23. package/dist/esm/apps/Helper/src/lib/layers/uc.js +113 -0
  24. package/dist/esm/apps/Helper/src/lib/project.js +15 -17
  25. package/dist/esm/apps/Helper/src/lib/types.d.ts +3 -0
  26. package/dist/esm/apps/Helper/src/lib/types.js +1 -0
  27. package/dist/esm/apps/Helper/src/manifest.d.ts +20 -0
  28. package/dist/esm/apps/Helper/src/manifest.js +20 -0
  29. package/dist/esm/apps/Helper/src/ucds/CreateAppUCD.d.ts +7 -0
  30. package/dist/esm/apps/Helper/src/ucds/CreateAppUCD.js +101 -0
  31. package/dist/esm/apps/Helper/src/ucds/CreateProductUCD.d.ts +7 -0
  32. package/dist/esm/apps/Helper/src/ucds/CreateProductUCD.js +101 -0
  33. package/dist/esm/apps/Helper/src/ucds/CreateProjectUCD.d.ts +1 -17
  34. package/dist/esm/apps/Helper/src/ucds/CreateProjectUCD.js +40 -34
  35. package/dist/esm/apps/Helper/src/ucds/CreateTargetUCD.d.ts +9 -0
  36. package/dist/esm/apps/Helper/src/ucds/CreateTargetUCD.js +109 -0
  37. package/dist/esm/apps/Helper/src/ucds/CreateUCUCD.d.ts +8 -0
  38. package/dist/esm/apps/Helper/src/ucds/CreateUCUCD.js +87 -0
  39. package/dist/esm/apps/Helper/src/ucds/DeleteGeneratedAppsTestsUCD.d.ts +1 -1
  40. package/dist/esm/apps/Helper/src/ucds/DeleteGeneratedAppsTestsUCD.js +1 -1
  41. package/dist/esm/apps/Helper/src/ucds/GenerateAppsTestsUCD.d.ts +1 -1
  42. package/dist/esm/apps/Helper/src/ucds/GenerateAppsTestsUCD.js +1 -1
  43. package/dist/esm/apps/Helper/src/ucds/TestAppUCD.d.ts +1 -1
  44. package/dist/esm/apps/Helper/src/ucds/TestAppUCD.js +1 -1
  45. package/dist/esm/convention.d.ts +16 -5
  46. package/dist/esm/convention.js +34 -10
  47. package/dist/esm/error/funcs.d.ts +2 -0
  48. package/dist/esm/error/funcs.js +20 -0
  49. package/dist/esm/error/index.d.ts +1 -1
  50. package/dist/esm/error/index.js +1 -1
  51. package/dist/esm/index.d.ts +2 -0
  52. package/dist/esm/index.js +2 -0
  53. package/dist/esm/index.node-test.d.ts +1 -1
  54. package/dist/esm/index.node-test.js +1 -1
  55. package/dist/esm/product/index.d.ts +1 -1
  56. package/dist/esm/product/index.js +1 -1
  57. package/dist/esm/product/workers/ProductUCsLoader.d.ts +8 -6
  58. package/dist/esm/product/workers/ProductUCsLoader.js +19 -5
  59. package/dist/esm/products/Helper/cli-node-core/container.d.ts +3 -0
  60. package/dist/esm/products/Helper/cli-node-core/container.js +26 -0
  61. package/dist/esm/products/Helper/cli-node-core/index.d.ts +1 -0
  62. package/dist/esm/products/Helper/cli-node-core/index.js +9 -0
  63. package/dist/esm/products/Helper/i18n.d.ts +101 -2
  64. package/dist/esm/products/Helper/targets/node-core-cli/container.d.ts +3 -0
  65. package/dist/esm/products/Helper/targets/node-core-cli/container.js +26 -0
  66. package/dist/esm/products/Helper/targets/node-core-cli/index.d.ts +1 -0
  67. package/dist/esm/products/Helper/targets/node-core-cli/index.js +9 -0
  68. package/dist/esm/std/SettingsManager.d.ts +3 -16
  69. package/dist/esm/std/SettingsManager.js +1 -16
  70. package/dist/esm/std/ShellCommandExecutor.d.ts +1 -1
  71. package/dist/esm/std/consts.js +4 -4
  72. package/dist/esm/std/impl/EnvSettingsManager.d.ts +5 -4
  73. package/dist/esm/std/impl/EnvSettingsManager.js +40 -62
  74. package/dist/esm/std/impl/FakeFSManager.d.ts +3 -1
  75. package/dist/esm/std/impl/FakeFSManager.js +3 -0
  76. package/dist/esm/std/impl/FakeShellCommandExecutor.d.ts +12 -0
  77. package/dist/esm/std/impl/FakeShellCommandExecutor.js +30 -0
  78. package/dist/esm/std/impl/StaticSettingsManager.d.ts +1 -1
  79. package/dist/esm/std/impl/StaticSettingsManager.js +3 -0
  80. package/dist/esm/std/index.d.ts +1 -0
  81. package/dist/esm/std/index.js +1 -0
  82. package/dist/esm/std/lib/settings.d.ts +5 -0
  83. package/dist/esm/std/lib/settings.js +39 -0
  84. package/dist/esm/target/edge-worker-hono-server/SyncEdgeWorkerHonoServerManager.d.ts +3 -1
  85. package/dist/esm/target/edge-worker-hono-server/SyncEdgeWorkerHonoServerManager.js +12 -7
  86. package/dist/esm/target/index.d.ts +1 -0
  87. package/dist/esm/target/index.js +1 -0
  88. package/dist/esm/target/lib/cli/CLIManager.d.ts +2 -2
  89. package/dist/esm/target/lib/client/consts.js +2 -1
  90. package/dist/esm/target/lib/entrypoint.d.ts +2 -0
  91. package/dist/esm/target/lib/entrypoint.js +1 -0
  92. package/dist/esm/target/lib/manifest.d.ts +13 -0
  93. package/dist/esm/target/lib/manifest.js +11 -0
  94. package/dist/esm/target/lib/mcp-server/MCPServerBooter.d.ts +2 -2
  95. package/dist/esm/target/lib/server/CustomerFacingErrorBuilder.js +6 -1
  96. package/dist/esm/target/lib/server/ServerBooter.d.ts +2 -2
  97. package/dist/esm/target/lib/server/ServerRequestHandler.js +6 -2
  98. package/dist/esm/target/lib/server/consts.js +2 -1
  99. package/dist/esm/target/lib/server-express/funcs.d.ts +2 -0
  100. package/dist/esm/target/lib/server-express/funcs.js +6 -0
  101. package/dist/esm/target/lib/server-hono/funcs.d.ts +2 -1
  102. package/dist/esm/target/lib/server-hono/funcs.js +7 -3
  103. package/dist/esm/target/node-express-server/NodeExpressServerManager.d.ts +3 -1
  104. package/dist/esm/target/node-express-server/NodeExpressServerManager.js +17 -12
  105. package/dist/esm/target/node-hono-server/NodeHonoServerManager.d.ts +3 -1
  106. package/dist/esm/target/node-hono-server/NodeHonoServerManager.js +15 -10
  107. package/dist/esm/target/node-stricli-cli/NodeStricliCLIManager.d.ts +3 -1
  108. package/dist/esm/target/node-stricli-cli/NodeStricliCLIManager.js +9 -5
  109. package/dist/esm/testing/impl/NodeAppTesterConfigurator.d.ts +15 -0
  110. package/dist/esm/testing/impl/NodeAppTesterConfigurator.js +68 -0
  111. package/dist/esm/testing/impl/VitestAppTestSuiteEmitter.d.ts +2 -0
  112. package/dist/esm/testing/impl/VitestAppTestSuiteEmitter.js +27 -10
  113. package/dist/esm/testing/impl/newNodeAppTester.js +3 -4
  114. package/dist/esm/testing/opts.d.ts +1 -1
  115. package/dist/esm/utils/ioc/bindCommon.d.ts +4 -4
  116. package/dist/esm/utils/ioc/bindCommon.js +17 -15
  117. package/dist/esm/utils/ioc/bindNodeCore.js +5 -0
  118. package/dist/esm/utils/ioc/bindServer.js +8 -2
  119. package/package.json +19 -18
  120. package/pnpm-workspace.yaml +0 -8
  121. package/tsconfig.build.examples.json +0 -8
  122. package/tsconfig.json +0 -36
  123. package/vitest.config.ts +0 -16
@@ -15,13 +15,15 @@ import https from 'node:https';
15
15
  import express, {} from 'express';
16
16
  import { inject, injectable } from 'inversify';
17
17
  import { NotCallableError } from '../../error/index.js';
18
+ import { CustomerFacingErrorBuilder } from '../lib/server/CustomerFacingErrorBuilder.js';
18
19
  import { EntrypointsBuilder } from '../lib/server/EntrypointsBuilder.js';
19
20
  import { ServerRequestHandler } from '../lib/server/ServerRequestHandler.js';
20
21
  import { ServerSSLCertLoader } from '../lib/server/ServerSSLCertLoader.js';
21
- import { buildHandler, init, mountHandler, } from '../lib/server-express/funcs.js';
22
+ import { buildHandler, init, mountHandler, postInit, } from '../lib/server-express/funcs.js';
22
23
  import { HelmetMiddlewareBuilder } from '../lib/server-express/HelmetMiddlewareBuilder.js';
23
24
  import { listen, stop } from '../lib/server-node/funcs.js';
24
25
  let NodeExpressServerManager = class NodeExpressServerManager {
26
+ customerFacingErrorBuilder;
25
27
  entrypointsBuilder;
26
28
  environmentManager;
27
29
  helmetMB;
@@ -32,7 +34,8 @@ let NodeExpressServerManager = class NodeExpressServerManager {
32
34
  ucManager;
33
35
  runtime;
34
36
  server;
35
- constructor(entrypointsBuilder, environmentManager, helmetMB, logger, serverRequestHandler, serverSSLCertLoader, settingsManager, ucManager) {
37
+ constructor(customerFacingErrorBuilder, entrypointsBuilder, environmentManager, helmetMB, logger, serverRequestHandler, serverSSLCertLoader, settingsManager, ucManager) {
38
+ this.customerFacingErrorBuilder = customerFacingErrorBuilder;
36
39
  this.entrypointsBuilder = entrypointsBuilder;
37
40
  this.environmentManager = environmentManager;
38
41
  this.helmetMB = helmetMB;
@@ -83,7 +86,7 @@ let NodeExpressServerManager = class NodeExpressServerManager {
83
86
  await stop(this.server, this.settingsManager);
84
87
  }
85
88
  async warmUp() {
86
- // Nothing to do
89
+ postInit(this.runtime, this.customerFacingErrorBuilder);
87
90
  }
88
91
  async createServer() {
89
92
  const port = this.s().server_binding_port;
@@ -102,15 +105,17 @@ let NodeExpressServerManager = class NodeExpressServerManager {
102
105
  };
103
106
  NodeExpressServerManager = __decorate([
104
107
  injectable(),
105
- __param(0, inject(EntrypointsBuilder)),
106
- __param(1, inject('EnvironmentManager')),
107
- __param(2, inject(HelmetMiddlewareBuilder)),
108
- __param(3, inject('Logger')),
109
- __param(4, inject(ServerRequestHandler)),
110
- __param(5, inject(ServerSSLCertLoader)),
111
- __param(6, inject('SettingsManager')),
112
- __param(7, inject('UCManager')),
113
- __metadata("design:paramtypes", [EntrypointsBuilder, Object, HelmetMiddlewareBuilder, Object, ServerRequestHandler,
108
+ __param(0, inject(CustomerFacingErrorBuilder)),
109
+ __param(1, inject(EntrypointsBuilder)),
110
+ __param(2, inject('EnvironmentManager')),
111
+ __param(3, inject(HelmetMiddlewareBuilder)),
112
+ __param(4, inject('Logger')),
113
+ __param(5, inject(ServerRequestHandler)),
114
+ __param(6, inject(ServerSSLCertLoader)),
115
+ __param(7, inject('SettingsManager')),
116
+ __param(8, inject('UCManager')),
117
+ __metadata("design:paramtypes", [CustomerFacingErrorBuilder,
118
+ EntrypointsBuilder, Object, HelmetMiddlewareBuilder, Object, ServerRequestHandler,
114
119
  ServerSSLCertLoader, Object, Object])
115
120
  ], NodeExpressServerManager);
116
121
  export { NodeExpressServerManager };
@@ -3,6 +3,7 @@ import type { AppManifest } from '../../app/index.js';
3
3
  import type { DirPath } 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 { CustomerFacingErrorBuilder } from '../lib/server/CustomerFacingErrorBuilder.js';
6
7
  import { EntrypointsBuilder } from '../lib/server/EntrypointsBuilder.js';
7
8
  import type { ServerManager } from '../lib/server/ServerManager.js';
8
9
  import { ServerRequestHandler } from '../lib/server/ServerRequestHandler.js';
@@ -10,6 +11,7 @@ import { ServerSSLCertLoader } from '../lib/server/ServerSSLCertLoader.js';
10
11
  import type { ListenSettings, StopSettings } from '../lib/server-node/types.js';
11
12
  type S = ListenSettings & StopSettings;
12
13
  export declare class NodeHonoServerManager implements Configurable<S>, ServerManager {
14
+ private customerFacingErrorBuilder;
13
15
  private entrypointsBuilder;
14
16
  protected environmentManager: EnvironmentManager;
15
17
  private logger;
@@ -19,7 +21,7 @@ export declare class NodeHonoServerManager implements Configurable<S>, ServerMan
19
21
  private ucManager;
20
22
  protected runtime: Hono;
21
23
  private server;
22
- constructor(entrypointsBuilder: EntrypointsBuilder, environmentManager: EnvironmentManager, logger: Logger, serverRequestHandler: ServerRequestHandler, serverSSLCertLoader: ServerSSLCertLoader, settingsManager: SettingsManager<S>, ucManager: UCManager);
24
+ constructor(customerFacingErrorBuilder: CustomerFacingErrorBuilder, entrypointsBuilder: EntrypointsBuilder, environmentManager: EnvironmentManager, logger: Logger, serverRequestHandler: ServerRequestHandler, serverSSLCertLoader: ServerSSLCertLoader, settingsManager: SettingsManager<S>, ucManager: UCManager);
23
25
  s(): S;
24
26
  getRuntime(): Hono;
25
27
  overrideUCManager(ucManager: UCManager): void;
@@ -16,12 +16,14 @@ import { createAdaptorServer } from '@hono/node-server';
16
16
  import { serveStatic } from '@hono/node-server/serve-static';
17
17
  import { inject, injectable } from 'inversify';
18
18
  import { NotCallableError } from '../../error/index.js';
19
+ import { CustomerFacingErrorBuilder } from '../lib/server/CustomerFacingErrorBuilder.js';
19
20
  import { EntrypointsBuilder } from '../lib/server/EntrypointsBuilder.js';
20
21
  import { ServerRequestHandler } from '../lib/server/ServerRequestHandler.js';
21
22
  import { ServerSSLCertLoader } from '../lib/server/ServerSSLCertLoader.js';
22
23
  import { buildHandler, init, mountHandler } from '../lib/server-hono/funcs.js';
23
24
  import { listen, stop } from '../lib/server-node/funcs.js';
24
25
  let NodeHonoServerManager = class NodeHonoServerManager {
26
+ customerFacingErrorBuilder;
25
27
  entrypointsBuilder;
26
28
  environmentManager;
27
29
  logger;
@@ -31,7 +33,8 @@ let NodeHonoServerManager = class NodeHonoServerManager {
31
33
  ucManager;
32
34
  runtime;
33
35
  server;
34
- constructor(entrypointsBuilder, environmentManager, logger, serverRequestHandler, serverSSLCertLoader, settingsManager, ucManager) {
36
+ constructor(customerFacingErrorBuilder, entrypointsBuilder, environmentManager, logger, serverRequestHandler, serverSSLCertLoader, settingsManager, ucManager) {
37
+ this.customerFacingErrorBuilder = customerFacingErrorBuilder;
35
38
  this.entrypointsBuilder = entrypointsBuilder;
36
39
  this.environmentManager = environmentManager;
37
40
  this.logger = logger;
@@ -57,7 +60,7 @@ let NodeHonoServerManager = class NodeHonoServerManager {
57
60
  this.ucManager = ucManager;
58
61
  }
59
62
  async init() {
60
- this.runtime = init();
63
+ this.runtime = init(this.customerFacingErrorBuilder);
61
64
  await this.createServer();
62
65
  }
63
66
  initSync() {
@@ -106,14 +109,16 @@ let NodeHonoServerManager = class NodeHonoServerManager {
106
109
  };
107
110
  NodeHonoServerManager = __decorate([
108
111
  injectable(),
109
- __param(0, inject(EntrypointsBuilder)),
110
- __param(1, inject('EnvironmentManager')),
111
- __param(2, inject('Logger')),
112
- __param(3, inject(ServerRequestHandler)),
113
- __param(4, inject(ServerSSLCertLoader)),
114
- __param(5, inject('SettingsManager')),
115
- __param(6, inject('UCManager')),
116
- __metadata("design:paramtypes", [EntrypointsBuilder, Object, Object, ServerRequestHandler,
112
+ __param(0, inject(CustomerFacingErrorBuilder)),
113
+ __param(1, inject(EntrypointsBuilder)),
114
+ __param(2, inject('EnvironmentManager')),
115
+ __param(3, inject('Logger')),
116
+ __param(4, inject(ServerRequestHandler)),
117
+ __param(5, inject(ServerSSLCertLoader)),
118
+ __param(6, inject('SettingsManager')),
119
+ __param(7, inject('UCManager')),
120
+ __metadata("design:paramtypes", [CustomerFacingErrorBuilder,
121
+ EntrypointsBuilder, Object, Object, ServerRequestHandler,
117
122
  ServerSSLCertLoader, Object, Object])
118
123
  ], NodeHonoServerManager);
119
124
  export { NodeHonoServerManager };
@@ -1,12 +1,14 @@
1
1
  import { WordingManager } from '../../i18n/index.js';
2
2
  import { type ProductManifest, ProductUCsLoader } from '../../product/index.js';
3
+ import type { I18nManager } from '../../std/index.js';
3
4
  import type { CLIManager, Input, Output } from '../lib/cli/CLIManager.js';
4
5
  import { CommandExecutor } from '../lib/cli/CommandExecutor.js';
5
6
  export declare class NodeStricliCLIManager implements CLIManager {
6
7
  private commandExecutor;
8
+ private i18nManager;
7
9
  private productManifest;
8
10
  private productUCsLoader;
9
11
  private wordingManager;
10
- constructor(commandExecutor: CommandExecutor, productManifest: ProductManifest, productUCsLoader: ProductUCsLoader, wordingManager: WordingManager);
12
+ constructor(commandExecutor: CommandExecutor, i18nManager: I18nManager, productManifest: ProductManifest, productUCsLoader: ProductUCsLoader, wordingManager: WordingManager);
11
13
  handleCommand({ appsRootPath, srcImporter, }: Input): Promise<Output>;
12
14
  }
@@ -18,16 +18,19 @@ import { ucifHint, ucifIsMandatory, ucifRepeatability, ucMountingPoint, } from '
18
18
  import { CommandExecutor } from '../lib/cli/CommandExecutor.js';
19
19
  let NodeStricliCLIManager = class NodeStricliCLIManager {
20
20
  commandExecutor;
21
+ i18nManager;
21
22
  productManifest;
22
23
  productUCsLoader;
23
24
  wordingManager;
24
- constructor(commandExecutor, productManifest, productUCsLoader, wordingManager) {
25
+ constructor(commandExecutor, i18nManager, productManifest, productUCsLoader, wordingManager) {
25
26
  this.commandExecutor = commandExecutor;
27
+ this.i18nManager = i18nManager;
26
28
  this.productManifest = productManifest;
27
29
  this.productUCsLoader = productUCsLoader;
28
30
  this.wordingManager = wordingManager;
29
31
  }
30
32
  async handleCommand({ appsRootPath, srcImporter, }) {
33
+ await this.i18nManager.init();
31
34
  const ucs = await this.productUCsLoader.exec({
32
35
  appsRootPath,
33
36
  srcImporter,
@@ -109,10 +112,11 @@ let NodeStricliCLIManager = class NodeStricliCLIManager {
109
112
  NodeStricliCLIManager = __decorate([
110
113
  injectable(),
111
114
  __param(0, inject(CommandExecutor)),
112
- __param(1, inject('ProductManifest')),
113
- __param(2, inject(ProductUCsLoader)),
114
- __param(3, inject(WordingManager)),
115
- __metadata("design:paramtypes", [CommandExecutor, Object, ProductUCsLoader,
115
+ __param(1, inject('I18nManager')),
116
+ __param(2, inject('ProductManifest')),
117
+ __param(3, inject(ProductUCsLoader)),
118
+ __param(4, inject(WordingManager)),
119
+ __metadata("design:paramtypes", [CommandExecutor, Object, Object, ProductUCsLoader,
116
120
  WordingManager])
117
121
  ], NodeStricliCLIManager);
118
122
  export { NodeStricliCLIManager };
@@ -0,0 +1,15 @@
1
+ import type { AppTesterConfigurator, AppTesterConfiguratorAuthSettersConfig, AppTesterConfiguratorInputFillers, AppTesterConfiguratorSideEffects, AppTesterConfiguratorSpecificAssertions } from '../AppTesterConfigurator.js';
2
+ import type { AppTesterCtx } from '../ctx.js';
3
+ import type { AppTesterFlow } from '../flow.js';
4
+ export declare class NodeAppTesterConfigurator implements AppTesterConfigurator {
5
+ authSettersConfig(): Promise<AppTesterConfiguratorAuthSettersConfig | undefined>;
6
+ bindImplementations(ctx: AppTesterCtx): Promise<void>;
7
+ clearExecution(ctx: AppTesterCtx): Promise<void>;
8
+ flows(): Promise<AppTesterFlow[]>;
9
+ inputFillers(): Promise<AppTesterConfiguratorInputFillers | undefined>;
10
+ opts(): Promise<AppTesterCtx['opts']>;
11
+ seed(_ctx: AppTesterCtx): Promise<void>;
12
+ sideEffects(_ctx: AppTesterCtx): Promise<AppTesterConfiguratorSideEffects | undefined>;
13
+ specificAssertions(): Promise<AppTesterConfiguratorSpecificAssertions | undefined>;
14
+ updateSettings<S>(ctx: AppTesterCtx, settings: S): Promise<void>;
15
+ }
@@ -0,0 +1,68 @@
1
+ import { PRODUCT_NAME_PLACEHOLDER } from '../../convention.js';
2
+ import { FakeClockManager } from '../../std/impl/FakeClockManager.js';
3
+ import { FakeFSManager } from '../../std/impl/FakeFSManager.js';
4
+ import { FakeHTTPAPICallExecutor } from '../../std/impl/FakeHTTPAPICallExecutor.js';
5
+ import { NodeDeterministicCryptoManager } from '../../std/impl/NodeDeterministicCryptoManager.js';
6
+ import { SimpleFormDataBuilder } from '../../std/impl/SimpleFormDataBuilder.js';
7
+ import { bindCommon } from '../../utils/ioc/bindCommon.js';
8
+ import { bindNodeCore } from '../../utils/ioc/bindNodeCore.js';
9
+ import { bindServer } from '../../utils/ioc/bindServer.js';
10
+ export class NodeAppTesterConfigurator {
11
+ async authSettersConfig() {
12
+ return undefined;
13
+ }
14
+ async bindImplementations(ctx) {
15
+ const { container } = ctx;
16
+ bindCommon(container);
17
+ bindNodeCore(container);
18
+ bindServer(container);
19
+ (await container.rebind('ProductManifest')).toConstantValue({
20
+ appReg: [{ name: ctx.appManifest.name }],
21
+ name: PRODUCT_NAME_PLACEHOLDER,
22
+ });
23
+ (await container.rebind('ClockManager')).to(FakeClockManager);
24
+ (await container.rebind('CryptoManager'))
25
+ .to(NodeDeterministicCryptoManager)
26
+ .inSingletonScope();
27
+ (await container.rebind('FSManager'))
28
+ .to(FakeFSManager)
29
+ .inSingletonScope();
30
+ (await container.rebind('FormDataBuilder')).to(SimpleFormDataBuilder);
31
+ (await container.rebind('HTTPAPICallExecutor'))
32
+ .to(FakeHTTPAPICallExecutor)
33
+ .inSingletonScope();
34
+ }
35
+ async clearExecution(ctx) {
36
+ const { container } = ctx;
37
+ await container.get('CryptoManager').clear();
38
+ await container.get('EmailManager').clear();
39
+ await container.get('JobManager').clear();
40
+ await container.get('UCDataStore').clear();
41
+ }
42
+ async flows() {
43
+ return [];
44
+ }
45
+ async inputFillers() {
46
+ return undefined;
47
+ }
48
+ async opts() {
49
+ return undefined;
50
+ }
51
+ async seed(_ctx) {
52
+ // Nothing to do
53
+ }
54
+ async sideEffects(_ctx) {
55
+ return undefined;
56
+ }
57
+ async specificAssertions() {
58
+ return undefined;
59
+ }
60
+ async updateSettings(ctx, settings) {
61
+ const { container } = ctx;
62
+ const current = container.get('Settings');
63
+ (await container.rebind('Settings')).toConstantValue({
64
+ ...current,
65
+ ...settings,
66
+ });
67
+ }
68
+ }
@@ -4,4 +4,6 @@ export declare class VitestAppTestSuiteEmitter implements AppTestSuiteEmitter {
4
4
  private fsManager;
5
5
  constructor(fsManager: FSManager);
6
6
  exec({ appPath, depsMapping, idx, monkeyTestingTimeoutInMs, serverPortRangeStart, }: Input): Promise<Output>;
7
+ private createConfiguratorIfNotExists;
8
+ private mapDeps;
7
9
  }
@@ -11,7 +11,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
11
  return function (target, key) { decorator(target, key, paramIndex); }
12
12
  };
13
13
  import { inject, injectable } from 'inversify';
14
- import { APP_I18N_NAME, APP_INDEX_NAME, APP_MANIFEST_NAME, APP_TEST_DIR_NAME, APP_TEST_MAIN_FILE_NAME, } from '../../convention.js';
14
+ import { APP_I18N_NAME, APP_INDEX_NAME, APP_MANIFEST_NAME, APP_TEST_CONFIGURATOR_FILE_NAME, APP_TEST_CONFIGURATOR_NAME, APP_TEST_DIR_NAME, APP_TEST_MAIN_FILE_NAME, } from '../../convention.js';
15
15
  let VitestAppTestSuiteEmitter = class VitestAppTestSuiteEmitter {
16
16
  fsManager;
17
17
  constructor(fsManager) {
@@ -21,16 +21,29 @@ let VitestAppTestSuiteEmitter = class VitestAppTestSuiteEmitter {
21
21
  const testPath = this.fsManager.path(appPath, APP_TEST_DIR_NAME);
22
22
  // Since we're using 'recursive: true', there will be no error if the directory already exists
23
23
  await this.fsManager.mkdir(testPath, { recursive: true });
24
- const outPath = this.fsManager.path(testPath, APP_TEST_MAIN_FILE_NAME);
25
- let tpl = template(serverPortRangeStart, idx, monkeyTestingTimeoutInMs);
26
- depsMapping?.forEach((to, from) => {
27
- tpl = tpl.replaceAll(`from '${from}'`, `from '${to}'`);
28
- });
29
- await this.fsManager.touch(outPath, tpl);
24
+ await this.createConfiguratorIfNotExists(testPath, depsMapping);
25
+ const testFilePath = this.fsManager.path(testPath, APP_TEST_MAIN_FILE_NAME);
26
+ const tpl = this.mapDeps(depsMapping, template(serverPortRangeStart, idx, monkeyTestingTimeoutInMs));
27
+ await this.fsManager.touch(testFilePath, tpl);
30
28
  return {
31
- outPath,
29
+ outPath: testFilePath,
32
30
  };
33
31
  }
32
+ async createConfiguratorIfNotExists(testPath, depsMapping) {
33
+ const filePath = this.fsManager.path(testPath, APP_TEST_CONFIGURATOR_FILE_NAME);
34
+ if (await this.fsManager.exists(filePath)) {
35
+ return;
36
+ }
37
+ const tpl = this.mapDeps(depsMapping, CONFIGURATOR_TS);
38
+ await this.fsManager.touch(filePath, tpl);
39
+ }
40
+ mapDeps(depsMapping, tpl) {
41
+ let res = tpl;
42
+ depsMapping?.forEach((to, from) => {
43
+ res = res.replaceAll(`from '${from}'`, `from '${to}'`);
44
+ });
45
+ return res;
46
+ }
34
47
  };
35
48
  VitestAppTestSuiteEmitter = __decorate([
36
49
  injectable(),
@@ -38,6 +51,10 @@ VitestAppTestSuiteEmitter = __decorate([
38
51
  __metadata("design:paramtypes", [Object])
39
52
  ], VitestAppTestSuiteEmitter);
40
53
  export { VitestAppTestSuiteEmitter };
54
+ const CONFIGURATOR_TS = `import { NodeAppTesterConfigurator } from 'libmodulor/node-test';
55
+
56
+ export class ${APP_TEST_CONFIGURATOR_NAME} extends NodeAppTesterConfigurator {}
57
+ `;
41
58
  // For now, we can have it here. When it becomes harder to maintain, we can introduce some kind of template engine.
42
59
  // Be aware that this will introduce complexities on building the lib.
43
60
  // We'll need to include these templates in the build and make them accessible via package.json "exports" or any other mechanism.
@@ -72,10 +89,10 @@ import {
72
89
  import { newNodeAppTester } from 'libmodulor/node-test';
73
90
  import { afterAll, afterEach, beforeAll, describe, expect, test } from 'vitest';
74
91
 
75
- import { Configurator } from './Configurator.js';
92
+ import { ${APP_TEST_CONFIGURATOR_NAME} } from './${APP_TEST_CONFIGURATOR_NAME}.js';
76
93
 
77
94
  const appPath = join(import.meta.dirname, '..');
78
- const configurator = new Configurator();
95
+ const configurator = new ${APP_TEST_CONFIGURATOR_NAME}();
79
96
  const runner = await newNodeAppTester(${serverPortRangeStart}, ${idx}, {
80
97
  appPath,
81
98
  configurator,
@@ -5,7 +5,7 @@ import { TARGET_DEFAULT_SERVER_MANAGER_SETTINGS } from '../../target/lib/server/
5
5
  import { NodeExpressServerManager } from '../../target/node-express-server/NodeExpressServerManager.js';
6
6
  import { FAKE_USER_ADMIN, FAKE_USER_REGULAR } from '../../uc/index.js';
7
7
  import { CONTAINER_OPTS } from '../../utils/index.js';
8
- import { bindCommon } from '../../utils/ioc/bindCommon.js';
8
+ import { bindCommon, updateSettings } from '../../utils/ioc/bindCommon.js';
9
9
  import { bindNodeCore } from '../../utils/ioc/bindNodeCore.js';
10
10
  import { bindServer } from '../../utils/ioc/bindServer.js';
11
11
  import { AppTester } from '../AppTester.js';
@@ -18,8 +18,6 @@ export async function newNodeAppTester(serverPortRangeStart, idx, args) {
18
18
  const settings = {
19
19
  ...STD_DEFAULT_JWT_MANAGER_SETTINGS,
20
20
  ...TARGET_DEFAULT_SERVER_MANAGER_SETTINGS,
21
- jwt_manager_audience: 'libmodulor-test',
22
- jwt_manager_issuer: 'libmodulor-test',
23
21
  jwt_manager_secret: new TPassword().example(),
24
22
  logger_level,
25
23
  server_basic_auth_entries: {
@@ -31,7 +29,8 @@ export async function newNodeAppTester(serverPortRangeStart, idx, args) {
31
29
  server_stop_mode: 'aggressive',
32
30
  };
33
31
  const container = new Container(CONTAINER_OPTS);
34
- bindCommon(container, () => settings);
32
+ bindCommon(container);
33
+ updateSettings(container, settings);
35
34
  bindNodeCore(container);
36
35
  bindServer(container);
37
36
  container.bind('AppDocsEmitter').to(SimpleAppDocsEmitter);
@@ -43,7 +43,7 @@ export type AppTesterOpts = Partial<Pick<LoggerSettings, 'logger_level'>> & {
43
43
  */
44
44
  aliasPrefix?: AppTesterOptsAliasPrefix;
45
45
  /**
46
- * @defaultValue ['fik-sdk', 'inversify']
46
+ * @defaultValue ['libmodulor', 'inversify']
47
47
  */
48
48
  allowed?: AppTesterOptsImportsList;
49
49
  };
@@ -1,6 +1,6 @@
1
1
  import type { Container } from 'inversify';
2
- import { type LoggerSettings, type Settings } from '../../std/index.js';
2
+ import { type LoggerSettings } from '../../std/index.js';
3
3
  import { type UCSettings } from '../../uc/index.js';
4
- export type CommonSettings = LoggerSettings & UCSettings;
5
- export type SettingsFunc<S extends Settings> = (commonSettings: CommonSettings) => S & Partial<CommonSettings>;
6
- export declare function bindCommon<S extends Settings = object>(container: Container, settingsFunc?: SettingsFunc<S>): void;
4
+ export type S = LoggerSettings & UCSettings;
5
+ export declare function bindCommon(container: Container): void;
6
+ export declare function updateSettings<SOverride>(container: Container, settings: Partial<S & SOverride>): void;
@@ -17,22 +17,17 @@ 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
19
  import { bindProvider } from './bindProvider.js';
20
- export function bindCommon(container, settingsFunc) {
21
- const commonSettings = {
20
+ export function bindCommon(container) {
21
+ // settings
22
+ container.bind('Settings').toConstantValue({
22
23
  ...STD_DEFAULT_LOGGER_SETTINGS,
23
24
  ...UC_DEFAULT_SETTINGS,
24
- };
25
- const settings = {
26
- ...commonSettings,
27
- ...settingsFunc?.(commonSettings),
28
- };
25
+ });
29
26
  // product
30
- if (!container.isBound('ProductManifest')) {
31
- container.bind('ProductManifest').toConstantValue({
32
- appReg: [{ name: APP_NAME_PLACEHOLDER }],
33
- name: PRODUCT_NAME_PLACEHOLDER,
34
- });
35
- }
27
+ container.bind('ProductManifest').toConstantValue({
28
+ appReg: [{ name: APP_NAME_PLACEHOLDER }],
29
+ name: PRODUCT_NAME_PLACEHOLDER,
30
+ });
36
31
  // std
37
32
  container.bind('ClockManager').to(StdDateClockManager);
38
33
  container
@@ -51,10 +46,10 @@ export function bindCommon(container, settingsFunc) {
51
46
  .inSingletonScope();
52
47
  container.bind('I18n').toConstantValue({ en: {} });
53
48
  container.bind('Logger').to(ConsoleLogger);
54
- container.bind('Settings').toConstantValue(settings);
55
49
  container
56
50
  .bind('SettingsManager')
57
- .to(StaticSettingsManager);
51
+ .to(StaticSettingsManager)
52
+ .inSingletonScope();
58
53
  container
59
54
  .bind('ServerClientManager')
60
55
  .to(SettingsServerClientManager);
@@ -73,3 +68,10 @@ export function bindCommon(container, settingsFunc) {
73
68
  container.bind('UCManager').to(SimpleUCManager).inRequestScope();
74
69
  container.bind('UCTransporter').to(HTTPUCTransporter);
75
70
  }
71
+ export function updateSettings(container, settings) {
72
+ const current = container.get('Settings');
73
+ container.rebindSync('Settings').toConstantValue({
74
+ ...current,
75
+ ...settings,
76
+ });
77
+ }
@@ -1,3 +1,4 @@
1
+ import { EnvSettingsManager } from '../../std/impl/EnvSettingsManager.js';
1
2
  import { NodeBufferManager } from '../../std/impl/NodeBufferManager.js';
2
3
  import { NodeCryptoManager } from '../../std/impl/NodeCryptoManager.js';
3
4
  import { NodeEnvironmentManager } from '../../std/impl/NodeEnvironmentManager.js';
@@ -14,4 +15,8 @@ export function bindNodeCore(container) {
14
15
  container
15
16
  .rebindSync('FormDataBuilder')
16
17
  .to(NodeFormDataBuilder);
18
+ container
19
+ .rebindSync('SettingsManager')
20
+ .to(EnvSettingsManager)
21
+ .inSingletonScope();
17
22
  }
@@ -3,7 +3,13 @@ import { FakeJobManager } from '../../std/impl/FakeJobManager.js';
3
3
  import { JoseJWTManager } from '../../std/impl/JoseJWTManager.js';
4
4
  export function bindServer(container) {
5
5
  // std
6
- container.bind('EmailManager').to(FakeEmailManager);
6
+ container
7
+ .bind('EmailManager')
8
+ .to(FakeEmailManager)
9
+ .inSingletonScope();
7
10
  container.bind('JWTManager').to(JoseJWTManager);
8
- container.bind('JobManager').to(FakeJobManager);
11
+ container
12
+ .bind('JobManager')
13
+ .to(FakeJobManager)
14
+ .inSingletonScope();
9
15
  }
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.25.0",
4
+ "version": "0.27.0",
5
5
  "license": "LGPL-3.0",
6
6
  "author": "Chafik H'nini <chafik.hnini@gmail.com>",
7
7
  "homepage": "https://libmodulor.c100k.eu",
@@ -90,42 +90,43 @@
90
90
  "import": "./dist/esm/index.webpack.js"
91
91
  }
92
92
  },
93
- "bin": "./dist/esm/products/Helper/index.js",
93
+ "bin": "./dist/esm/products/Helper/targets/node-core-cli/index.js",
94
94
  "scripts": {
95
95
  "lint": "biome check --write .",
96
- "lint:ci": "biome check"
96
+ "lint:ci": "biome check",
97
+ "test": "tsc && vitest run"
97
98
  },
98
99
  "devDependencies": {
99
- "@biomejs/biome": "^2.3.10",
100
+ "@biomejs/biome": "^2.3.14",
100
101
  "@react-native-community/slider": "^4.5.7",
101
- "@types/react": "^19.2.7",
102
+ "@types/react": "^19.2.11",
102
103
  "@types/react-dom": "^19.2.3",
103
104
  "babel-plugin-parameter-decorator": "^1.0.16",
104
105
  "babel-plugin-transform-typescript-metadata": "^0.3.2",
105
- "expo": "^54.0.29",
106
+ "expo": "55.0.0-preview.9",
106
107
  "expo-document-picker": "~14.0.8",
107
108
  "expo-image-picker": "^17.0.10",
108
- "wrangler": "^4.55.0"
109
+ "wrangler": "^4.62.0"
109
110
  },
110
111
  "peerDependencies": {
111
- "@hono/node-server": "^1.19.7",
112
- "@modelcontextprotocol/sdk": "^1.25.1",
113
- "@stricli/core": "^1.2.4",
112
+ "@hono/node-server": "^1.19.9",
113
+ "@modelcontextprotocol/sdk": "^1.25.3",
114
+ "@stricli/core": "^1.2.5",
114
115
  "buffer": "^6.0.3",
115
116
  "cookie-parser": "^1.4.7",
116
117
  "express": "^5.2.1",
117
118
  "express-fileupload": "^1.5.2",
118
- "fast-check": "^4.4.0",
119
+ "fast-check": "^4.5.3",
119
120
  "helmet": "^8.1.0",
120
- "hono": "^4.11.1",
121
- "inversify": "^7.10.7",
121
+ "hono": "^4.11.7",
122
+ "inversify": "^7.11.0",
122
123
  "jose": "^6.1.3",
123
124
  "knex": "^3.1.0",
124
- "next": "^15.5.9",
125
- "pg": "^8.16.3",
126
- "react": "^19.2.3",
127
- "react-dom": "^19.2.3",
128
- "react-native": "^0.81.5",
125
+ "next": "^15.5.12",
126
+ "pg": "^8.18.0",
127
+ "react": "^19.2.4",
128
+ "react-dom": "^19.2.4",
129
+ "react-native": "^0.83.1",
129
130
  "reflect-metadata": "^0.2.2",
130
131
  "sqlite3": "^5.1.7",
131
132
  "typescript": "^5.9.3",
@@ -1,8 +0,0 @@
1
- minimumReleaseAge: 2880
2
- onlyBuiltDependencies:
3
- - '@biomejs/biome'
4
- - '@tailwindcss/oxide'
5
- - esbuild
6
- - sharp
7
- - sqlite3
8
- - workerd
@@ -1,8 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "noEmit": false,
4
- "outDir": "dist-examples"
5
- },
6
- "extends": "./tsconfig.json",
7
- "include": ["examples"]
8
- }
package/tsconfig.json DELETED
@@ -1,36 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "allowJs": true,
4
- "allowSyntheticDefaultImports": true,
5
- "allowUnreachableCode": false,
6
- "allowUnusedLabels": false,
7
- "declaration": true,
8
- "emitDecoratorMetadata": true,
9
- "exactOptionalPropertyTypes": true,
10
- "experimentalDecorators": true,
11
- "jsx": "react-jsx",
12
- "lib": ["dom", "dom.iterable", "esnext"],
13
- "module": "NodeNext",
14
- "moduleResolution": "NodeNext",
15
- "noEmit": true,
16
- "noFallthroughCasesInSwitch": true,
17
- "noImplicitOverride": true,
18
- "noImplicitReturns": true,
19
- "noPropertyAccessFromIndexSignature": true,
20
- "noUncheckedIndexedAccess": true,
21
- "noUnusedLocals": true,
22
- "noUnusedParameters": true,
23
- "skipLibCheck": true,
24
- "sourceMap": true,
25
- "strict": true,
26
- "target": "ESNext",
27
- "verbatimModuleSyntax": true
28
- },
29
- "exclude": [
30
- "dist",
31
- "dist-examples",
32
- "examples/**/dist",
33
- "examples/**/node_modules",
34
- "node_modules"
35
- ]
36
- }
package/vitest.config.ts DELETED
@@ -1,16 +0,0 @@
1
- import { loadEnv } from 'vite';
2
- import { defineConfig } from 'vitest/config';
3
-
4
- export default defineConfig(({ mode }) => ({
5
- test: {
6
- coverage: {
7
- exclude: ['src/apps/**/test', 'src/**/*.test.ts'],
8
- include: ['src'],
9
- reporter: ['html', 'lcov', 'text'],
10
- reportOnFailure: false,
11
- },
12
- env: loadEnv(mode, process.cwd(), ''),
13
- exclude: ['**/node_modules/**', '**/dist/**', '**/dist-examples/**'],
14
- reporters: ['verbose'],
15
- },
16
- }));