libmodulor 0.25.0 → 0.26.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 +15 -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 +15 -4
  46. package/dist/esm/convention.js +33 -9
  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 +9 -8
  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,6 +15,7 @@ export * from './JobManager.js';
15
15
  export * from './JWTManager.js';
16
16
  export * from './LLMManager.js';
17
17
  export * from './Logger.js';
18
+ export * from './lib/settings.js';
18
19
  export * from './PromptManager.js';
19
20
  export * from './SettingsManager.js';
20
21
  export * from './ShellCommandExecutor.js';
@@ -0,0 +1,5 @@
1
+ import type { StringKeys } from '../../utils/index.js';
2
+ import type { Settings } from '../SettingsManager.js';
3
+ export declare function unsafeDefaultSetting(suffix?: string): string;
4
+ export declare function assertSettingNotUnsafe<S extends Settings, K extends StringKeys<S> = StringKeys<S>>(key: K, value: unknown): void;
5
+ export declare function checkSettings<S extends Settings>(settings: S, throwIfViolations: boolean): void;
@@ -0,0 +1,39 @@
1
+ const UNSAFE_SETTING = 'UNSAFE_CHANGE_ME';
2
+ export function unsafeDefaultSetting(suffix = '') {
3
+ return `${UNSAFE_SETTING}${suffix}`;
4
+ }
5
+ export function assertSettingNotUnsafe(key, value) {
6
+ if (typeof value === 'string' && value.startsWith(UNSAFE_SETTING)) {
7
+ throw new Error(`"${key}" still has the unsafe default value. Please change it !`);
8
+ }
9
+ if (Array.isArray(value)) {
10
+ for (const v of value) {
11
+ assertSettingNotUnsafe(key, v);
12
+ }
13
+ }
14
+ if (typeof value === 'object' && value !== null) {
15
+ for (const [_k, v] of Object.entries(value)) {
16
+ assertSettingNotUnsafe(key, v);
17
+ }
18
+ }
19
+ }
20
+ export function checkSettings(settings, throwIfViolations) {
21
+ const violations = [];
22
+ for (const [k, v] of Object.entries(settings)) {
23
+ try {
24
+ assertSettingNotUnsafe(k, v);
25
+ }
26
+ catch (err) {
27
+ violations.push(err.message);
28
+ }
29
+ }
30
+ if (violations.length > 0) {
31
+ // 1m : bold ; 33m : yellow/orange ; 0m : reset
32
+ const message = `\x1b[1m\x1b[33m[WARNING] THE SETTINGS ARE NOT SAFE (THIS WILL THROW IN PROD) :\n${violations.join('\n')}\x1b[0m`;
33
+ if (throwIfViolations) {
34
+ throw new Error(message);
35
+ }
36
+ // biome-ignore lint/suspicious/noConsole: we want it
37
+ console.warn(message);
38
+ }
39
+ }
@@ -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, SettingsManager } from '../../std/index.js';
5
5
  import type { UCDataStore, UCDef, UCHTTPContract, UCInput, UCManager, UCOPIBase } from '../../uc/index.js';
6
+ import { CustomerFacingErrorBuilder } from '../lib/server/CustomerFacingErrorBuilder.js';
6
7
  import type { ServerManager } from '../lib/server/ServerManager.js';
7
8
  import { ServerRequestHandler } from '../lib/server/ServerRequestHandler.js';
