@weconjs/core 1.2.3 → 1.2.10

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 (64) hide show
  1. package/README.md +460 -259
  2. package/dist/config.d.ts +7 -7
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +21 -43
  5. package/dist/config.js.map +1 -1
  6. package/dist/devtools/controllers/i18n.controller.d.ts +1 -1
  7. package/dist/devtools/controllers/i18n.controller.d.ts.map +1 -1
  8. package/dist/devtools/controllers/i18n.controller.js +19 -10
  9. package/dist/devtools/controllers/i18n.controller.js.map +1 -1
  10. package/dist/devtools/index.d.ts.map +1 -1
  11. package/dist/devtools/index.js +2 -0
  12. package/dist/devtools/index.js.map +1 -1
  13. package/dist/i18n/index.d.ts +13 -30
  14. package/dist/i18n/index.d.ts.map +1 -1
  15. package/dist/i18n/index.js +15 -91
  16. package/dist/i18n/index.js.map +1 -1
  17. package/dist/i18n/loader.d.ts +58 -0
  18. package/dist/i18n/loader.d.ts.map +1 -0
  19. package/dist/i18n/loader.js +97 -0
  20. package/dist/i18n/loader.js.map +1 -0
  21. package/dist/i18n/middleware.d.ts +39 -0
  22. package/dist/i18n/middleware.d.ts.map +1 -0
  23. package/dist/i18n/middleware.js +75 -0
  24. package/dist/i18n/middleware.js.map +1 -0
  25. package/dist/i18n/utils.d.ts +31 -0
  26. package/dist/i18n/utils.d.ts.map +1 -0
  27. package/dist/i18n/utils.js +46 -0
  28. package/dist/i18n/utils.js.map +1 -0
  29. package/dist/index.d.ts +3 -3
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +2 -2
  32. package/dist/index.js.map +1 -1
  33. package/dist/module.d.ts +10 -0
  34. package/dist/module.d.ts.map +1 -1
  35. package/dist/module.js +25 -0
  36. package/dist/module.js.map +1 -1
  37. package/dist/server/banner.d.ts +1 -0
  38. package/dist/server/banner.d.ts.map +1 -1
  39. package/dist/server/banner.js +13 -2
  40. package/dist/server/banner.js.map +1 -1
  41. package/dist/server/index.d.ts +7 -3
  42. package/dist/server/index.d.ts.map +1 -1
  43. package/dist/server/index.js +20 -12
  44. package/dist/server/index.js.map +1 -1
  45. package/dist/types.d.ts +15 -13
  46. package/dist/types.d.ts.map +1 -1
  47. package/package.json +6 -4
  48. package/dist/devtools/client/assets/CopyButton-DIdtJD4_.js +0 -6
  49. package/dist/devtools/client/assets/ModuleDetail-Dx6eU87l.js +0 -1
  50. package/dist/devtools/client/assets/TranslationEditor-Bj654a_E.js +0 -11
  51. package/dist/devtools/client/assets/chevron-right-E9DzkOHY.js +0 -6
  52. package/dist/devtools/client/assets/copy-BvbhBv2y.js +0 -6
  53. package/dist/devtools/client/assets/index-B42p6IVr.js +0 -6
  54. package/dist/devtools/client/assets/index-CSkGspzD.js +0 -1
  55. package/dist/devtools/client/assets/index-CnAObNgT.js +0 -16
  56. package/dist/devtools/client/assets/index-CwJHaaYT.css +0 -1
  57. package/dist/devtools/client/assets/index-Dfe66IW7.js +0 -1
  58. package/dist/devtools/client/assets/index-DoHRi03N.js +0 -201
  59. package/dist/devtools/client/assets/index-DvvGoEUv.js +0 -1
  60. package/dist/devtools/client/assets/loader-circle-DoOjJ8vr.js +0 -6
  61. package/dist/devtools/client/assets/plus-Ca-xq8y8.js +0 -6
  62. package/dist/devtools/client/assets/save-CV1xmSXO.js +0 -11
  63. package/dist/devtools/client/assets/search-CpTZ4fXm.js +0 -6
  64. package/dist/devtools/client/index.html +0 -15
