@asteby/metacore-runtime-react 31.1.0 → 32.0.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/CHANGELOG.md +24 -0
- package/dist/action-modal-dispatcher.d.ts +20 -0
- package/dist/action-modal-dispatcher.d.ts.map +1 -1
- package/dist/action-modal-dispatcher.js +3 -3
- package/dist/addon-fiber.d.ts +57 -0
- package/dist/addon-fiber.d.ts.map +1 -0
- package/dist/addon-fiber.js +122 -0
- package/dist/addon-loader.d.ts +19 -3
- package/dist/addon-loader.d.ts.map +1 -1
- package/dist/addon-loader.js +36 -37
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/permissions-manager.d.ts.map +1 -1
- package/dist/permissions-manager.js +29 -4
- package/package.json +3 -3
- package/src/__tests__/addon-fiber.test.ts +111 -0
- package/src/__tests__/prefill-from-record.test.ts +146 -0
- package/src/action-modal-dispatcher.tsx +4 -4
- package/src/addon-fiber.ts +155 -0
- package/src/addon-loader.tsx +66 -47
- package/src/index.ts +11 -0
- package/src/permissions-manager.tsx +69 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# @asteby/metacore-runtime-react
|
|
2
2
|
|
|
3
|
+
## 32.0.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 5a932ed: Addon fiber hot-swap without a page reload: Registry.scope/unbind, Plugin.register
|
|
8
|
+
may return a Disposable, AddonLoader re-registers federation remotes when `?v=`
|
|
9
|
+
changes, and purgeAddonFrontendCache drops only that addon's SW cache (L1).
|
|
10
|
+
Hosts call acknowledgeRunningVersion after a successful swap instead of
|
|
11
|
+
location.reload / unregistering the service worker.
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- 5a932ed: Export PrefillSpec helpers (`isPrefillSpec`, `buildPrefillRows`, `applyPrefillLock`)
|
|
16
|
+
so addons can unit-test `$prefillFromRecord` without reaching into private
|
|
17
|
+
dispatcher internals. Kernel now types the same shape in the v3 schema.
|
|
18
|
+
- Updated dependencies [5a932ed]
|
|
19
|
+
- @asteby/metacore-sdk@3.5.0
|
|
20
|
+
|
|
21
|
+
## 31.1.1
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- 00caf65: PermissionsManager: add "Otorgar todo"/"Quitar todo" buttons (all modules, not just the open one) and a "Otorgar todos los permisos" checkbox when creating a role — grants full catalog access immediately instead of requiring every module to be checked one by one.
|
|
26
|
+
|
|
3
27
|
## 31.1.0
|
|
4
28
|
|
|
5
29
|
### Minor Changes
|
|
@@ -1,4 +1,24 @@
|
|
|
1
|
+
import type { ActionFieldDef } from './types';
|
|
1
2
|
import { type ActionMetadata, type ActionModalProps } from '@asteby/metacore-sdk';
|
|
2
3
|
export type { ActionMetadata, ActionModalProps };
|
|
4
|
+
export interface PrefillSpec {
|
|
5
|
+
$prefillFromRecord: string;
|
|
6
|
+
map?: Record<string, string>;
|
|
7
|
+
remaining?: {
|
|
8
|
+
target: string;
|
|
9
|
+
of: string;
|
|
10
|
+
minus?: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Item-field keys to lock (render read-only) in the prefilled rows — e.g. the
|
|
14
|
+
* product of a receive-goods line is dictated by the source document, so it
|
|
15
|
+
* is shown as a resolved name but cannot be changed. Editable in the create
|
|
16
|
+
* flow (which carries no prefill spec); only the prefilled action locks them.
|
|
17
|
+
*/
|
|
18
|
+
lock?: string[];
|
|
19
|
+
}
|
|
20
|
+
export declare function isPrefillSpec(v: unknown): v is PrefillSpec;
|
|
21
|
+
export declare function applyPrefillLock(field: ActionFieldDef): ActionFieldDef;
|
|
22
|
+
export declare function buildPrefillRows(spec: PrefillSpec, record: any): Array<Record<string, any>>;
|
|
3
23
|
export declare function ActionModalDispatcher({ open, onOpenChange, action, model, record, endpoint, onSuccess, }: ActionModalProps): import("react").JSX.Element | null;
|
|
4
24
|
//# sourceMappingURL=action-modal-dispatcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-modal-dispatcher.d.ts","sourceRoot":"","sources":["../src/action-modal-dispatcher.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"action-modal-dispatcher.d.ts","sourceRoot":"","sources":["../src/action-modal-dispatcher.tsx"],"names":[],"mappings":"AA0DA,OAAO,KAAK,EAAE,cAAc,EAAmC,MAAM,SAAS,CAAA;AAE9E,OAAO,EACH,KAAK,cAAc,EACnB,KAAK,gBAAgB,EAExB,MAAM,sBAAsB,CAAA;AAE7B,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAA;AAiBhD,MAAM,WAAW,WAAW;IACxB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,SAAS,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1D;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,WAAW,CAM1D;AAsBD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,CAStE;AAGD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAkB3F;AAED,wBAAgB,qBAAqB,CAAC,EAClC,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,KAAK,EACL,MAAM,EACN,QAAQ,EACR,SAAS,GACZ,EAAE,gBAAgB,sCAoElB"}
|
|
@@ -28,7 +28,7 @@ import { useMetadataCache } from './metadata-cache';
|
|
|
28
28
|
import { ViewValue, objectLabel, relationSiblingValue, isLineItemsField as isRecordLineItemsField, } from './dialogs/dynamic-record';
|
|
29
29
|
// Canonical registry lives in @asteby/metacore-sdk
|
|
30
30
|
import { getActionComponent, } from '@asteby/metacore-sdk';
|
|
31
|
-
function isPrefillSpec(v) {
|
|
31
|
+
export function isPrefillSpec(v) {
|
|
32
32
|
return (typeof v === 'object' &&
|
|
33
33
|
v !== null &&
|
|
34
34
|
typeof v.$prefillFromRecord === 'string');
|
|
@@ -51,7 +51,7 @@ function toNum(v) {
|
|
|
51
51
|
// untouched when there is no prefill spec or no lock list (the create flow,
|
|
52
52
|
// which carries no prefill, stays fully editable). The readonly flag is set on
|
|
53
53
|
// BOTH itemFields aliases the renderers tolerate.
|
|
54
|
-
function applyPrefillLock(field) {
|
|
54
|
+
export function applyPrefillLock(field) {
|
|
55
55
|
const spec = lineItemsDefault(field);
|
|
56
56
|
if (!isPrefillSpec(spec) || !spec.lock || spec.lock.length === 0)
|
|
57
57
|
return field;
|
|
@@ -64,7 +64,7 @@ function applyPrefillLock(field) {
|
|
|
64
64
|
return { ...field, itemFields: patched, item_fields: patched };
|
|
65
65
|
}
|
|
66
66
|
// buildPrefillRows projects record[spec.$prefillFromRecord] into modal rows.
|
|
67
|
-
function buildPrefillRows(spec, record) {
|
|
67
|
+
export function buildPrefillRows(spec, record) {
|
|
68
68
|
const src = record?.[spec.$prefillFromRecord];
|
|
69
69
|
if (!Array.isArray(src))
|
|
70
70
|
return [];
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Addon fiber primitives — Cordis-style dispose/reload for federated modules
|
|
3
|
+
* running inside a PWA host. Pure helpers so they unit-test without React
|
|
4
|
+
* or the Module Federation runtime.
|
|
5
|
+
*/
|
|
6
|
+
import type { AddonAPI, Disposable, Plugin } from '@asteby/metacore-sdk';
|
|
7
|
+
export declare const PURGE_ADDON_MESSAGE: "PURGE_ADDON";
|
|
8
|
+
export interface PurgeAddonMessage {
|
|
9
|
+
type: typeof PURGE_ADDON_MESSAGE;
|
|
10
|
+
key: string;
|
|
11
|
+
}
|
|
12
|
+
/** Shape of the exposed `./register` (or `./plugin`) module. */
|
|
13
|
+
export interface AddonRegisterModule {
|
|
14
|
+
register?: Plugin['register'];
|
|
15
|
+
dispose?: Plugin['dispose'];
|
|
16
|
+
default?: Plugin['register'] | Plugin;
|
|
17
|
+
}
|
|
18
|
+
export interface ResolvedPlugin {
|
|
19
|
+
register?: Plugin['register'];
|
|
20
|
+
dispose?: Plugin['dispose'];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Accept every historical export shape:
|
|
24
|
+
* - `{ register, dispose? }`
|
|
25
|
+
* - `{ default: { register, dispose? } }` (definePlugin)
|
|
26
|
+
* - `{ default: (api) => ... }` (function module)
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolvePluginExports(mod: AddonRegisterModule | null | undefined): ResolvedPlugin;
|
|
29
|
+
export declare function runDispose(dispose?: Disposable | null): Promise<void>;
|
|
30
|
+
export declare function composeDisposables(...fns: Array<Disposable | undefined | null>): Disposable;
|
|
31
|
+
/**
|
|
32
|
+
* True when a Cache API / SW request is a federated frontend asset of `addonKey`.
|
|
33
|
+
* Matches both `/api/addons/<key>/frontend` and `/api/metacore/addons/<key>/frontend`.
|
|
34
|
+
*/
|
|
35
|
+
export declare function isAddonFrontendCacheUrl(url: string, addonKey: string): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Drop cached federation assets for one addon. Primary path is the page-side
|
|
38
|
+
* Cache API (works even before the SW learns `PURGE_ADDON`). Also posts the
|
|
39
|
+
* message so a current SW can drop its own entries.
|
|
40
|
+
*
|
|
41
|
+
* Never unregisters the SW and never deletes other caches — L1, not L2.
|
|
42
|
+
*/
|
|
43
|
+
export declare function purgeAddonFrontendCache(addonKey: string): Promise<void>;
|
|
44
|
+
/** Test seam: which remote URL is currently registered per federation scope. */
|
|
45
|
+
export declare const remoteEntryByScope: Map<string, string>;
|
|
46
|
+
export declare function shouldReregisterRemote(scope: string, url: string): boolean;
|
|
47
|
+
export declare function markRemoteRegistered(scope: string, url: string): void;
|
|
48
|
+
/** @internal tests */
|
|
49
|
+
export declare function resetRemoteRegistry(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Safe no-op when `register()` returns void. Used by AddonLoader to treat
|
|
52
|
+
* both historical and fiber-style plugins uniformly.
|
|
53
|
+
*/
|
|
54
|
+
export declare function disposableFromRegisterResult(result: void | Disposable): Disposable | undefined;
|
|
55
|
+
/** Type-only re-export so AddonLoader does not import Plugin internals twice. */
|
|
56
|
+
export type { AddonAPI, Disposable };
|
|
57
|
+
//# sourceMappingURL=addon-fiber.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addon-fiber.d.ts","sourceRoot":"","sources":["../src/addon-fiber.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAExE,eAAO,MAAM,mBAAmB,EAAG,aAAsB,CAAA;AAEzD,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,OAAO,mBAAmB,CAAA;IAChC,GAAG,EAAE,MAAM,CAAA;CACd;AAED,gEAAgE;AAChE,MAAM,WAAW,mBAAmB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAA;CACxC;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc,CAqBhG;AAED,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAO3E;AAED,wBAAgB,kBAAkB,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,UAAU,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,UAAU,CAO3F;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAS9E;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B7E;AAED,gFAAgF;AAChF,eAAO,MAAM,kBAAkB,qBAA4B,CAAA;AAE3D,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAE1E;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAErE;AAED,sBAAsB;AACtB,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CACxC,MAAM,EAAE,IAAI,GAAG,UAAU,GAC1B,UAAU,GAAG,SAAS,CAExB;AAED,iFAAiF;AACjF,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAA"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Addon fiber primitives — Cordis-style dispose/reload for federated modules
|
|
3
|
+
* running inside a PWA host. Pure helpers so they unit-test without React
|
|
4
|
+
* or the Module Federation runtime.
|
|
5
|
+
*/
|
|
6
|
+
export const PURGE_ADDON_MESSAGE = 'PURGE_ADDON';
|
|
7
|
+
/**
|
|
8
|
+
* Accept every historical export shape:
|
|
9
|
+
* - `{ register, dispose? }`
|
|
10
|
+
* - `{ default: { register, dispose? } }` (definePlugin)
|
|
11
|
+
* - `{ default: (api) => ... }` (function module)
|
|
12
|
+
*/
|
|
13
|
+
export function resolvePluginExports(mod) {
|
|
14
|
+
if (!mod)
|
|
15
|
+
return {};
|
|
16
|
+
const fromDefault = mod.default && typeof mod.default === 'object'
|
|
17
|
+
? mod.default
|
|
18
|
+
: undefined;
|
|
19
|
+
const registerFn = typeof mod.register === 'function'
|
|
20
|
+
? mod.register
|
|
21
|
+
: typeof fromDefault?.register === 'function'
|
|
22
|
+
? fromDefault.register.bind(fromDefault)
|
|
23
|
+
: typeof mod.default === 'function'
|
|
24
|
+
? mod.default
|
|
25
|
+
: undefined;
|
|
26
|
+
const disposeFn = typeof mod.dispose === 'function'
|
|
27
|
+
? mod.dispose
|
|
28
|
+
: typeof fromDefault?.dispose === 'function'
|
|
29
|
+
? fromDefault.dispose.bind(fromDefault)
|
|
30
|
+
: undefined;
|
|
31
|
+
return { register: registerFn, dispose: disposeFn };
|
|
32
|
+
}
|
|
33
|
+
export async function runDispose(dispose) {
|
|
34
|
+
if (typeof dispose !== 'function')
|
|
35
|
+
return;
|
|
36
|
+
try {
|
|
37
|
+
await Promise.resolve(dispose());
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
/* a failing disposer must not block the next fiber mount */
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function composeDisposables(...fns) {
|
|
44
|
+
const list = fns.filter((f) => typeof f === 'function');
|
|
45
|
+
return async () => {
|
|
46
|
+
for (let i = list.length - 1; i >= 0; i--) {
|
|
47
|
+
await runDispose(list[i]);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* True when a Cache API / SW request is a federated frontend asset of `addonKey`.
|
|
53
|
+
* Matches both `/api/addons/<key>/frontend` and `/api/metacore/addons/<key>/frontend`.
|
|
54
|
+
*/
|
|
55
|
+
export function isAddonFrontendCacheUrl(url, addonKey) {
|
|
56
|
+
if (!addonKey || !url)
|
|
57
|
+
return false;
|
|
58
|
+
try {
|
|
59
|
+
const path = new URL(url, 'http://local.invalid').pathname;
|
|
60
|
+
const escaped = addonKey.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
61
|
+
return new RegExp(`/api/(metacore/)?addons/${escaped}/frontend(/|\\.js)`).test(path);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Drop cached federation assets for one addon. Primary path is the page-side
|
|
69
|
+
* Cache API (works even before the SW learns `PURGE_ADDON`). Also posts the
|
|
70
|
+
* message so a current SW can drop its own entries.
|
|
71
|
+
*
|
|
72
|
+
* Never unregisters the SW and never deletes other caches — L1, not L2.
|
|
73
|
+
*/
|
|
74
|
+
export async function purgeAddonFrontendCache(addonKey) {
|
|
75
|
+
if (!addonKey)
|
|
76
|
+
return;
|
|
77
|
+
try {
|
|
78
|
+
if (typeof caches !== 'undefined') {
|
|
79
|
+
const names = await caches.keys();
|
|
80
|
+
await Promise.all(names.map(async (name) => {
|
|
81
|
+
if (!name.includes('addon-federation'))
|
|
82
|
+
return;
|
|
83
|
+
const cache = await caches.open(name);
|
|
84
|
+
const requests = await cache.keys();
|
|
85
|
+
await Promise.all(requests
|
|
86
|
+
.filter((req) => isAddonFrontendCacheUrl(req.url, addonKey))
|
|
87
|
+
.map((req) => cache.delete(req)));
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
/* private mode / no Cache API */
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
if (typeof navigator !== 'undefined' && 'serviceWorker' in navigator) {
|
|
96
|
+
const controller = navigator.serviceWorker.controller;
|
|
97
|
+
controller?.postMessage({ type: PURGE_ADDON_MESSAGE, key: addonKey });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
/* no SW */
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** Test seam: which remote URL is currently registered per federation scope. */
|
|
105
|
+
export const remoteEntryByScope = new Map();
|
|
106
|
+
export function shouldReregisterRemote(scope, url) {
|
|
107
|
+
return remoteEntryByScope.get(scope) !== url;
|
|
108
|
+
}
|
|
109
|
+
export function markRemoteRegistered(scope, url) {
|
|
110
|
+
remoteEntryByScope.set(scope, url);
|
|
111
|
+
}
|
|
112
|
+
/** @internal tests */
|
|
113
|
+
export function resetRemoteRegistry() {
|
|
114
|
+
remoteEntryByScope.clear();
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Safe no-op when `register()` returns void. Used by AddonLoader to treat
|
|
118
|
+
* both historical and fiber-style plugins uniformly.
|
|
119
|
+
*/
|
|
120
|
+
export function disposableFromRegisterResult(result) {
|
|
121
|
+
return typeof result === 'function' ? result : undefined;
|
|
122
|
+
}
|
package/dist/addon-loader.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AddonAPI, AddonLayout } from '@asteby/metacore-sdk';
|
|
1
|
+
import type { AddonAPI, AddonLayout, Registry } from '@asteby/metacore-sdk';
|
|
2
2
|
export interface AddonLoaderProps {
|
|
3
3
|
/** Unique key of the addon — maps to the federation container name. */
|
|
4
4
|
scope: string;
|
|
@@ -8,9 +8,25 @@ export interface AddonLoaderProps {
|
|
|
8
8
|
module?: string;
|
|
9
9
|
/** Host-provided API passed to the addon's register() call. */
|
|
10
10
|
api: AddonAPI;
|
|
11
|
+
/**
|
|
12
|
+
* Host registry used to {@link Registry.unbind} this addon's contributions
|
|
13
|
+
* on dispose. Optional so legacy hosts keep compiling; without it, fiber
|
|
14
|
+
* remounts leak routes/actions.
|
|
15
|
+
*/
|
|
16
|
+
hostRegistry?: Registry;
|
|
17
|
+
/**
|
|
18
|
+
* Addon key for SW cache purge. Defaults to `api.manifest.key`.
|
|
19
|
+
*/
|
|
20
|
+
addonKey?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Registry owner passed to {@link Registry.unbind}. Defaults to `addonKey`.
|
|
23
|
+
* Immersive `./plugin` fibers use `${key}::view` so they don't wipe the
|
|
24
|
+
* shell `./register` contributions of the same addon.
|
|
25
|
+
*/
|
|
26
|
+
unbindKey?: string;
|
|
11
27
|
/** Optional rendering while loading. */
|
|
12
28
|
fallback?: React.ReactNode;
|
|
13
|
-
/** Called once the addon has successfully registered. */
|
|
29
|
+
/** Called once the addon has successfully registered (including re-register). */
|
|
14
30
|
onReady?: () => void;
|
|
15
31
|
/** Called if loading fails. */
|
|
16
32
|
onError?: (err: Error) => void;
|
|
@@ -28,5 +44,5 @@ export interface AddonLoaderProps {
|
|
|
28
44
|
layout?: AddonLayout;
|
|
29
45
|
children?: React.ReactNode;
|
|
30
46
|
}
|
|
31
|
-
export declare function AddonLoader({ scope, url, module, api, fallback, onReady, onError, layout, children, }: AddonLoaderProps): import("react").JSX.Element;
|
|
47
|
+
export declare function AddonLoader({ scope, url, module, api, hostRegistry, addonKey, unbindKey, fallback, onReady, onError, layout, children, }: AddonLoaderProps): import("react").JSX.Element;
|
|
32
48
|
//# sourceMappingURL=addon-loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addon-loader.d.ts","sourceRoot":"","sources":["../src/addon-loader.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"addon-loader.d.ts","sourceRoot":"","sources":["../src/addon-loader.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAc3E,MAAM,WAAW,gBAAgB;IAC7B,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAA;IACb,+EAA+E;IAC/E,GAAG,EAAE,MAAM,CAAA;IACX,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,+DAA+D;IAC/D,GAAG,EAAE,QAAQ,CAAA;IACb;;;;OAIG;IACH,YAAY,CAAC,EAAE,QAAQ,CAAA;IACvB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAA;IAC9B;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC7B;AA4DD,wBAAgB,WAAW,CAAC,EACxB,KAAK,EACL,GAAG,EACH,MAAqB,EACrB,GAAG,EACH,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,QAAe,EACf,OAAO,EACP,OAAO,EACP,MAAM,EACN,QAAQ,GACX,EAAE,gBAAgB,+BA6DlB"}
|
package/dist/addon-loader.js
CHANGED
|
@@ -4,20 +4,15 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
4
4
|
// `remoteEntry.js` as an ESM container, loads the exposed `./register` module,
|
|
5
5
|
// and calls `register(api)` with the AddonAPI injected by the host.
|
|
6
6
|
//
|
|
7
|
-
//
|
|
8
|
-
// the
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
// of bundling its own. That's the whole point: it fixes the `useState`-null
|
|
13
|
-
// crash WITHOUT this loader ever touching a share scope manually.
|
|
7
|
+
// Fiber lifecycle (Cordis-style): when `url` (the `?v=` cache-bust) changes,
|
|
8
|
+
// the previous plugin.dispose / returned Disposable run, the host registry
|
|
9
|
+
// unbinds that addonKey, the SW addon-federation cache for that key is
|
|
10
|
+
// purged, and register() runs again against the new remote. The host shell
|
|
11
|
+
// (auth, QueryClient, WebSocket, service worker controller) is not touched.
|
|
14
12
|
import { useEffect, useRef, useState } from 'react';
|
|
15
13
|
import { registerRemotes, loadRemote } from '@module-federation/runtime';
|
|
16
14
|
import { useDeclareAddonLayout } from './addon-layout-context';
|
|
17
|
-
|
|
18
|
-
// which scopes we've registered to avoid redundant `force` churn (each `force`
|
|
19
|
-
// re-register wipes that remote's module cache and logs a runtime warning).
|
|
20
|
-
const registered = new Set();
|
|
15
|
+
import { composeDisposables, disposableFromRegisterResult, markRemoteRegistered, purgeAddonFrontendCache, resolvePluginExports, runDispose, shouldReregisterRemote, } from './addon-fiber';
|
|
21
16
|
// Derive the `loadRemote` id from the scope + exposed module name. MF resolves
|
|
22
17
|
// `"<remoteName>/<expose>"` — e.g. `metacore_tickets/register` for the
|
|
23
18
|
// `"./register"` expose. We strip the leading `./` of the expose path.
|
|
@@ -56,30 +51,19 @@ async function withRuntimeReady(op) {
|
|
|
56
51
|
}
|
|
57
52
|
}
|
|
58
53
|
async function loadAddon(scope, url, module) {
|
|
59
|
-
//
|
|
60
|
-
// the
|
|
61
|
-
//
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
// RUNTIME-009 when an addon mounts ahead of the host's federation init —
|
|
66
|
-
// registration is what actually touches the (maybe-uninitialised) runtime.
|
|
67
|
-
if (!registered.has(scope)) {
|
|
68
|
-
await withRuntimeReady(() => registerRemotes([{ name: scope, entry: url, type: 'module' }],
|
|
69
|
-
// `force: true` so a re-registration with a new `?v=` URL (addon
|
|
70
|
-
// hot-swap / version bump) overwrites the stale entry + cache.
|
|
71
|
-
{ force: true }));
|
|
72
|
-
registered.add(scope);
|
|
54
|
+
// Re-register whenever the `?v=` URL changes so a fiber swap actually
|
|
55
|
+
// fetches the new remoteEntry. `force: true` wipes that remote's module
|
|
56
|
+
// cache — without it, loadRemote would keep serving the previous bundle.
|
|
57
|
+
if (shouldReregisterRemote(scope, url)) {
|
|
58
|
+
await withRuntimeReady(() => registerRemotes([{ name: scope, entry: url, type: 'module' }], { force: true }));
|
|
59
|
+
markRemoteRegistered(scope, url);
|
|
73
60
|
}
|
|
74
|
-
// loadRemote("<scope>/<expose>") returns the exposed module namespace (or
|
|
75
|
-
// null if it can't be resolved). No manual share-scope init — the host's
|
|
76
|
-
// federation runtime already initialised it.
|
|
77
61
|
return withRuntimeReady(() => loadRemote(remoteId(scope, module)));
|
|
78
62
|
}
|
|
79
|
-
export function AddonLoader({ scope, url, module = './register', api, fallback = null, onReady, onError, layout, children, }) {
|
|
63
|
+
export function AddonLoader({ scope, url, module = './register', api, hostRegistry, addonKey, unbindKey, fallback = null, onReady, onError, layout, children, }) {
|
|
80
64
|
const [status, setStatus] = useState('loading');
|
|
81
65
|
const [error, setError] = useState(null);
|
|
82
|
-
const
|
|
66
|
+
const disposeRef = useRef(undefined);
|
|
83
67
|
// Propagate the addon's preferred layout to the host shell via context.
|
|
84
68
|
// No-op when `layout` is undefined or `"shell"` (legacy default). Cleanup
|
|
85
69
|
// restores `"shell"` automatically when the loader unmounts, so chrome
|
|
@@ -87,19 +71,26 @@ export function AddonLoader({ scope, url, module = './register', api, fallback =
|
|
|
87
71
|
useDeclareAddonLayout(layout);
|
|
88
72
|
useEffect(() => {
|
|
89
73
|
let cancelled = false;
|
|
74
|
+
const key = addonKey || api.manifest?.key;
|
|
75
|
+
const owner = unbindKey || key;
|
|
90
76
|
(async () => {
|
|
91
77
|
try {
|
|
78
|
+
setStatus('loading');
|
|
79
|
+
if (key)
|
|
80
|
+
await purgeAddonFrontendCache(key);
|
|
92
81
|
const mod = await loadAddon(scope, url, module);
|
|
93
82
|
if (cancelled)
|
|
94
83
|
return;
|
|
95
|
-
const
|
|
96
|
-
if (typeof register !== 'function') {
|
|
84
|
+
const plugin = resolvePluginExports(mod);
|
|
85
|
+
if (typeof plugin.register !== 'function') {
|
|
97
86
|
throw new Error(`Addon "${scope}" module "${module}" has no register() export`);
|
|
98
87
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
88
|
+
// Drop leftover contributions from a previous fiber of this key
|
|
89
|
+
// before the new register() runs (idempotent if none).
|
|
90
|
+
if (owner && hostRegistry)
|
|
91
|
+
hostRegistry.unbind(owner);
|
|
92
|
+
const ret = await Promise.resolve(plugin.register(api));
|
|
93
|
+
disposeRef.current = composeDisposables(disposableFromRegisterResult(ret), plugin.dispose);
|
|
103
94
|
setStatus('ready');
|
|
104
95
|
onReady?.();
|
|
105
96
|
}
|
|
@@ -114,8 +105,16 @@ export function AddonLoader({ scope, url, module = './register', api, fallback =
|
|
|
114
105
|
})();
|
|
115
106
|
return () => {
|
|
116
107
|
cancelled = true;
|
|
108
|
+
const d = disposeRef.current;
|
|
109
|
+
disposeRef.current = undefined;
|
|
110
|
+
void runDispose(d);
|
|
111
|
+
if (owner && hostRegistry)
|
|
112
|
+
hostRegistry.unbind(owner);
|
|
117
113
|
};
|
|
118
|
-
|
|
114
|
+
// api identity is expected to be stable per addon; including it would
|
|
115
|
+
// re-register on every parent render. Fiber identity is (scope, url, module).
|
|
116
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
117
|
+
}, [scope, url, module, addonKey, unbindKey, hostRegistry]);
|
|
119
118
|
if (status === 'loading')
|
|
120
119
|
return _jsx(_Fragment, { children: fallback });
|
|
121
120
|
if (status === 'error')
|
package/dist/index.d.ts
CHANGED
|
@@ -18,6 +18,7 @@ export { FieldGrid, FieldCell, FieldLabel } from './field-grid';
|
|
|
18
18
|
export { ActionModalDispatcher, type ActionModalProps, } from './action-modal-dispatcher';
|
|
19
19
|
export { ModelActionToolbar, useModelActions, type ModelActionToolbarProps, type ActionPlacement, } from './model-action-toolbar';
|
|
20
20
|
export * from './addon-loader';
|
|
21
|
+
export { PURGE_ADDON_MESSAGE, isAddonFrontendCacheUrl, purgeAddonFrontendCache, resolvePluginExports, composeDisposables, runDispose, type PurgeAddonMessage, type AddonRegisterModule, type ResolvedPlugin, } from './addon-fiber';
|
|
21
22
|
export { AddonLayoutProvider, useAddonLayout, useAddonLayoutControl, useDeclareAddonLayout, type AddonLayout, type AddonLayoutProviderProps, } from './addon-layout-context';
|
|
22
23
|
export * from './slot';
|
|
23
24
|
export * from './capability-gate';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -23,6 +23,7 @@ export { FieldGrid, FieldCell, FieldLabel } from './field-grid';
|
|
|
23
23
|
export { ActionModalDispatcher, } from './action-modal-dispatcher';
|
|
24
24
|
export { ModelActionToolbar, useModelActions, } from './model-action-toolbar';
|
|
25
25
|
export * from './addon-loader';
|
|
26
|
+
export { PURGE_ADDON_MESSAGE, isAddonFrontendCacheUrl, purgeAddonFrontendCache, resolvePluginExports, composeDisposables, runDispose, } from './addon-fiber';
|
|
26
27
|
export { AddonLayoutProvider, useAddonLayout, useAddonLayoutControl, useDeclareAddonLayout, } from './addon-layout-context';
|
|
27
28
|
export * from './slot';
|
|
28
29
|
export * from './capability-gate';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions-manager.d.ts","sourceRoot":"","sources":["../src/permissions-manager.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"permissions-manager.d.ts","sourceRoot":"","sources":["../src/permissions-manager.tsx"],"names":[],"mappings":"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"}
|
|
@@ -237,7 +237,7 @@ export function PermissionsManager({ loadModules, loadRoles, loadRolePermissions
|
|
|
237
237
|
const [moduleOpen, setModuleOpen] = React.useState(false);
|
|
238
238
|
// Pending role switch while there are unsaved changes.
|
|
239
239
|
const [pendingRoleId, setPendingRoleId] = React.useState(null);
|
|
240
|
-
const [roleDialog, setRoleDialog] = React.useState({ open: false, mode: 'create', label: '', color: ROLE_COLORS[5] });
|
|
240
|
+
const [roleDialog, setRoleDialog] = React.useState({ open: false, mode: 'create', label: '', color: ROLE_COLORS[5], grantAll: false });
|
|
241
241
|
const [roleSaving, setRoleSaving] = React.useState(false);
|
|
242
242
|
const [deleteOpen, setDeleteOpen] = React.useState(false);
|
|
243
243
|
const [deleting, setDeleting] = React.useState(false);
|
|
@@ -331,6 +331,18 @@ export function PermissionsManager({ loadModules, loadRoles, loadRolePermissions
|
|
|
331
331
|
return next;
|
|
332
332
|
});
|
|
333
333
|
}, [activeModule]);
|
|
334
|
+
// Every capability across every module in the catalog — the "Otorgar
|
|
335
|
+
// todo" button's target set (as opposed to setModuleAll, which is
|
|
336
|
+
// scoped to the currently open module).
|
|
337
|
+
const allCatalogCapabilities = React.useMemo(() => allModules.flatMap((m) => moduleCapabilities(m)), [allModules]);
|
|
338
|
+
const setAllPermissions = React.useCallback((on) => {
|
|
339
|
+
if (on) {
|
|
340
|
+
setDraft(new Set(allCatalogCapabilities));
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
setDraft(new Set());
|
|
344
|
+
}
|
|
345
|
+
}, [allCatalogCapabilities]);
|
|
334
346
|
const handleSave = async () => {
|
|
335
347
|
if (!activeRoleId || !draft)
|
|
336
348
|
return;
|
|
@@ -385,7 +397,15 @@ export function PermissionsManager({ loadModules, loadRoles, loadRolePermissions
|
|
|
385
397
|
null;
|
|
386
398
|
if (createdId)
|
|
387
399
|
setActiveRoleId(createdId);
|
|
388
|
-
|
|
400
|
+
if (roleDialog.grantAll && createdId && allCatalogCapabilities.length) {
|
|
401
|
+
await syncRolePermissions(createdId, [...allCatalogCapabilities].sort());
|
|
402
|
+
setBaseline(new Set(allCatalogCapabilities));
|
|
403
|
+
setDraft(new Set(allCatalogCapabilities));
|
|
404
|
+
toast.success('Rol creado con todos los permisos');
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
toast.success('Rol creado');
|
|
408
|
+
}
|
|
389
409
|
}
|
|
390
410
|
else if (roleDialog.mode === 'edit' && updateRole && activeRole) {
|
|
391
411
|
await updateRole(activeRole.id, {
|
|
@@ -432,6 +452,7 @@ export function PermissionsManager({ loadModules, loadRoles, loadRolePermissions
|
|
|
432
452
|
mode: 'edit',
|
|
433
453
|
label: activeRole.label || activeRole.name,
|
|
434
454
|
color: activeRole.color || ROLE_COLORS[5],
|
|
455
|
+
grantAll: false,
|
|
435
456
|
});
|
|
436
457
|
};
|
|
437
458
|
// ---- derived for the right panel ----------------------------------------
|
|
@@ -456,7 +477,8 @@ export function PermissionsManager({ loadModules, loadRoles, loadRolePermissions
|
|
|
456
477
|
mode: 'create',
|
|
457
478
|
label: '',
|
|
458
479
|
color: ROLE_COLORS[5],
|
|
459
|
-
|
|
480
|
+
grantAll: false,
|
|
481
|
+
}), children: [_jsx(Plus, { className: "mr-1.5 h-4 w-4" }), " Nuevo rol"] })), _jsxs(Button, { variant: "outline", onClick: () => setAllPermissions(true), disabled: checksDisabled || !allCatalogCapabilities.length, title: "Marca todos los permisos de todos los m\u00F3dulos", children: [_jsx(CheckCheck, { className: "mr-1.5 h-4 w-4" }), " Otorgar todo"] }), _jsxs(Button, { variant: "outline", onClick: () => setAllPermissions(false), disabled: checksDisabled || !draft?.size, title: "Quita todos los permisos del rol", children: [_jsx(Eraser, { className: "mr-1.5 h-4 w-4" }), " Quitar todo"] }), _jsxs(Button, { onClick: handleSave, disabled: !dirty || saving || !activeRole, className: "bg-emerald-600 text-white hover:bg-emerald-700", children: [_jsx(Save, { className: "mr-1.5 h-4 w-4" }), saving ? 'Guardando…' : 'Guardar permisos'] })] })] }), _jsxs("div", { className: "grid items-start gap-4 lg:grid-cols-[340px_1fr]", children: [_jsxs("div", { className: "flex flex-col gap-4", children: [_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { className: "text-base", children: "Rol" }), _jsx(CardDescription, { children: "Selecciona el rol a configurar." })] }), _jsxs(CardContent, { className: "flex flex-col gap-3", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsxs(Popover, { open: roleOpen, onOpenChange: setRoleOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { variant: "outline", role: "combobox", "aria-expanded": roleOpen, className: "min-w-0 flex-1 justify-between font-normal", children: [_jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [activeRole && (_jsx("span", { className: "h-2.5 w-2.5 shrink-0 rounded-full", style: {
|
|
460
482
|
background: activeRole.color || '#6b7280',
|
|
461
483
|
}, "aria-hidden": "true" })), _jsx("span", { className: "truncate", children: activeRole
|
|
462
484
|
? activeRole.label || activeRole.name
|
|
@@ -486,7 +508,10 @@ export function PermissionsManager({ loadModules, loadRoles, loadRolePermissions
|
|
|
486
508
|
setPendingRoleId(null);
|
|
487
509
|
}, children: "Descartar y cambiar" })] })] }) }), _jsx(Dialog, { open: roleDialog.open, onOpenChange: (open) => setRoleDialog((d) => ({ ...d, open })), children: _jsxs(DialogContent, { className: "sm:max-w-md", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: roleDialog.mode === 'create' ? 'Nuevo rol' : 'Editar rol' }) }), _jsxs("div", { className: "flex flex-col gap-4 py-2", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { htmlFor: "pm-role-name", children: "Nombre del rol" }), _jsx(Input, { id: "pm-role-name", value: roleDialog.label, placeholder: "Ej. Cajero", onChange: (e) => setRoleDialog((d) => ({ ...d, label: e.target.value })) })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Color" }), _jsx("div", { className: "flex flex-wrap gap-2", children: ROLE_COLORS.map((c) => (_jsx("button", { type: "button", "aria-label": `Color ${c}`, onClick: () => setRoleDialog((d) => ({ ...d, color: c })), className: cn('h-7 w-7 rounded-full border-2 transition-transform', roleDialog.color === c
|
|
488
510
|
? 'scale-110 border-foreground'
|
|
489
|
-
: 'border-transparent hover:scale-105'), style: { background: c } }, c))) })] })
|
|
511
|
+
: 'border-transparent hover:scale-105'), style: { background: c } }, c))) })] }), roleDialog.mode === 'create' && (_jsxs("label", { className: "flex cursor-pointer items-start gap-3 rounded-lg border p-3 text-sm hover:bg-muted/40", children: [_jsx("input", { type: "checkbox", className: "mt-0.5 size-4 accent-emerald-600", checked: roleDialog.grantAll, onChange: (e) => setRoleDialog((d) => ({
|
|
512
|
+
...d,
|
|
513
|
+
grantAll: e.target.checked,
|
|
514
|
+
})) }), _jsxs("span", { children: [_jsx("span", { className: "font-medium", children: "Otorgar todos los permisos" }), _jsx("span", { className: "mt-0.5 block text-xs text-muted-foreground", children: "Acceso completo a todos los m\u00F3dulos del cat\u00E1logo (como un admin). Puedes quitar permisos despu\u00E9s." })] })] }))] }), _jsxs(DialogFooter, { children: [_jsx(Button, { variant: "outline", onClick: () => setRoleDialog((d) => ({ ...d, open: false })), disabled: roleSaving, children: "Cancelar" }), _jsx(Button, { onClick: handleRoleSubmit, disabled: roleSaving || !roleDialog.label.trim(), children: roleSaving
|
|
490
515
|
? 'Guardando…'
|
|
491
516
|
: roleDialog.mode === 'create'
|
|
492
517
|
? 'Crear rol'
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@asteby/metacore-runtime-react",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "32.0.0",
|
|
4
4
|
"description": "React runtime for metacore hosts — renders addon contributions dynamically",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"react-i18next": ">=13",
|
|
38
38
|
"sonner": ">=1.7",
|
|
39
39
|
"zustand": ">=5",
|
|
40
|
-
"@asteby/metacore-sdk": "^3.
|
|
40
|
+
"@asteby/metacore-sdk": "^3.5.0",
|
|
41
41
|
"@asteby/metacore-ui": "^2.15.0"
|
|
42
42
|
},
|
|
43
43
|
"peerDependenciesMeta": {
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"typescript": "^6.0.0",
|
|
68
68
|
"vitest": "^4.0.0",
|
|
69
69
|
"zustand": "^5.0.0",
|
|
70
|
-
"@asteby/metacore-sdk": "3.
|
|
70
|
+
"@asteby/metacore-sdk": "3.5.0",
|
|
71
71
|
"@asteby/metacore-ui": "2.15.0"
|
|
72
72
|
},
|
|
73
73
|
"scripts": {
|