@saolabs/client 1.2.1 → 1.5.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.
- package/README.md +12 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/src/core/app/Application.d.ts +2 -0
- package/dist/src/core/app/Application.d.ts.map +1 -1
- package/dist/src/core/app/Application.js +7 -0
- package/dist/src/core/app/Application.js.map +1 -1
- package/dist/src/core/bootstrap/app.d.ts.map +1 -1
- package/dist/src/core/bootstrap/app.js +8 -2
- package/dist/src/core/bootstrap/app.js.map +1 -1
- package/dist/src/core/bootstrap/bundle.d.ts +7 -3
- package/dist/src/core/bootstrap/bundle.d.ts.map +1 -1
- package/dist/src/core/bootstrap/bundle.js +84 -7
- package/dist/src/core/bootstrap/bundle.js.map +1 -1
- package/dist/src/core/bootstrap/providers/default-providers.d.ts.map +1 -1
- package/dist/src/core/bootstrap/providers/default-providers.js +11 -3
- package/dist/src/core/bootstrap/providers/default-providers.js.map +1 -1
- package/dist/src/core/contracts/BundleInterface.d.ts +29 -0
- package/dist/src/core/contracts/BundleInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/HelperInterface.d.ts +6 -0
- package/dist/src/core/contracts/HelperInterface.d.ts.map +1 -1
- package/dist/src/core/elements/Html.d.ts.map +1 -1
- package/dist/src/core/elements/Html.js +7 -0
- package/dist/src/core/elements/Html.js.map +1 -1
- package/dist/src/core/routers/Router.d.ts +3 -0
- package/dist/src/core/routers/Router.d.ts.map +1 -1
- package/dist/src/core/routers/Router.js +24 -3
- package/dist/src/core/routers/Router.js.map +1 -1
- package/dist/src/core/services/HelperService.d.ts +7 -0
- package/dist/src/core/services/HelperService.d.ts.map +1 -1
- package/dist/src/core/services/HelperService.js +35 -0
- package/dist/src/core/services/HelperService.js.map +1 -1
- package/dist/src/core/services/TranslationService.d.ts +19 -1
- package/dist/src/core/services/TranslationService.d.ts.map +1 -1
- package/dist/src/core/services/TranslationService.js +62 -6
- package/dist/src/core/services/TranslationService.js.map +1 -1
- package/dist/src/core/view/ViewManager.d.ts.map +1 -1
- package/dist/src/core/view/ViewManager.js +4 -0
- package/dist/src/core/view/ViewManager.js.map +1 -1
- package/index.ts +1 -1
- package/package.json +3 -2
- package/src/core/app/Application.ts +6 -0
- package/src/core/bootstrap/app.ts +9 -3
- package/src/core/bootstrap/bundle.ts +83 -7
- package/src/core/bootstrap/providers/default-providers.ts +9 -3
- package/src/core/contracts/BundleInterface.ts +31 -0
- package/src/core/contracts/HelperInterface.ts +7 -1
- package/src/core/elements/Html.ts +7 -0
- package/src/core/routers/Router.ts +22 -3
- package/src/core/services/HelperService.ts +36 -1
- package/src/core/services/TranslationService.ts +62 -4
- package/src/core/view/ViewManager.ts +2 -0
package/README.md
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
# @saolabs/client
|
|
2
2
|
|
|
3
|
+
Coordinated admin alpha compatibility: see [release notes](RELEASE.md).
|
|
4
|
+
|
|
3
5
|
Runtime TypeScript phía trình duyệt của Saola: hydration HTML do Laravel render,
|
|
4
6
|
state, component, điều hướng SPA và vòng đời tài nguyên.
|
|
5
7
|
|
|
8
|
+
Ngôn ngữ DB: [Language System](https://github.com/saolabs/admin/blob/main/docs/LANGUAGE_SYSTEM_PLAN.md). `App.Helper.text()` đọc `catalogs[locale] = { scope, revision, messages: tree }`; `installLanguage/loadLanguage` nạp/thay snapshot lúc chạy. `changeLanguage(locale, loader, guard)` kiểm form trước/sau fetch, bỏ yêu cầu cũ rồi chuyển locale. Page-data `i18n` cập nhật snapshot trước render, cùng scope giữ locale đã chọn. Legacy `messages.json/groups` dành cho `trans`/`choice` và helper `__` gọi trực tiếp; compiler mới hạ `__()` trong `.sao` xuống `text()`.
|
|
9
|
+
|
|
10
|
+
Form có thể dùng `App.Router.addNavigationGuard(guard)` để bổ sung guard mà giữ `beforeEach` của host; API trả disposer. Gỡ guard khi pause/destroy, đăng ký lại khi resume. `false` chặn trước mount/history; Back bị chặn khôi phục URL cho cả history/hash. Guard này độc lập guard đổi ngôn ngữ; xem [Settings renderer](https://github.com/saolabs/admin/blob/main/docs/SETTINGS.md) về draft, CSRF và lifecycle.
|
|
11
|
+
|
|
6
12
|
## Bắt đầu
|
|
7
13
|
|
|
8
14
|
```bash
|
|
@@ -60,14 +66,19 @@ app và theme dùng cùng một runtime; xem [bootstrap](docs/BOOTSTRAP_PROVIDER
|
|
|
60
66
|
npm run build # ESM JS và declarations
|
|
61
67
|
npm run typecheck # Kiểm source, không emit
|
|
62
68
|
npm test # Runtime + compile-to-mount contract tests
|
|
69
|
+
npm run test:package # Standalone boot/catalog/navigation checks, không cần sibling/PHP
|
|
63
70
|
npm run check-exports # Pack thật; kiểm 3 entry và types trong consumer tạm
|
|
64
71
|
```
|
|
65
72
|
|
|
66
73
|
`check-exports` không publish. Nó kiểm native ESM, dynamic import từ CommonJS,
|
|
67
74
|
mount view qua package đã đóng và TypeScript NodeNext, không dùng alias source.
|
|
68
|
-
Bộ test compile fixture cần sibling `builder/`, `compiler/`, `saola/` trong
|
|
75
|
+
Bộ test compile fixture cần sibling `builder/`, `compiler/`, `saola/`, `admin/` trong
|
|
69
76
|
workspace hệ sinh thái. Thiếu builder là lỗi kiểm tra, không tự bỏ qua test.
|
|
70
77
|
|
|
78
|
+
GitHub Actions kiểm package trên Node 20/22/24: typecheck, build, đối chiếu `dist`
|
|
79
|
+
đã commit, `test:package` và consumer từ tarball thật. Bộ `npm test` đầy đủ vẫn
|
|
80
|
+
chạy trong workspace hệ sinh thái; CI package không thay thế kiểm SSR/admin đó.
|
|
81
|
+
|
|
71
82
|
## Tài liệu
|
|
72
83
|
|
|
73
84
|
- [Runtime API](docs/RUNTIME_API_SPEC.md)
|
package/dist/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export { Application } from './src/core/app/Application.js';
|
|
|
6
6
|
export { app } from './src/core/helpers/app.js';
|
|
7
7
|
export { default as App } from './src/core/bootstrap/app.js';
|
|
8
8
|
export { defineBundle, loadBundles, mergeBundles, bootBundles } from './src/core/bootstrap/bundle.js';
|
|
9
|
-
export type { SaolaBundle, MergedBundles, ViewFactory } from './src/core/contracts/BundleInterface.js';
|
|
9
|
+
export type { SaolaBundle, MergedBundles, ViewFactory, ServiceFactory, MergeOptions } from './src/core/contracts/BundleInterface.js';
|
|
10
10
|
export { ServiceProvider } from './src/core/bootstrap/providers/ServiceProvider.js';
|
|
11
11
|
export { PROVIDER_NAMES, resolveProviderOrder } from './src/core/bootstrap/providers/provider-order.js';
|
|
12
12
|
export type { NamedServiceProvider, ProviderName } from './src/core/bootstrap/providers/provider-order.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,6BAA6B,CAAC;AAG7D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AACtG,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
|
@@ -63,6 +63,8 @@ export declare class Application implements ApplicationInterface {
|
|
|
63
63
|
/** Đã boot chưa */
|
|
64
64
|
private booted;
|
|
65
65
|
private ownProperties;
|
|
66
|
+
/** Bật bởi config.strictBundles: ghi đè khoá bị khoá thì ném lỗi thay vì bỏ qua im lặng. */
|
|
67
|
+
strictBundles: boolean;
|
|
66
68
|
__store: Map<any, {
|
|
67
69
|
isOverridable: boolean;
|
|
68
70
|
value: any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Application.d.ts","sourceRoot":"","sources":["../../../../src/core/app/Application.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAC7H,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AACzF,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AACnF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AACnF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AACvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AACrF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAW,MAAM,mBAAmB,CAAC;AAI3D,qBAAa,WAAY,YAAW,oBAAoB;IACpD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAuB;IAE9C,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,oBAAoB,CAAC;IAC3B,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,EAAE,oBAAoB,CAAC;IAC3B,GAAG,EAAE,kBAAkB,CAAC;IACxB,KAAK,EAAE,qBAAqB,CAAC;IAC7B,OAAO,EAAE,uBAAuB,CAAC;IACjC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,IAAI,EAAE,oBAAoB,CAAC;IAEnC,qEAAqE;IACrE,OAAO,CAAC,QAAQ,CAA8C;IAE9D,+CAA+C;IAC/C,OAAO,CAAC,UAAU,CAA8B;IAEhD,uCAAuC;IACvC,OAAO,CAAC,OAAO,CAA0C;IAEzD,mCAAmC;IACnC,OAAO,CAAC,SAAS,CAAkC;IAEnD,mBAAmB;IACnB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,aAAa,
|
|
1
|
+
{"version":3,"file":"Application.d.ts","sourceRoot":"","sources":["../../../../src/core/app/Application.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAC7H,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AACzF,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AACnF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AACnF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AACvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AACrF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAW,MAAM,mBAAmB,CAAC;AAI3D,qBAAa,WAAY,YAAW,oBAAoB;IACpD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAuB;IAE9C,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,oBAAoB,CAAC;IAC3B,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,EAAE,oBAAoB,CAAC;IAC3B,GAAG,EAAE,kBAAkB,CAAC;IACxB,KAAK,EAAE,qBAAqB,CAAC;IAC7B,OAAO,EAAE,uBAAuB,CAAC;IACjC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,IAAI,EAAE,oBAAoB,CAAC;IAEnC,qEAAqE;IACrE,OAAO,CAAC,QAAQ,CAA8C;IAE9D,+CAA+C;IAC/C,OAAO,CAAC,UAAU,CAA8B;IAEhD,uCAAuC;IACvC,OAAO,CAAC,OAAO,CAA0C;IAEzD,mCAAmC;IACnC,OAAO,CAAC,SAAS,CAAkC;IAEnD,mBAAmB;IACnB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,aAAa,CA0BnB;IAEF,4FAA4F;IAC5F,aAAa,UAAS;IAEtB,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE;QAAE,aAAa,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAE,CAAC,CAAa;IAEtE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;;IAMnB;;;;;;;OAOG;IACH,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAUhE,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAM3D;;;;;;;;OAQG;IACH,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;IAgCrE;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAmB/C;;;;;;;OAOG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI;IAOpD;;;;;OAKG;IACH,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC;IAIhD;;;;;;;;;;OAUG;IACH,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC;IAuCnD,uCAAuC;IACvC,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IAM7B,sBAAsB;IACtB,KAAK,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IAM/B;;;;;;;;;OASG;IACH,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI;IAkBlD;;;;OAIG;IACH,IAAI,IAAI,IAAI;IAYZ,mBAAmB;IACnB,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAID,2EAA2E;IAC3E,KAAK,IAAI,IAAI;IASb,oCAAoC;IACpC,OAAO,IAAI,IAAI;IAMf,WAAW,IAAI,GAAG,CAAC,UAAU,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;IAInD,aAAa,IAAI,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC;IAKrC,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAE,OAAe,GAAG,IAAI;IA4B/D,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IAgB1B;;;;;;OAMG;IACH,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC;IAM9C,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAE,OAAe,GAAG,IAAI;CA2B1E"}
|
|
@@ -66,7 +66,10 @@ export class Application {
|
|
|
66
66
|
'getSingletons',
|
|
67
67
|
'shared',
|
|
68
68
|
'__store',
|
|
69
|
+
'strictBundles',
|
|
69
70
|
]; // Để track dynamic properties nếu cần
|
|
71
|
+
/** Bật bởi config.strictBundles: ghi đè khoá bị khoá thì ném lỗi thay vì bỏ qua im lặng. */
|
|
72
|
+
this.strictBundles = false;
|
|
70
73
|
this.__store = new Map(); // Store cho dynamic properties nếu cần
|
|
71
74
|
}
|
|
72
75
|
// ─── Transient (factory — instance mới mỗi lần) ───────────
|
|
@@ -295,10 +298,14 @@ export class Application {
|
|
|
295
298
|
}
|
|
296
299
|
set(name, value, isOne = false) {
|
|
297
300
|
if (this.__store.has(name) && this.__store.get(name)?.isOverridable === false) {
|
|
301
|
+
if (this.strictBundles)
|
|
302
|
+
throw new Error(`[Application] Khoá "${String(name)}" đã bị khoá, không ghi đè được.`);
|
|
298
303
|
return; // Không cho ghi đè lên thuộc tính không thể override
|
|
299
304
|
}
|
|
300
305
|
const isString = typeof name === 'string';
|
|
301
306
|
if (isString && this.ownProperties.includes(name)) {
|
|
307
|
+
if (this.strictBundles)
|
|
308
|
+
throw new Error(`[Application] "${name}" là thuộc tính có sẵn của App, không đăng ký đè được.`);
|
|
302
309
|
return; // Không cho ghi đè lên thuộc tính có sẵn
|
|
303
310
|
}
|
|
304
311
|
this.__store.set(name, { value, isOverridable: !isOne });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Application.js","sourceRoot":"","sources":["../../../../src/core/app/Application.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAaH,OAAO,EAAiB,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE3D,mEAAmE;AAEnE,MAAM,OAAO,WAAW;
|
|
1
|
+
{"version":3,"file":"Application.js","sourceRoot":"","sources":["../../../../src/core/app/Application.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../../src/core/bootstrap/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAQ5E,QAAA,MAAM,GAAG,EAAE,oBAAkD,CAAC;
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../../src/core/bootstrap/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAQ5E,QAAA,MAAM,GAAG,EAAE,oBAAkD,CAAC;AAqI9D,eAAe,GAAG,CAAC"}
|
|
@@ -100,7 +100,13 @@ App.setMethod('start', async function (config) {
|
|
|
100
100
|
// Bundle nạp rời (theme…): server phát danh sách URL trong
|
|
101
101
|
// APP_CONFIGS.bundles. Phải await TRƯỚC init để view/service/provider
|
|
102
102
|
// của chúng có mặt lúc provider boot và lúc render route đầu.
|
|
103
|
-
bundles = await loadBundles(cfg.bundles
|
|
103
|
+
bundles = await loadBundles(cfg.bundles, {
|
|
104
|
+
strict: !!cfg.strictBundles,
|
|
105
|
+
overridable: cfg.overridable,
|
|
106
|
+
themeNamespaces: cfg.themeNamespaces,
|
|
107
|
+
bundleKinds: cfg.bundleKinds,
|
|
108
|
+
initialBundle: cfg.strictBundles ? { name: 'application source', services: cfg.services, helpers: cfg.helpers, providers: cfg.providers } : undefined,
|
|
109
|
+
});
|
|
104
110
|
cfg.view = {
|
|
105
111
|
...(cfg.view || {}),
|
|
106
112
|
// Bundle nạp sau ĐÈ registry của app — đúng ngữ nghĩa overlay theme.
|
|
@@ -108,7 +114,7 @@ App.setMethod('start', async function (config) {
|
|
|
108
114
|
};
|
|
109
115
|
cfg.services = { ...(cfg.services || {}), ...bundles.services };
|
|
110
116
|
cfg.helpers = { ...(cfg.helpers || {}), ...bundles.helpers };
|
|
111
|
-
cfg.providers = [...(cfg.providers || []), ...bundles.providers];
|
|
117
|
+
cfg.providers = cfg.strictBundles ? bundles.providers : [...(cfg.providers || []), ...bundles.providers];
|
|
112
118
|
App.init(cfg);
|
|
113
119
|
bootBundles(bundles, App);
|
|
114
120
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../../src/core/bootstrap/app.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../../src/core/bootstrap/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* docs/EXTENSION_ARCHITECTURE.md §7.
|
|
9
9
|
*/
|
|
10
10
|
import type { ApplicationInterface } from "../contracts/ApplicationInterface.js";
|
|
11
|
-
import type { MergedBundles, SaolaBundle } from "../contracts/BundleInterface.js";
|
|
11
|
+
import type { MergeOptions, MergedBundles, SaolaBundle } from "../contracts/BundleInterface.js";
|
|
12
12
|
/**
|
|
13
13
|
* Khai báo một bundle. Chỉ là identity + kiểu — nó tồn tại để tên khoá là HỢP
|
|
14
14
|
* ĐỒNG chứ không phải quy ước truyền miệng, và để IDE gợi ý được.
|
|
@@ -24,8 +24,12 @@ export declare function defineBundle(bundle: SaolaBundle): SaolaBundle;
|
|
|
24
24
|
* Gộp nhiều manifest theo ĐÚNG THỨ TỰ mảng — không theo thứ tự resolve của
|
|
25
25
|
* mạng. Bundle sau ĐÈ bundle trước ở `views`/`services`/`helpers`; `providers`
|
|
26
26
|
* thì CỘNG THÊM chứ không thay, để một bundle không gỡ được provider của app.
|
|
27
|
+
*
|
|
28
|
+
* `opts.strict` bật hàng rào của hợp đồng gói context: bundle trùng khoá không
|
|
29
|
+
* có `overrides` hợp lệ, hoặc theme khai khoá ngoài phạm vi, bị BỎ NGUYÊN CẢ
|
|
30
|
+
* BUNDLE và ghi vào `failed` (không làm sập boot). Provider trùng `name` bị bỏ.
|
|
27
31
|
*/
|
|
28
|
-
export declare function mergeBundles(bundles: Array<SaolaBundle | null | undefined
|
|
32
|
+
export declare function mergeBundles(bundles: Array<SaolaBundle | null | undefined>, opts?: MergeOptions): MergedBundles;
|
|
29
33
|
/**
|
|
30
34
|
* Nạp danh sách URL bundle rồi gộp lại.
|
|
31
35
|
*
|
|
@@ -35,7 +39,7 @@ export declare function mergeBundles(bundles: Array<SaolaBundle | null | undefin
|
|
|
35
39
|
* Một URL hỏng KHÔNG làm sập boot: ghi vào `failed` rồi đi tiếp. Theme lỗi thì
|
|
36
40
|
* site chạy bằng view gốc, còn hơn trắng trang.
|
|
37
41
|
*/
|
|
38
|
-
export declare function loadBundles(urls: string[] | null | undefined): Promise<MergedBundles>;
|
|
42
|
+
export declare function loadBundles(urls: string[] | null | undefined, opts?: MergeOptions): Promise<MergedBundles>;
|
|
39
43
|
/** Chạy `boot()` của các bundle, sau khi App đã init. Lỗi một cái không chặn cái sau. */
|
|
40
44
|
export declare function bootBundles(merged: MergedBundles, app: ApplicationInterface): void;
|
|
41
45
|
//# sourceMappingURL=bundle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../../../src/core/bootstrap/bundle.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../../../src/core/bootstrap/bundle.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAGhG;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAE7D;AAmCD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,IAAI,GAAE,YAAiB,GAAG,aAAa,CA2CnH;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAyCpH;AAED,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,oBAAoB,GAAG,IAAI,CAQlF"}
|
|
@@ -24,25 +24,87 @@ export function defineBundle(bundle) {
|
|
|
24
24
|
function emptyMerged() {
|
|
25
25
|
return { providers: [], services: {}, helpers: {}, views: {}, boots: [], loaded: [], failed: [] };
|
|
26
26
|
}
|
|
27
|
+
/** `A.B` phủ chính nó và `A.B.x`. */
|
|
28
|
+
function covered(list, key) {
|
|
29
|
+
return !!list?.some(p => key === p || key.startsWith(p + '.'));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Lý do bundle bị từ chối ở chế độ strict, hoặc null nếu hợp lệ.
|
|
33
|
+
* `owners` = khoá → tên bundle đã khai trước đó.
|
|
34
|
+
*/
|
|
35
|
+
function rejectReason(b, name, owners, o, kind) {
|
|
36
|
+
if (kind === 'theme') {
|
|
37
|
+
if (b.providers?.length)
|
|
38
|
+
return `theme "${name}" không được khai providers`;
|
|
39
|
+
for (const key of [...Object.keys(b.services ?? {}), ...Object.keys(b.helpers ?? {})]) {
|
|
40
|
+
if (!covered(o.themeNamespaces, key))
|
|
41
|
+
return `theme "${name}" khai khoá "${key}" ngoài namespace trình bày cho phép`;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
for (const [group, map] of [['services', b.services], ['helpers', b.helpers], ['views', b.views]]) {
|
|
45
|
+
for (const key of Object.keys(map ?? {})) {
|
|
46
|
+
const id = `${group}:${key}`;
|
|
47
|
+
const prev = owners.get(id);
|
|
48
|
+
if (!prev)
|
|
49
|
+
continue;
|
|
50
|
+
// Override hợp lệ = bundle khai rõ VÀ context cho phép khoá đó.
|
|
51
|
+
if (b.overrides?.includes(key) && covered(o.overridable, key))
|
|
52
|
+
continue;
|
|
53
|
+
return `${group} "${key}" trùng giữa "${prev}" và "${name}" (không có overrides hợp lệ)`;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
27
58
|
/**
|
|
28
59
|
* Gộp nhiều manifest theo ĐÚNG THỨ TỰ mảng — không theo thứ tự resolve của
|
|
29
60
|
* mạng. Bundle sau ĐÈ bundle trước ở `views`/`services`/`helpers`; `providers`
|
|
30
61
|
* thì CỘNG THÊM chứ không thay, để một bundle không gỡ được provider của app.
|
|
62
|
+
*
|
|
63
|
+
* `opts.strict` bật hàng rào của hợp đồng gói context: bundle trùng khoá không
|
|
64
|
+
* có `overrides` hợp lệ, hoặc theme khai khoá ngoài phạm vi, bị BỎ NGUYÊN CẢ
|
|
65
|
+
* BUNDLE và ghi vào `failed` (không làm sập boot). Provider trùng `name` bị bỏ.
|
|
31
66
|
*/
|
|
32
|
-
export function mergeBundles(bundles) {
|
|
67
|
+
export function mergeBundles(bundles, opts = {}) {
|
|
33
68
|
const out = emptyMerged();
|
|
69
|
+
const owners = new Map();
|
|
70
|
+
const providerNames = new Set();
|
|
34
71
|
for (const bundle of bundles) {
|
|
35
72
|
if (!bundle || typeof bundle !== 'object')
|
|
36
73
|
continue;
|
|
37
|
-
|
|
38
|
-
if (
|
|
39
|
-
|
|
74
|
+
const name = bundle.name ?? '(không tên)';
|
|
75
|
+
if (opts.strict) {
|
|
76
|
+
const kind = opts.kind ?? bundle.kind ?? 'package';
|
|
77
|
+
const why = rejectReason(bundle, name, owners, opts, kind);
|
|
78
|
+
if (why) {
|
|
79
|
+
out.failed.push([name, why]);
|
|
80
|
+
logger.error(`[Bundle] Bỏ bundle: ${why}`);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
out.loaded.push(name);
|
|
85
|
+
if (Array.isArray(bundle.providers)) {
|
|
86
|
+
for (const p of bundle.providers) {
|
|
87
|
+
const pn = p && typeof p === 'object' ? p.name : undefined;
|
|
88
|
+
if (opts.strict && typeof pn === 'string') {
|
|
89
|
+
if (providerNames.has(pn)) {
|
|
90
|
+
out.failed.push([name, `provider "${pn}" trùng tên, bỏ`]);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
providerNames.add(pn);
|
|
94
|
+
}
|
|
95
|
+
out.providers.push(p);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
40
98
|
if (bundle.services)
|
|
41
99
|
Object.assign(out.services, bundle.services);
|
|
42
100
|
if (bundle.helpers)
|
|
43
101
|
Object.assign(out.helpers, bundle.helpers);
|
|
44
102
|
if (bundle.views)
|
|
45
103
|
Object.assign(out.views, bundle.views);
|
|
104
|
+
for (const [group, map] of [['services', bundle.services], ['helpers', bundle.helpers], ['views', bundle.views]]) {
|
|
105
|
+
for (const key of Object.keys(map ?? {}))
|
|
106
|
+
owners.set(`${group}:${key}`, name);
|
|
107
|
+
}
|
|
46
108
|
if (typeof bundle.boot === 'function')
|
|
47
109
|
out.boots.push(bundle.boot.bind(bundle));
|
|
48
110
|
}
|
|
@@ -57,9 +119,9 @@ export function mergeBundles(bundles) {
|
|
|
57
119
|
* Một URL hỏng KHÔNG làm sập boot: ghi vào `failed` rồi đi tiếp. Theme lỗi thì
|
|
58
120
|
* site chạy bằng view gốc, còn hơn trắng trang.
|
|
59
121
|
*/
|
|
60
|
-
export async function loadBundles(urls) {
|
|
122
|
+
export async function loadBundles(urls, opts = {}) {
|
|
61
123
|
if (!Array.isArray(urls) || urls.length === 0)
|
|
62
|
-
return
|
|
124
|
+
return mergeBundles(opts.initialBundle ? [opts.initialBundle] : [], opts);
|
|
63
125
|
const results = await Promise.all(urls.map(async (url) => {
|
|
64
126
|
try {
|
|
65
127
|
// URL đến từ runtime nên bundler không phân tích tĩnh được — đúng ý
|
|
@@ -75,7 +137,22 @@ export async function loadBundles(urls) {
|
|
|
75
137
|
return [url, null, String(err)];
|
|
76
138
|
}
|
|
77
139
|
}));
|
|
78
|
-
const
|
|
140
|
+
const classificationErrors = [];
|
|
141
|
+
const classified = results.map(([url, bundle]) => {
|
|
142
|
+
if (!bundle)
|
|
143
|
+
return null;
|
|
144
|
+
const kind = opts.bundleKinds?.[url];
|
|
145
|
+
if (opts.strict && opts.bundleKinds && kind !== 'package' && kind !== 'theme') {
|
|
146
|
+
classificationErrors.push([url, 'Missing trusted bundle kind from server']);
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
return kind ? { ...bundle, kind } : bundle;
|
|
150
|
+
});
|
|
151
|
+
const merged = mergeBundles([opts.initialBundle, ...classified], opts);
|
|
152
|
+
for (const failure of classificationErrors) {
|
|
153
|
+
merged.failed.push(failure);
|
|
154
|
+
logger.error(`[Bundle] ${failure[1]}: ${failure[0]}`);
|
|
155
|
+
}
|
|
79
156
|
for (const [url, , error] of results) {
|
|
80
157
|
if (error) {
|
|
81
158
|
merged.failed.push([url, error]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../../../src/core/bootstrap/bundle.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,MAAM,MAAM,8BAA8B,CAAC;AAElD;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,MAAmB;IAC5C,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAS,WAAW;IAChB,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACtG,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../../../src/core/bootstrap/bundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-providers.d.ts","sourceRoot":"","sources":["../../../../../src/core/bootstrap/providers/default-providers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAkB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"default-providers.d.ts","sourceRoot":"","sources":["../../../../../src/core/bootstrap/providers/default-providers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAkB,MAAM,qBAAqB,CAAC;AA6E3E;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAAG,oBAAoB,EAAE,CA4C9F"}
|
|
@@ -16,11 +16,13 @@ const SYSTEM_SERVICE_KEYS = new Set(['Store', 'Storage', 'Event', 'Http', 'View'
|
|
|
16
16
|
* services: { Auth: AuthService, Toast: ToastService }
|
|
17
17
|
* → 2 providers, mỗi cái dependsOn ['core'], register = app.set(name, new Class(app))
|
|
18
18
|
*/
|
|
19
|
-
function servicesFromMap(map) {
|
|
19
|
+
function servicesFromMap(map, strict = false) {
|
|
20
20
|
const appInstance = app();
|
|
21
21
|
return Object.entries(map)
|
|
22
22
|
.filter(([name]) => {
|
|
23
23
|
if (SYSTEM_SERVICE_KEYS.has(name)) {
|
|
24
|
+
if (strict)
|
|
25
|
+
throw new Error(`[Bootstrap] Không được ghi đè service hệ thống "${name}" qua config.services.`);
|
|
24
26
|
console.warn(`[Bootstrap] Cannot override system service "${name}" via config.services. Ignored.`);
|
|
25
27
|
return false;
|
|
26
28
|
}
|
|
@@ -34,7 +36,9 @@ function servicesFromMap(map) {
|
|
|
34
36
|
// không phải class — `new` vô điều kiện sẽ ném "is not a
|
|
35
37
|
// constructor". Chỉ dựng khi thật sự là class.
|
|
36
38
|
const isClass = typeof value === 'function' && value.prototype;
|
|
37
|
-
|
|
39
|
+
// Dạng `{ factory }`: mỗi Application dựng instance riêng.
|
|
40
|
+
const isFactory = !!value && typeof value === 'object' && typeof value.factory === 'function';
|
|
41
|
+
appInstance.set(name, isClass ? new value(appInstance) : isFactory ? value.factory(appInstance) : value);
|
|
38
42
|
}
|
|
39
43
|
}));
|
|
40
44
|
}
|
|
@@ -80,6 +84,8 @@ export function buildDefaultProviders(config = {}) {
|
|
|
80
84
|
HelperServiceProvider.config = { i18n: config.i18n };
|
|
81
85
|
ApiServiceProvider.config = config.api || {};
|
|
82
86
|
const App = app();
|
|
87
|
+
const strict = !!config.strictBundles;
|
|
88
|
+
App.strictBundles = strict;
|
|
83
89
|
const defaults = [
|
|
84
90
|
CoreServiceProvider,
|
|
85
91
|
ViewServiceProvider,
|
|
@@ -89,7 +95,7 @@ export function buildDefaultProviders(config = {}) {
|
|
|
89
95
|
].map(Cls => new Cls(App));
|
|
90
96
|
// config.services: { Name: Class } → auto-wrap providers
|
|
91
97
|
const serviceProviders = config.services
|
|
92
|
-
? servicesFromMap(config.services)
|
|
98
|
+
? servicesFromMap(config.services, strict)
|
|
93
99
|
: [];
|
|
94
100
|
// config.helpers: { tên: fn } → một provider phụ thuộc `helper`
|
|
95
101
|
const helperProviders = config.helpers
|
|
@@ -101,6 +107,8 @@ export function buildDefaultProviders(config = {}) {
|
|
|
101
107
|
.map((p) => typeof p === 'function' ? new p(App) : p)
|
|
102
108
|
.filter(p => {
|
|
103
109
|
if (SYSTEM_PROVIDER_NAMES.has(p.name)) {
|
|
110
|
+
if (strict)
|
|
111
|
+
throw new Error(`[Bootstrap] Không được ghi đè provider hệ thống "${p.name}".`);
|
|
104
112
|
console.warn(`[Bootstrap] Cannot override system provider "${p.name}". Ignored.`);
|
|
105
113
|
return false;
|
|
106
114
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-providers.js","sourceRoot":"","sources":["../../../../../src/core/bootstrap/providers/default-providers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EAAwB,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAO/D,qDAAqD;AACrD,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;AAErE,sEAAsE;AACtE,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAE9G;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,GAAwB;
|
|
1
|
+
{"version":3,"file":"default-providers.js","sourceRoot":"","sources":["../../../../../src/core/bootstrap/providers/default-providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,9 +20,38 @@ export interface SaolaBundle {
|
|
|
20
20
|
helpers?: Record<string, any>;
|
|
21
21
|
/** { 'dot.path': factory } → View.setViewRegistry(). Nạp sau ĐÈ nạp trước. */
|
|
22
22
|
views?: Record<string, ViewFactory>;
|
|
23
|
+
/**
|
|
24
|
+
* Khoá (service/helper/view) bundle này CỐ Ý thay của bundle trước. Chỉ có hiệu
|
|
25
|
+
* lực ở chế độ strict và chỉ khi khoá nằm trong `overridable` của context.
|
|
26
|
+
*/
|
|
27
|
+
overrides?: string[];
|
|
28
|
+
/** `'theme'` = lớp trình bày, bị giới hạn khoá (xem MergeOptions.themeNamespaces). */
|
|
29
|
+
kind?: 'theme' | 'package';
|
|
23
30
|
/** Chạy sau khi mọi bundle đã merge và App đã init. */
|
|
24
31
|
boot?(app: ApplicationInterface): void;
|
|
25
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Dạng khai service có factory: App gọi `factory(app)` khi đăng ký, nên mỗi
|
|
35
|
+
* Application có instance RIÊNG (không dùng instance tạo ở phạm vi module).
|
|
36
|
+
*/
|
|
37
|
+
export interface ServiceFactory<T = any> {
|
|
38
|
+
factory: (app: ApplicationInterface) => T;
|
|
39
|
+
}
|
|
40
|
+
/** Tuỳ chọn gộp bundle. Mặc định (không truyền) = hành vi cũ: sau đè trước, im lặng. */
|
|
41
|
+
export interface MergeOptions {
|
|
42
|
+
/** Bật kiểm: trùng khoá, provider trùng tên, giới hạn khoá của theme. */
|
|
43
|
+
strict?: boolean;
|
|
44
|
+
/** Khoá được phép `overrides`; mục `A.B` phủ cả `A.B.x`. */
|
|
45
|
+
overridable?: string[];
|
|
46
|
+
/** Với bundle `kind: 'theme'`: tiền tố khoá services/helpers được phép. Thiếu = không cho khoá nào. */
|
|
47
|
+
themeNamespaces?: string[];
|
|
48
|
+
/** Ép mọi bundle trong lượt gộp là loại này (server quyết, bundle không tự nâng quyền được). */
|
|
49
|
+
kind?: 'theme' | 'package';
|
|
50
|
+
/** Trusted server classification by URL; bundle contents cannot promote a theme. */
|
|
51
|
+
bundleKinds?: Record<string, 'theme' | 'package'>;
|
|
52
|
+
/** Already registered source services/providers participate in strict collision checks. */
|
|
53
|
+
initialBundle?: SaolaBundle;
|
|
54
|
+
}
|
|
26
55
|
/** Kết quả gộp nhiều bundle, theo đúng thứ tự mảng URL. */
|
|
27
56
|
export interface MergedBundles {
|
|
28
57
|
providers: (ServiceProviderInterface | any)[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BundleInterface.d.ts","sourceRoot":"","sources":["../../../../src/core/contracts/BundleInterface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAE9E,6EAA6E;AAC7E,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAE3E;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IACxB,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qFAAqF;IACrF,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;IAClB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpC,uDAAuD;IACvD,IAAI,CAAC,CAAC,GAAG,EAAE,oBAAoB,GAAG,IAAI,CAAC;CAC1C;AAED,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAE,CAAC,wBAAwB,GAAG,GAAG,CAAC,EAAE,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACnC,KAAK,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,oBAAoB,KAAK,IAAI,CAAC,CAAC;IAClD,6CAA6C;IAC7C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,uEAAuE;IACvE,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACnC"}
|
|
1
|
+
{"version":3,"file":"BundleInterface.d.ts","sourceRoot":"","sources":["../../../../src/core/contracts/BundleInterface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAE9E,6EAA6E;AAC7E,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAE3E;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IACxB,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qFAAqF;IACrF,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;IAClB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,sFAAsF;IACtF,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,uDAAuD;IACvD,IAAI,CAAC,CAAC,GAAG,EAAE,oBAAoB,GAAG,IAAI,CAAC;CAC1C;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,GAAG;IACnC,OAAO,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,CAAC,CAAC;CAC7C;AAED,wFAAwF;AACxF,MAAM,WAAW,YAAY;IACzB,yEAAyE;IACzE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,uGAAuG;IACvG,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,gGAAgG;IAChG,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC,CAAC;IAClD,2FAA2F;IAC3F,aAAa,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAE,CAAC,wBAAwB,GAAG,GAAG,CAAC,EAAE,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACnC,KAAK,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,oBAAoB,KAAK,IAAI,CAAC,CAAC;IAClD,6CAA6C;IAC7C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,uEAAuE;IACvE,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACnC"}
|
|
@@ -48,6 +48,12 @@ export interface CollectionProxyInterface {
|
|
|
48
48
|
export interface HelperInterface {
|
|
49
49
|
initTranslations(config: import('../services/TranslationService.js').TranslationConfig): void;
|
|
50
50
|
getLocale(): string;
|
|
51
|
+
getLanguageScope(): string | undefined;
|
|
52
|
+
applyLanguageConfig(config: import('../services/TranslationService.js').TranslationConfig): void;
|
|
53
|
+
text(key: string, replace?: Record<string, any> | string | null, defaultValue?: string | null, locale?: string): string;
|
|
54
|
+
installLanguage(locale: string, snapshot: import('../services/TranslationService.js').LanguageSnapshot): boolean;
|
|
55
|
+
loadLanguage(locale: string, load: (locale: string) => Promise<import('../services/TranslationService.js').LanguageSnapshot>): Promise<boolean>;
|
|
56
|
+
changeLanguage(locale: string, load: (locale: string) => Promise<import('../services/TranslationService.js').LanguageSnapshot>, canLeave?: () => boolean | Promise<boolean>): Promise<boolean>;
|
|
51
57
|
setLocale(locale: string): void;
|
|
52
58
|
__(key: string, replace?: Record<string, any>, locale?: string): string;
|
|
53
59
|
trans(key: string, replace?: Record<string, any>, locale?: string): string;
|