package/dist/config.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * @wecon/core - defineConfig
3
3
  *
4
4
  * Creates a type-safe Wecon configuration object.
5
- * Supports mode inheritance, feature flags, and lifecycle hooks.
5
+ * Supports feature flags, module configs, and lifecycle hooks.
6
6
  *
7
7
  * @example
8
8
  * ```typescript
@@ -10,10 +10,10 @@
10
10
  *
11
11
  * export default defineConfig({
12
12
  * app: { name: 'my-app', version: '1.0.0' },
13
- * modes: {
14
- * development: { port: 3001, logging: { level: 'debug' } },
15
- * production: { port: 8080, logging: { level: 'warn' } },
16
- * },
13
+ * mode: 'development',
14
+ * port: 3001,
15
+ * database: { mongoose: { host: 'localhost', database: 'myapp' } },
16
+ * logging: { level: 'debug' },
17
17
  * modules: ['./modules/auth', './modules/users'],
18
18
  * features: {
19
19
  * socket: { enabled: true },
@@ -31,10 +31,10 @@ import type { WeconConfig, ResolvedConfig } from "./types.js";
31
31
  */
32
32
  export declare function defineConfig(config: WeconConfig): WeconConfig;
33
33
  /**
34
- * Resolve configuration for a specific mode
34
+ * Resolve configuration by merging defaults with user-provided values
35
35
  *
36
36
  * @param config - The Wecon configuration
37
- * @param mode - The mode to resolve (defaults to NODE_ENV or 'development')
37
+ * @param mode - Optional mode override
38
38
  * @returns The fully resolved configuration
39
39
  */
40
40
  export declare function resolveConfig(config: WeconConfig, mode?: string): ResolvedConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAc,MAAM,YAAY,CAAC;AAiC1E;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAiB7D;AAwED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,WAAW,EACnB,IAAI,CAAC,EAAE,MAAM,GACZ,cAAc,CAqChB;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CAYzB"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAiC9D;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAsB7D;AAmCD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,WAAW,EACnB,IAAI,CAAC,EAAE,MAAM,GACZ,cAAc,CAiChB;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CAYzB"}
package/dist/config.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * @wecon/core - defineConfig
3
3
  *
4
4
  * Creates a type-safe Wecon configuration object.
5
- * Supports mode inheritance, feature flags, and lifecycle hooks.
5
+ * Supports feature flags, module configs, and lifecycle hooks.
6
6
  *
7
7
  * @example
8
8
  * ```typescript
@@ -10,10 +10,10 @@
10
10
  *
