@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.
- package/README.md +460 -259
- package/dist/config.d.ts +7 -7
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +21 -43
- package/dist/config.js.map +1 -1
- package/dist/devtools/controllers/i18n.controller.d.ts +1 -1
- package/dist/devtools/controllers/i18n.controller.d.ts.map +1 -1
- package/dist/devtools/controllers/i18n.controller.js +19 -10
- package/dist/devtools/controllers/i18n.controller.js.map +1 -1
- package/dist/devtools/index.d.ts.map +1 -1
- package/dist/devtools/index.js +2 -0
- package/dist/devtools/index.js.map +1 -1
- package/dist/i18n/index.d.ts +13 -30
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +15 -91
- package/dist/i18n/index.js.map +1 -1
- package/dist/i18n/loader.d.ts +58 -0
- package/dist/i18n/loader.d.ts.map +1 -0
- package/dist/i18n/loader.js +97 -0
- package/dist/i18n/loader.js.map +1 -0
- package/dist/i18n/middleware.d.ts +39 -0
- package/dist/i18n/middleware.d.ts.map +1 -0
- package/dist/i18n/middleware.js +75 -0
- package/dist/i18n/middleware.js.map +1 -0
- package/dist/i18n/utils.d.ts +31 -0
- package/dist/i18n/utils.d.ts.map +1 -0
- package/dist/i18n/utils.js +46 -0
- package/dist/i18n/utils.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/module.d.ts +10 -0
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +25 -0
- package/dist/module.js.map +1 -1
- package/dist/server/banner.d.ts +1 -0
- package/dist/server/banner.d.ts.map +1 -1
- package/dist/server/banner.js +13 -2
- package/dist/server/banner.js.map +1 -1
- package/dist/server/index.d.ts +7 -3
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +20 -12
- package/dist/server/index.js.map +1 -1
- package/dist/types.d.ts +15 -13
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -4
- package/dist/devtools/client/assets/CopyButton-DIdtJD4_.js +0 -6
- package/dist/devtools/client/assets/ModuleDetail-Dx6eU87l.js +0 -1
- package/dist/devtools/client/assets/TranslationEditor-Bj654a_E.js +0 -11
- package/dist/devtools/client/assets/chevron-right-E9DzkOHY.js +0 -6
- package/dist/devtools/client/assets/copy-BvbhBv2y.js +0 -6
- package/dist/devtools/client/assets/index-B42p6IVr.js +0 -6
- package/dist/devtools/client/assets/index-CSkGspzD.js +0 -1
- package/dist/devtools/client/assets/index-CnAObNgT.js +0 -16
- package/dist/devtools/client/assets/index-CwJHaaYT.css +0 -1
- package/dist/devtools/client/assets/index-Dfe66IW7.js +0 -1
- package/dist/devtools/client/assets/index-DoHRi03N.js +0 -201
- package/dist/devtools/client/assets/index-DvvGoEUv.js +0 -1
- package/dist/devtools/client/assets/loader-circle-DoOjJ8vr.js +0 -6
- package/dist/devtools/client/assets/plus-Ca-xq8y8.js +0 -6
- package/dist/devtools/client/assets/save-CV1xmSXO.js +0 -11
- package/dist/devtools/client/assets/search-CpTZ4fXm.js +0 -6
- 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
|
|
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
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
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
|
|
34
|
+
* Resolve configuration by merging defaults with user-provided values
|
|
35
35
|
*
|
|
36
36
|
* @param config - The Wecon configuration
|
|
37
|
-
* @param mode -
|
|
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;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
|
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
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
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
|
-
|
|
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
|
|
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 -
|
|
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
|
-
//
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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);
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -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) =>
|
|
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,
|
|
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 {
|
|
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
|
|
13
|
+
return (_req, res) => {
|
|
14
14
|
try {
|
|
15
|
-
const
|
|
16
|
-
const
|
|
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:
|
|
19
|
-
keyCounts:
|
|
20
|
-
lang,
|
|
21
|
-
Object.keys(translations).length,
|
|
22
|
-
])),
|
|
30
|
+
languages: info.languages,
|
|
31
|
+
keyCounts: info.keyCounts,
|
|
23
32
|
}));
|
|
24
|
-
res.json({ success: true, data
|
|
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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGrC,OAAO,EAAE,
|
|
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,
|
|
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"}
|
package/dist/devtools/index.js
CHANGED
|
@@ -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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"}
|
package/dist/i18n/index.d.ts
CHANGED
|
@@ -1,37 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @weconjs/core - i18n
|
|
2
|
+
* @weconjs/core - i18n Module
|
|
3
3
|
*
|
|
4
|
-
*
|
|
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
|
-
*
|
|
18
|
-
*
|
|
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
|
|
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
|
-
*
|
|
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
|
|
19
|
+
export { initializeI18n as initI18n } from "./middleware.js";
|
|
37
20
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/i18n/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA
|
|
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"}
|
package/dist/i18n/index.js
CHANGED
|
@@ -1,98 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @weconjs/core - i18n
|
|
2
|
+
* @weconjs/core - i18n Module
|
|
3
3
|
*
|
|
4
|
-
*
|
|
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
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
*
|
|
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
|
|
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
|
package/dist/i18n/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA
|
|
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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"}
|