8
9
  export interface SyncEdgeWorkerHonoServerManagerSettings {
@@ -10,12 +11,13 @@ export interface SyncEdgeWorkerHonoServerManagerSettings {
10
11
  }
11
12
  type S = SyncEdgeWorkerHonoServerManagerSettings;
12
13
  export declare class SyncEdgeWorkerHonoServerManager implements Configurable<S>, ServerManager {
14
+ private customerFacingErrorBuilder;
13
15
  private serverRequestHandler;
14
16
  private settingsManager;
15
17
  private ucDataStore;
16
18
  private ucManager;
17
19
  protected runtime: Hono;
18
- constructor(serverRequestHandler: ServerRequestHandler, settingsManager: SettingsManager<S>, ucDataStore: UCDataStore, ucManager: UCManager);
20
+ constructor(customerFacingErrorBuilder: CustomerFacingErrorBuilder, serverRequestHandler: ServerRequestHandler, settingsManager: SettingsManager<S>, ucDataStore: UCDataStore, ucManager: UCManager);
19
21
  s(): SyncEdgeWorkerHonoServerManagerSettings;
20
22
  getRuntime(): Hono;
21
23
  overrideUCManager(ucManager: UCManager): void;
@@ -12,15 +12,18 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  };
13
13
  import { inject, injectable } from 'inversify';
14
14
  import { NotAvailableError, NotCallableError } from '../../error/index.js';
15
+ import { CustomerFacingErrorBuilder } from '../lib/server/CustomerFacingErrorBuilder.js';
15
16
  import { ServerRequestHandler } from '../lib/server/ServerRequestHandler.js';
16
17
  import { buildHandler, init, mountHandler } from '../lib/server-hono/funcs.js';
17
18
  let SyncEdgeWorkerHonoServerManager = class SyncEdgeWorkerHonoServerManager {
19
+ customerFacingErrorBuilder;
18
20
  serverRequestHandler;
19
21
  settingsManager;
20
22
  ucDataStore;
21
23
  ucManager;
22
24
  runtime;
23
- constructor(serverRequestHandler, settingsManager, ucDataStore, ucManager) {
25
+ constructor(customerFacingErrorBuilder, serverRequestHandler, settingsManager, ucDataStore, ucManager) {
26
+ this.customerFacingErrorBuilder = customerFacingErrorBuilder;
24
27
  this.serverRequestHandler = serverRequestHandler;
25
28
  this.settingsManager = settingsManager;
26
29
  this.ucDataStore = ucDataStore;
@@ -41,7 +44,7 @@ let SyncEdgeWorkerHonoServerManager = class SyncEdgeWorkerHonoServerManager {
41
44
  throw new NotCallableError('init', 'initSync', 'sync-only');
42
45
  }
43
46
  initSync() {
44
- this.runtime = init();
47
+ this.runtime = init(this.customerFacingErrorBuilder);
45
48
  }
46
49
  async mount(_appManifest, _ucd, _contract) {
47
50
  throw new NotCallableError('mount', 'mountSync', 'sync-only');
@@ -78,10 +81,12 @@ let SyncEdgeWorkerHonoServerManager = class SyncEdgeWorkerHonoServerManager {
78
81
  };
79
82
  SyncEdgeWorkerHonoServerManager = __decorate([
80
83
  injectable(),
81
- __param(0, inject(ServerRequestHandler)),
82
- __param(1, inject('SettingsManager')),
83
- __param(2, inject('UCDataStore')),
84
- __param(3, inject('UCManager')),
85
- __metadata("design:paramtypes", [ServerRequestHandler, Object, Object, Object])
84
+ __param(0, inject(CustomerFacingErrorBuilder)),
85
+ __param(1, inject(ServerRequestHandler)),
86
+ __param(2, inject('SettingsManager')),
87
+ __param(3, inject('UCDataStore')),
88
+ __param(4, inject('UCManager')),
89
+ __metadata("design:paramtypes", [CustomerFacingErrorBuilder,
90
+ ServerRequestHandler, Object, Object, Object])
86
91
  ], SyncEdgeWorkerHonoServerManager);
87
92
  export { SyncEdgeWorkerHonoServerManager };
@@ -0,0 +1 @@
1
+ export { TARGETS, type TargetName } from './lib/manifest.js';
@@ -0,0 +1 @@
1
+ export { TARGETS } from './lib/manifest.js';
@@ -1,5 +1,5 @@
1
- import type { AppUCsLoaderInput } from '../../../app/index.js';
2
- export type Input = Pick<AppUCsLoaderInput, 'appsRootPath' | 'srcImporter'>;
1
+ import type { TargetEntrypointInput } from '../entrypoint.js';
2
+ export type Input = TargetEntrypointInput;
3
3
  export type Output = void;
4
4
  export interface CLIManager {
5
5
  handleCommand(input: Input): Promise<void>;
@@ -1,9 +1,10 @@
1
+ import { unsafeDefaultSetting } from '../../../std/index.js';
1
2
  /**
2
3
  * @see TARGET_DEFAULT_SERVER_MANAGER_SETTINGS
3
4
  */
4
5
  export const TARGET_DEFAULT_SERVER_CLIENT_MANAGER_SETTINGS = {
5
6
  server_cookies_name_auth: 'auth',
6
- server_public_api_key: 'PublicApiKeyToBeChangedWhenDeploying',
7
+ server_public_api_key: unsafeDefaultSetting(),
7
8
  server_public_api_key_header_name: 'X-API-Key',
8
9
  server_public_url: 'http://localhost:7443',
9
10
  };
@@ -0,0 +1,2 @@
1
+ import type { ProductUCsLoaderInput } from '../../product/index.js';
2
+ export type TargetEntrypointInput = Pick<ProductUCsLoaderInput, 'appsRootPath' | 'from' | 'srcImporter'>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ import type { EnumOf } from '../../utils/index.js';
2
+ export declare const TARGETS: {
3
+ readonly 'edge-worker-hono-server': "edge-worker-hono-server";
4
+ readonly 'nextjs-server': "nextjs-server";
5
+ readonly 'node-core-cli': "node-core-cli";
6
+ readonly 'node-express-server': "node-express-server";
7
+ readonly 'node-hono-server': "node-hono-server";
8
+ readonly 'node-mcp-server': "node-mcp-server";
9
+ readonly 'node-stricli-cli': "node-stricli-cli";
10
+ readonly 'react-native-pure': "react-native-pure";
11
+ readonly 'react-web-pure': "react-web-pure";
12
+ };
13
+ export type TargetName = EnumOf<typeof TARGETS>;
@@ -0,0 +1,11 @@
1
+ export const TARGETS = {
2
+ 'edge-worker-hono-server': 'edge-worker-hono-server',
3
+ 'nextjs-server': 'nextjs-server',
4
+ 'node-core-cli': 'node-core-cli',
5
+ 'node-express-server': 'node-express-server',
6
+ 'node-hono-server': 'node-hono-server',
7
+ 'node-mcp-server': 'node-mcp-server',
8
+ 'node-stricli-cli': 'node-stricli-cli',
9
+ 'react-native-pure': 'react-native-pure',
10
+ 'react-web-pure': 'react-web-pure',
11
+ };
@@ -1,9 +1,9 @@
1
- import type { AppUCsLoaderInput } from '../../../app/index.js';
2
1
  import { ProductUCsLoader } from '../../../product/index.js';
3
2
  import type { I18nManager, Logger, Worker } from '../../../std/index.js';
4
3
  import { type UCManager } from '../../../uc/index.js';
4
+ import type { TargetEntrypointInput } from '../entrypoint.js';
5
5
  import type { ServerManager } from '../server/ServerManager.js';
6
- type Input = Pick<AppUCsLoaderInput, 'appsRootPath' | 'srcImporter'>;
6
+ type Input = TargetEntrypointInput;
7
7
  export declare class MCPServerBooter implements Worker<Input, Promise<void>> {
8
8
  private i18nManager;
9
9
  private logger;
@@ -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 { CustomError, InternalServerError } from '../../../error/index.js';
14
+ import { CustomError, IllegalArgumentError, InternalServerError, isInvalidJSON, } from '../../../error/index.js';
15
15
  let CustomerFacingErrorBuilder = class CustomerFacingErrorBuilder {
16
16
  environmentManager;
17
17
  logger;
@@ -26,6 +26,11 @@ let CustomerFacingErrorBuilder = class CustomerFacingErrorBuilder {
26
26
  error,
27
27
  };
28
28
  }
29
+ if (isInvalidJSON(error)) {
30
+ return {
31
+ error: new IllegalArgumentError(),
32
+ };
33
+ }
29
34
  this.logger.error(error);
30
35
  // Create a specific generic error to avoid leaking potentially sensitive error
31
36
  // We all know the infamous "Cannot connect to MySQL database"...
@@ -1,11 +1,11 @@
1
- import type { AppUCsLoaderInput } from '../../../app/index.js';
2
1
  import { ProductUCsLoader } from '../../../product/index.js';
3
2
  import type { Configurable, EmailManager, FSManager, I18nManager, JobManager, Logger, SettingsManager, Worker } from '../../../std/index.js';
4
3
  import { type UCManager } from '../../../uc/index.js';
4
+ import type { TargetEntrypointInput } from '../entrypoint.js';
5
5
  import { ServerInstaller } from './ServerInstaller.js';
6
6
  import type { ServerManager, ServerManagerSettings } from './ServerManager.js';
7
7
  type S = Pick<ServerManagerSettings, 'server_static_dir_path' | 'server_tmp_path'>;
8
- type Input = Pick<AppUCsLoaderInput, 'appsRootPath' | 'srcImporter'> & {
8
+ type Input = TargetEntrypointInput & {
9
9
  autoMountUCs?: boolean;
10
10
  };
11
11
  export declare class ServerBooter implements Configurable<S>, Worker<Input, Promise<void>> {
@@ -12,6 +12,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  };
13
13
  var ServerRequestHandler_1;
14
14
  import { inject, injectable } from 'inversify';
15
+ import { IllegalArgumentError, isEmptyJSON } from '../../../error/index.js';
15
16
  import { UCBuilder, UCOutputReader, UCOutputSideEffectType, } from '../../../uc/index.js';
16
17
  import { AuthCookieCreator, } from './AuthCookieCreator.js';
17
18
  import { AuthenticationChecker } from './AuthenticationChecker.js';
@@ -119,8 +120,11 @@ let ServerRequestHandler = class ServerRequestHandler {
119
120
  try {
120
121
  uc.fill((await req.bodyFromJSON()));
121
122
  }
122
- catch (_err) {
123
- // Ignore any JSON.parse error as everything is validated afterwards
123
+ catch (err) {
124
+ if (isEmptyJSON(err)) {
125
+ break;
126
+ }
127
+ throw new IllegalArgumentError();
124
128
  }
125
129
  break;
126
130
  case 'query-params':
@@ -1,3 +1,4 @@
1
+ import { unsafeDefaultSetting } from '../../../std/index.js';
1
2
  /**
2
3
  * @see TARGET_DEFAULT_SERVER_CLIENT_MANAGER_SETTINGS
3
4
  */
@@ -13,7 +14,7 @@ export const TARGET_DEFAULT_SERVER_MANAGER_SETTINGS = {
13
14
  server_csp_img_src: [],
14
15
  server_csp_script_src: [],
15
16
  server_private_api_key_entries: [],
16
- server_public_api_key_entries: ['PublicApiKeyToBeChangedWhenDeploying'],
17
+ server_public_api_key_entries: [unsafeDefaultSetting()],
17
18
  server_public_api_key_header_name: 'X-API-Key',
18
19
  server_public_url: 'http://localhost:7443',
19
20
  server_ssl_fullchain_path: null,
@@ -4,12 +4,14 @@ import type { AppManifest } from '../../../app/index.js';
4
4
  import type { File } from '../../../dt/index.js';
5
5
  import type { LoggerLevel } from '../../../std/index.js';
6
6
  import type { UCDef, UCHTTPContract, UCInput, UCManager, UCOPIBase } from '../../../uc/index.js';
7
+ import type { CustomerFacingErrorBuilder } from '../server/CustomerFacingErrorBuilder.js';
7
8
  import type { ServerManagerSettings } from '../server/ServerManager.js';
8
9
  import type { ServerRequestHandler, ServerRequestHandlerReq, ServerRequestHandlerRes } from '../server/ServerRequestHandler.js';
9
10
  import type { HelmetMiddlewareBuilder } from './HelmetMiddlewareBuilder.js';
10
11
  export declare function buildHandler<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(appManifest: AppManifest, ucd: UCDef<I, OPI0, OPI1>, contract: UCHTTPContract, serverRequestHandler: ServerRequestHandler, ucManager: UCManager): RequestHandler;
11
12
  export declare function init(helmetMB: HelmetMiddlewareBuilder, loggerLevel: LoggerLevel, serverTmpPath: ServerManagerSettings['server_tmp_path']): Express;
12
13
  export declare function mountHandler(contract: UCHTTPContract, express: Express, handler: RequestHandler): void;
14
+ export declare function postInit(app: Express, customerFacingErrorBuilder: CustomerFacingErrorBuilder): void;
13
15
  export declare function toFile(f: fileUpload.UploadedFile): File;
14
16
  export declare function toReq(req: Request): ServerRequestHandlerReq;
15
17
  export declare function toRes(res: Response): ServerRequestHandlerRes;
@@ -94,6 +94,12 @@ export function mountHandler(contract, express, handler) {
94
94
  express[httpMethod](pathAlias, handler);
95
95
  }
96
96
  }
97
+ export function postInit(app, customerFacingErrorBuilder) {
98
+ app.use((err, _req, res, _next) => {
99
+ const { error } = customerFacingErrorBuilder.exec({ error: err });
100
+ return res.status(error.httpStatus).json(error.toObj());
101
+ });
102
+ }
97
103
  export function toFile(f) {
98
104
  return {
99
105
  name: f.name,
@@ -2,9 +2,10 @@ import { type Context, type Handler, Hono } from 'hono';
2
2
  import type { BlankEnv, Env } from 'hono/types';
3
3
  import type { AppManifest } from '../../../app/index.js';
4
4
  import type { UCDef, UCHTTPContract, UCInput, UCManager, UCOPIBase } from '../../../uc/index.js';
5
+ import type { CustomerFacingErrorBuilder } from '../server/CustomerFacingErrorBuilder.js';
5
6
  import type { ServerRequestHandler, ServerRequestHandlerReq, ServerRequestHandlerRes } from '../server/ServerRequestHandler.js';
6
7
  export declare function buildHandler<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(appManifest: AppManifest, ucd: UCDef<I, OPI0, OPI1>, contract: UCHTTPContract, serverRequestHandler: ServerRequestHandler, ucManager: UCManager, beforeExec?: (c: Context) => Promise<void>): Handler;
7
- export declare function init<E extends Env = BlankEnv>(): Hono<E>;
8
+ export declare function init<E extends Env = BlankEnv>(customerFacingErrorBuilder: CustomerFacingErrorBuilder): Hono<E>;
8
9
  export declare function mountHandler(contract: UCHTTPContract, hono: Hono, handler: Handler): void;
9
10
  export declare function toReq(c: Context): ServerRequestHandlerReq;
10
11
  export declare function toRes(c: Context): ServerRequestHandlerRes;
@@ -86,13 +86,17 @@ export function buildHandler(appManifest, ucd, contract, serverRequestHandler, u
86
86
  };
87
87
  return handler;
88
88
  }
89
- export function init() {
89
+ export function init(customerFacingErrorBuilder) {
90
90
  const app = new Hono();
91
91
  app.use(secureHeaders());
92
92
  app.use(logger());
93
93
  app.notFound((c) => {
94
- const err = new NotFoundError();
95
- return c.json(err.toObj(), err.httpStatus);
94
+ const error = new NotFoundError();
95
+ return c.json(error.toObj(), error.httpStatus);
96
+ });
97
+ app.onError((err, c) => {
98
+ const { error } = customerFacingErrorBuilder.exec({ error: err });
99
+ return c.json(error.toObj(), error.httpStatus);
96
100
  });
97
101
  return app;
98
102
  }
@@ -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, LoggerSettings, 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, ServerManagerSettings } from '../lib/server/ServerManager.js';
8
9
  import { ServerRequestHandler } from '../lib/server/ServerRequestHandler.js';
@@ -11,6 +12,7 @@ import { HelmetMiddlewareBuilder } from '../lib/server-express/HelmetMiddlewareB
11
12
  import type { ListenSettings, StopSettings } from '../lib/server-node/types.js';
12
13
  type S = ListenSettings & Pick<LoggerSettings, 'logger_level'> & Pick<ServerManagerSettings, 'server_tmp_path'> & StopSettings;
13
14
  export declare class NodeExpressServerManager implements Configurable<S>, ServerManager {
15
+ private customerFacingErrorBuilder;
14
16
  private entrypointsBuilder;
15
17
  protected environmentManager: EnvironmentManager;
16
18
  private helmetMB;
@@ -21,7 +23,7 @@ export declare class NodeExpressServerManager implements Configurable<S>, Server
21
23
  private ucManager;
22
24
  protected runtime: Express;
23
25
  private server;
24
- constructor(entrypointsBuilder: EntrypointsBuilder, environmentManager: EnvironmentManager, helmetMB: HelmetMiddlewareBuilder, logger: Logger, serverRequestHandler: ServerRequestHandler, serverSSLCertLoader: ServerSSLCertLoader, settingsManager: SettingsManager<S>, ucManager: UCManager);
26
+ constructor(customerFacingErrorBuilder: CustomerFacingErrorBuilder, entrypointsBuilder: EntrypointsBuilder, environmentManager: EnvironmentManager, helmetMB: HelmetMiddlewareBuilder, logger: Logger, serverRequestHandler: ServerRequestHandler, serverSSLCertLoader: ServerSSLCertLoader, settingsManager: SettingsManager<S>, ucManager: UCManager);
25
27
  s(): S;
26
28
  getRuntime(): Express;
27
29
  overrideUCManager(ucManager: UCManager): void;
@@ -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
+ }