11
11
  * export default defineConfig({
12
12
  * app: { name: 'my-app', version: '1.0.0' },
13
- * modes: {
14
- * development: { port: 3001, logging: { level: 'debug' } },
15
- * production: { port: 8080, logging: { level: 'warn' } },
16
- * },
13
+ * mode: 'development',
14
+ * port: 3001,
15
+ * database: { mongoose: { host: 'localhost', database: 'myapp' } },
16
+ * logging: { level: 'debug' },
17
17
  * modules: ['./modules/auth', './modules/users'],
18
18
  * features: {
19
19
  * socket: { enabled: true },
@@ -69,10 +69,15 @@ export function defineConfig(config) {
69
69
  name: config.app.name,
70
70
  version: config.app.version ?? "1.0.0",
71
71
  },
72
- modes: config.modes ?? {},
72
+ mode: config.mode,
73
+ port: config.port,
74
+ database: config.database,
75
+ logging: config.logging,
76
+ https: config.https,
73
77
  modules: config.modules ?? [],
74
78
  features: config.features ?? {},
75
79
  hooks: config.hooks ?? {},
80
+ moduleConfigs: config.moduleConfigs ?? {},
76
81
  };
77
82
  }
78
83
  /**
@@ -98,38 +103,14 @@ function deepMerge(target, source) {
98
103
  return result;
99
104
  }
100
105
  /**
101
- * Resolve a mode configuration with inheritance
102
- *
103
- * @param modes - All mode configurations
104
- * @param modeName - The mode to resolve
105
- * @param visited - Set of visited modes (for circular detection)
106
- */
107
- function resolveMode(modes, modeName, visited = new Set()) {
108
- if (visited.has(modeName)) {
109
- throw new Error(`[Wecon] Circular mode inheritance detected: ${Array.from(visited).join(" -> ")} -> ${modeName}`);
110
- }
111
- const mode = modes[modeName];
112
- if (!mode) {
113
- throw new Error(`[Wecon] Mode "${modeName}" not found in configuration`);
114
- }
115
- visited.add(modeName);
116
- // If this mode extends another, resolve the parent first
117
- if (mode.extends) {
118
- const parentMode = resolveMode(modes, mode.extends, visited);
119
- const { extends: _, ...modeWithoutExtends } = mode;
120
- return deepMerge(parentMode, modeWithoutExtends);
121
- }
122
- return mode;
123
- }
124
- /**
125
- * Resolve configuration for a specific mode
106
+ * Resolve configuration by merging defaults with user-provided values
126
107
  *
127
108
  * @param config - The Wecon configuration
128
- * @param mode - The mode to resolve (defaults to NODE_ENV or 'development')
109
+ * @param mode - Optional mode override
129
110
  * @returns The fully resolved configuration
130
111
  */
131
112
  export function resolveConfig(config, mode) {
132
- const targetMode = mode ?? process.env.NODE_ENV ?? "development";
113
+ const targetMode = mode ?? config.mode ?? process.env.NODE_ENV ?? "development";
133
114
  // Start with defaults
134
115
  let resolved = {
135
116
  app: {
@@ -145,16 +126,13 @@ export function resolveConfig(config, mode) {
145
126
  modules: [...(config.modules ?? [])],
146
127
  moduleConfigs: { ...(config.moduleConfigs ?? {}) },
147
128
  };
148
- // Apply mode-specific configuration if defined
149
- if (config.modes && config.modes[targetMode]) {
150
- const modeConfig = resolveMode(config.modes, targetMode);
151
- resolved = deepMerge(resolved, {
152
- port: modeConfig.port,
153
- database: modeConfig.database,
154
- logging: modeConfig.logging,
155
- https: modeConfig.https,
156
- });
157
- }
129
+ // Merge user-provided flat config over defaults
130
+ resolved = deepMerge(resolved, {
131
+ port: config.port,
132
+ database: config.database,
133
+ logging: config.logging,
134
+ https: config.https,
135
+ });
158
136
  // Merge features
159
137
  if (config.features) {
160
138
  resolved.features = deepMerge(resolved.features, config.features);
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH;;GAEG;AACH,MAAM,cAAc,GAA4B;IAC9C,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE;QACR,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE;YACR,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,WAAW;SACtB;KACF;IACD,OAAO,EAAE;QACP,KAAK,EAAE,MAAM;QACb,aAAa,EAAE,IAAI;QACnB,UAAU,EAAE,KAAK;KAClB;IACD,KAAK,EAAE;QACL,OAAO,EAAE,KAAK;KACf;IACD,QAAQ,EAAE;QACR,WAAW,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;QAC9C,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;QAC5C,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QAC3B,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;KAC3B;IACD,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,MAAmB;IAC9C,2BAA2B;IAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,yDAAyD;IACzD,OAAO;QACL,GAAG,EAAE;YACH,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI;YACrB,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO;SACvC;QACD,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;QAC/B,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;QACzB,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,EAAE;KAC1C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAChB,MAAS,EACT,MAAkB;IAElB,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAO,CAAC;IAElC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,MAAM,CAAC,GAAc,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,MAAM,CAAC,GAAc,CAAC,CAAC;QAE3C,IACE,WAAW;YACX,OAAO,WAAW,KAAK,QAAQ;YAC/B,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;YAC3B,WAAW;YACX,OAAO,WAAW,KAAK,QAAQ;YAC/B,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAC3B,CAAC;YACA,MAAkC,CAAC,GAAG,CAAC,GAAG,SAAS,CAClD,WAAqB,EACrB,WAAqB,CACtB,CAAC;QACJ,CAAC;aAAM,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YACpC,MAAkC,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;QACzD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAmB,EACnB,IAAa;IAEb,MAAM,UAAU,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAC;IAEhF,sBAAsB;IACtB,IAAI,QAAQ,GAAmB;QAC7B,GAAG,EAAE;YACH,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI;YACrB,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO;SACvC;QACD,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,cAAc,CAAC,IAAK;QAC1B,QAAQ,EAAE,EAAE,GAAG,cAAc,CAAC,QAAQ,EAAE;QACxC,OAAO,EAAE,EAAE,GAAG,cAAc,CAAC,OAAO,EAAE;QACtC,KAAK,EAAE,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE;QAClC,QAAQ,EAAE,EAAE,GAAG,cAAc,CAAC,QAAQ,EAAE;QACxC,OAAO,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACpC,aAAa,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE;KACnD,CAAC;IAEF,gDAAgD;IAChD,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAAE;QAC7B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;KACO,CAAC,CAAC;IAE9B,iBAAiB;IACjB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,UAAkB,EAClB,IAAa;IAEb,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAgB,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC;QAEjE,OAAO,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,yCAAyC,UAAU,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -8,7 +8,7 @@ import type { DevToolsContext } from "../types.js";
8
8
  /**
9
9
  * GET /i18n - List all namespaces with languages and key counts
10
10
  */
11
- export declare function listNamespaces(dtCtx: DevToolsContext, modulesDir: string): (_req: Request, res: Response) => Promise<void>;
11
+ export declare function listNamespaces(dtCtx: DevToolsContext, modulesDir: string): (_req: Request, res: Response) => void;
12
12
  /**
13
13
  * GET /i18n/:namespace/:lang - Get translations for namespace + language
14
14
  */
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.controller.d.ts","sourceRoot":"","sources":["../../../src/devtools/controllers/i18n.controller.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,IACzD,MAAM,OAAO,EAAE,KAAK,QAAQ,KAAG,OAAO,CAAC,IAAI,CAAC,CAuB3D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,IAChE,KAAK,OAAO,EAAE,KAAK,QAAQ,KAAG,IAAI,CA0B3C;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,IACnE,KAAK,OAAO,EAAE,KAAK,QAAQ,KAAG,IAAI,CAwB3C"}
1
+ {"version":3,"file":"i18n.controller.d.ts","sourceRoot":"","sources":["../../../src/devtools/controllers/i18n.controller.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,IAC/D,MAAM,OAAO,EAAE,KAAK,QAAQ,KAAG,IAAI,CAgC5C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,IAChE,KAAK,OAAO,EAAE,KAAK,QAAQ,KAAG,IAAI,CA0B3C;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,IACnE,KAAK,OAAO,EAAE,KAAK,QAAQ,KAAG,IAAI,CAwB3C"}
@@ -5,23 +5,32 @@
5
5
  */
6
6
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
7
7
  import { join, dirname } from "path";
8
- import { loadI18nResources } from "../../i18n/index.js";
8
+ import { I18nLoader } from "../../i18n/index.js";
9
9
  /**
10
10
  * GET /i18n - List all namespaces with languages and key counts
11
11
  */
12
12
  export function listNamespaces(dtCtx, modulesDir) {
13
- return async (_req, res) => {
13
+ return (_req, res) => {
14
14
  try {
15
- const resources = await loadI18nResources(modulesDir);
16
- const namespaces = Object.entries(resources).map(([namespace, langs]) => ({
15
+ const loader = new I18nLoader(modulesDir);
16
+ const resources = loader.loadAll();
17
+ // Convert from { lang: { ns: translations } } to namespace-centric view
18
+ const nsMap = {};
19
+ for (const [lang, namespaces] of Object.entries(resources)) {
20
+ for (const [ns, translations] of Object.entries(namespaces)) {
21
+ if (!nsMap[ns]) {
22
+ nsMap[ns] = { languages: [], keyCounts: {} };
23
+ }
24
+ nsMap[ns].languages.push(lang);
25
+ nsMap[ns].keyCounts[lang] = Object.keys(translations).length;
26
+ }
27
+ }
28
+ const data = Object.entries(nsMap).map(([namespace, info]) => ({
17
29
  namespace,
18
- languages: Object.keys(langs),
19
- keyCounts: Object.fromEntries(Object.entries(langs).map(([lang, translations]) => [
20
- lang,
21
- Object.keys(translations).length,
22
- ])),
30
+ languages: info.languages,
31
+ keyCounts: info.keyCounts,
23
32
  }));
24
- res.json({ success: true, data: namespaces });
33
+ res.json({ success: true, data });
25
34
  }
26
35
  catch (err) {
27
36
  res.status(500).json({
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.controller.js","sourceRoot":"","sources":["../../../src/devtools/controllers/i18n.controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"i18n.controller.js","sourceRoot":"","sources":["../../../src/devtools/controllers/i18n.controller.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/devtools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,KAAK,MAAM,qBAAqB,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;AAOnE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAoBlD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,WAAW,EAAE,EACtB,OAAO,GAAE,eAAoB,EAC7B,KAAK,CAAC,EAAE,KAAK,GACZ,MAAM,GAAG,IAAI,CAoDf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/devtools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,KAAK,MAAM,qBAAqB,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;AAOnE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAoBlD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,WAAW,EAAE,EACtB,OAAO,GAAE,eAAoB,EAC7B,KAAK,CAAC,EAAE,KAAK,GACZ,MAAM,GAAG,IAAI,CAuDf"}
@@ -60,6 +60,8 @@ export function createDevToolsRouter(ctx, modules, options = {}, wecon) {
60
60
  const router = express.Router();
61
61
  const dtCtx = { ctx, modules };
62
62
  const modulesDir = options.modulesDir ?? "./src/modules";
63
+ // Parse JSON bodies for PUT/POST endpoints
64
+ router.use(express.json());
63
65
  // Optional bearer token auth
64
66
  if (options.auth?.token) {
65
67
  router.use(createDevToolsAuth(options.auth.token));
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/devtools/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/devtools/index.ts"],"names":[],"mappings":"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"}
@@ -1,37 +1,20 @@
1
1
  /**
2
- * @weconjs/core - i18n Loader
2
+ * @weconjs/core - i18n Module
3
3
  *
4
- * Auto-discovers and loads translation files from module i18n/ directories.
5
- */
6
- /**
7
- * i18n resource structure
8
- */
9
- export interface I18nResources {
10
- [namespace: string]: {
11
- [language: string]: Record<string, any>;
12
- };
13
- }
14
- /**
15
- * Load translations from all module i18n directories
4
+ * Module-based translation system built on i18next.
5
+ * Auto-discovers translations from module i18n/ directories.
16
6
  *
17
- * @param modulesDir - Path to the modules directory
18
- * @returns Loaded translation resources
7
+ * Usage in controllers:
8
+ * req.t("auth:login.success") // auth module namespace
9
+ * req.t("users:notFound") // users module namespace
10
+ * req.t("core:errors.NOT_FOUND") // core namespace (always available)
19
11
  */
20
- export declare function loadI18nResources(modulesDir: string): Promise<I18nResources>;
12
+ export { I18nLoader } from "./loader.js";
13
+ export type { I18nResources } from "./loader.js";
14
+ export { initializeI18n, i18nNamespaceMiddleware, getI18n, i18next, } from "./middleware.js";
15
+ export { translate, getCurrentLanguage, changeLanguage } from "./utils.js";
21
16
  /**
22
- * Create i18n middleware for Express
23
- *
24
- * @param resources - Loaded translation resources
25
- * @param defaultLanguage - Default language code
26
- * @returns Express middleware function
27
- */
28
- export declare function createI18nMiddleware(resources: I18nResources, defaultLanguage?: string): (req: any, res: any, next: any) => void;
29
- /**
30
- * Initialize i18n for a Wecon application
31
- *
32
- * @param modulesDir - Path to modules directory
33
- * @param defaultLanguage - Default language
34
- * @returns Express middleware
17
+ * Backward-compatible alias for `initializeI18n`
35
18
  */
36
- export declare function initI18n(modulesDir: string, defaultLanguage?: string): Promise<(req: any, res: any, next: any) => void>;
19
+ export { initializeI18n as initI18n } from "./middleware.js";
37
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,CAAC,SAAS,EAAE,MAAM,GAAG;QACnB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACzC,CAAC;CACH;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAqClF;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,aAAa,EACxB,eAAe,GAAE,MAAa,IAEtB,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG,UAoCtC;AAED;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,GAAE,MAAa,iBA7ClE,GAAG,OAAO,GAAG,QAAQ,GAAG,WAgDtC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,OAAO,EACP,OAAO,GACR,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE3E;;GAEG;AACH,OAAO,EAAE,cAAc,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,98 +1,22 @@
1
1
  /**
2
- * @weconjs/core - i18n Loader
2
+ * @weconjs/core - i18n Module
3
3
  *
4
- * Auto-discovers and loads translation files from module i18n/ directories.
5
- */
6
- import { glob } from "glob";
7
- import { basename, dirname } from "path";
8
- import { readFileSync } from "fs";
9
- /**
10
- * Load translations from all module i18n directories
11
- *
12
- * @param modulesDir - Path to the modules directory
13
- * @returns Loaded translation resources
14
- */
15
- export async function loadI18nResources(modulesDir) {
16
- const resources = {};
17
- try {
18
- // Find all translation files
19
- const files = await glob("**/i18n/*.translation.json", {
20
- cwd: modulesDir,
21
- absolute: true,
22
- });
23
- for (const file of files) {
24
- try {
25
- // Extract module name and language
26
- // e.g., auth/i18n/en.translation.json -> namespace: auth, lang: en
27
- const fileName = basename(file); // en.translation.json
28
- const language = fileName.replace(".translation.json", "");
29
- const moduleDir = dirname(dirname(file)); // auth/
30
- const namespace = basename(moduleDir);
31
- // Load translation file
32
- const content = readFileSync(file, "utf-8");
33
- const translations = JSON.parse(content);
34
- // Add to resources
35
- if (!resources[namespace]) {
36
- resources[namespace] = {};
37
- }
38
- resources[namespace][language] = translations;
39
- }
40
- catch (err) {
41
- console.warn(`[Wecon] Failed to load translation file ${file}:`, err);
42
- }
43
- }
44
- }
45
- catch (err) {
46
- console.warn("[Wecon] Failed to discover translation files:", err);
47
- }
48
- return resources;
49
- }
50
- /**
51
- * Create i18n middleware for Express
4
+ * Module-based translation system built on i18next.
5
+ * Auto-discovers translations from module i18n/ directories.
52
6
  *
53
- * @param resources - Loaded translation resources
54
- * @param defaultLanguage - Default language code
55
- * @returns Express middleware function
7
+ * Usage in controllers:
8
+ * req.t("auth:login.success") // auth module namespace
9
+ * req.t("users:notFound") // users module namespace
10
+ * req.t("core:errors.NOT_FOUND") // core namespace (always available)
56
11
  */
57
- export function createI18nMiddleware(resources, defaultLanguage = "en") {
58
- return (req, res, next) => {
59
- // Get language from header or query
60
- const lang = req.headers["accept-language"]?.split(",")[0]?.split("-")[0] ||
61
- req.query.lang ||
62
- defaultLanguage;
63
- // Add translation function to request
64
- req.t = (key, options) => {
65
- const [namespace, ...keyParts] = key.split(".");
66
- const actualKey = keyParts.join(".");
67
- const translations = resources[namespace]?.[lang] || resources[namespace]?.[defaultLanguage];
68
- if (!translations) {
69
- return key; // Return key if no translations found
70
- }
71
- let value = translations;
72
- for (const part of actualKey.split(".")) {
73
- value = value?.[part];
74
- }
75
- if (typeof value !== "string") {
76
- return key;
77
- }
78
- // Simple interpolation
79
- if (options) {
80
- return value.replace(/\{\{(\w+)\}\}/g, (_, k) => String(options[k] ?? `{{${k}}}`));
81
- }
82
- return value;
83
- };
84
- next();
85
- };
86
- }
12
+ // Loader
13
+ export { I18nLoader } from "./loader.js";
14
+ // Middleware
15
+ export { initializeI18n, i18nNamespaceMiddleware, getI18n, i18next, } from "./middleware.js";
16
+ // Utilities
17
+ export { translate, getCurrentLanguage, changeLanguage } from "./utils.js";
87
18
  /**
88
- * Initialize i18n for a Wecon application
89
- *
90
- * @param modulesDir - Path to modules directory
91
- * @param defaultLanguage - Default language
92
- * @returns Express middleware
19
+ * Backward-compatible alias for `initializeI18n`
93
20
  */
94
- export async function initI18n(modulesDir, defaultLanguage = "en") {
95
- const resources = await loadI18nResources(modulesDir);
96
- return createI18nMiddleware(resources, defaultLanguage);
97
- }
21
+ export { initializeI18n as initI18n } from "./middleware.js";
98
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,aAAa;AACb,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,OAAO,EACP,OAAO,GACR,MAAM,iBAAiB,CAAC;AAEzB,YAAY;AACZ,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE3E;;GAEG;AACH,OAAO,EAAE,cAAc,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @weconjs/core - i18n Resource Loader
3
+ *
4
+ * Discovers and loads translation files from module i18n/ directories.
5
+ * Output format matches i18next: { [lang]: { [namespace]: translations } }
6
+ */
7
+ /**
8
+ * i18n resource structure (i18next-compatible)
9
+ *
10
+ * Format: `{ [language]: { [namespace]: Record<string, unknown> } }`
11
+ */
12
+ export interface I18nResources {
13
+ [language: string]: {
14
+ [namespace: string]: Record<string, unknown>;
15
+ };
16
+ }
17
+ /**
18
+ * i18n Resource Loader
19
+ *
20
+ * Scans module directories for `i18n/*.translation.json` files
21
+ * and builds a resource map keyed by language and namespace.
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * const loader = new I18nLoader("./src/modules");
26
+ * const resources = loader.loadAll();
27
+ * // { en: { auth: { ... }, users: { ... } }, fr: { auth: { ... } } }
28
+ * ```
29
+ */
30
+ export declare class I18nLoader {
31
+ private resources;
32
+ private modulesDir;
33
+ constructor(modulesDir: string);
34
+ /**
35
+ * Load translations from a specific directory into a namespace
36
+ */
37
+ private loadTranslationsFromDir;
38
+ /**
39
+ * Load all translations from the modules directory
40
+ *
41
+ * Discovers module directories and scans each for an `i18n/` subdirectory
42
+ * containing `*.translation.json` files.
43
+ */
44
+ loadAll(): I18nResources;
45
+ /**
46
+ * Get the loaded resources
47
+ */
48
+ getResources(): I18nResources;
49
+ /**
50
+ * Get all supported languages discovered from translation files
51
+ */
52
+ getSupportedLanguages(): string[];
53
+ /**
54
+ * Get all namespaces discovered from module directories
55
+ */
56
+ getNamespaces(): string[];
57
+ }
58
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/i18n/loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,CAAC,QAAQ,EAAE,MAAM,GAAG;QAClB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC9C,CAAC;CACH;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,EAAE,MAAM;IAI9B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA4B/B;;;;;OAKG;IACH,OAAO,IAAI,aAAa;IAqBxB;;OAEG;IACH,YAAY,IAAI,aAAa;IAI7B;;OAEG;IACH,qBAAqB,IAAI,MAAM,EAAE;IAIjC;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE;CAS1B"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * @weconjs/core - i18n Resource Loader
3
+ *
4
+ * Discovers and loads translation files from module i18n/ directories.
5
+ * Output format matches i18next: { [lang]: { [namespace]: translations } }
6
+ */
7
+ import { readdirSync, readFileSync, existsSync } from "fs";
8
+ import { join } from "path";
9
+ /**
10
+ * i18n Resource Loader
11
+ *
12
+ * Scans module directories for `i18n/*.translation.json` files
13
+ * and builds a resource map keyed by language and namespace.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const loader = new I18nLoader("./src/modules");
18
+ * const resources = loader.loadAll();
19
+ * // { en: { auth: { ... }, users: { ... } }, fr: { auth: { ... } } }
20
+ * ```
21
+ */
22
+ export class I18nLoader {
23
+ resources = {};
24
+ modulesDir;
25
+ constructor(modulesDir) {
26
+ this.modulesDir = modulesDir;
27
+ }
28
+ /**
29
+ * Load translations from a specific directory into a namespace
30
+ */
31
+ loadTranslationsFromDir(dir, namespace) {
32
+ if (!existsSync(dir))
33
+ return;
34
+ const files = readdirSync(dir).filter((f) => f.endsWith(".translation.json"));
35
+ for (const file of files) {
36
+ const lang = file.split(".")[0];
37
+ const filePath = join(dir, file);
38
+ try {
39
+ const content = JSON.parse(readFileSync(filePath, "utf-8"));
40
+ if (!this.resources[lang]) {
41
+ this.resources[lang] = {};
42
+ }
43
+ this.resources[lang][namespace] = content;
44
+ }
45
+ catch (err) {
46
+ console.warn(`[Wecon] Failed to load translation file ${filePath}:`, err);
47
+ }
48
+ }
49
+ }
50
+ /**
51
+ * Load all translations from the modules directory
52
+ *
53
+ * Discovers module directories and scans each for an `i18n/` subdirectory
54
+ * containing `*.translation.json` files.
55
+ */
56
+ loadAll() {
57
+ this.resources = {};
58
+ if (!existsSync(this.modulesDir)) {
59
+ console.warn(`[Wecon] Modules directory not found: ${this.modulesDir}`);
60
+ return this.resources;
61
+ }
62
+ // Scan each subdirectory in modulesDir for i18n/ folders
63
+ const entries = readdirSync(this.modulesDir, { withFileTypes: true });
64
+ for (const entry of entries) {
65
+ if (!entry.isDirectory())
66
+ continue;
67
+ const i18nDir = join(this.modulesDir, entry.name, "i18n");
68
+ this.loadTranslationsFromDir(i18nDir, entry.name);
69
+ }
70
+ return this.resources;
71
+ }
72
+ /**
73
+ * Get the loaded resources
74
+ */
75
+ getResources() {
76
+ return this.resources;
77
+ }
78
+ /**
79
+ * Get all supported languages discovered from translation files
80
+ */
81
+ getSupportedLanguages() {
82
+ return Object.keys(this.resources);
83
+ }
84
+ /**
85
+ * Get all namespaces discovered from module directories
86
+ */
87
+ getNamespaces() {
88
+ const ns = new Set();
89
+ for (const lang of Object.keys(this.resources)) {
90
+ for (const namespace of Object.keys(this.resources[lang])) {
91
+ ns.add(namespace);
92
+ }
93
+ }
94
+ return Array.from(ns);
95
+ }
96
+ }
97
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/i18n/loader.ts"],"names":[],"mappings":"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"}