@actdim/dynstruct 1.0.2 → 1.0.5
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/dist/appDomain/adapters.d.ts +10 -0
- package/dist/appDomain/adapters.d.ts.map +1 -0
- package/dist/appDomain/adapters.es.js +25 -0
- package/dist/appDomain/adapters.es.js.map +1 -0
- package/dist/appDomain/appContracts.d.ts +24 -9
- package/dist/appDomain/appContracts.d.ts.map +1 -1
- package/dist/appDomain/appContracts.es.js +12 -9
- package/dist/appDomain/appContracts.es.js.map +1 -1
- package/dist/appDomain/reactHooks.d.ts +6 -0
- package/dist/appDomain/reactHooks.d.ts.map +1 -0
- package/dist/appDomain/reactHooks.es.js +12 -0
- package/dist/appDomain/reactHooks.es.js.map +1 -0
- package/dist/appDomain/security/securityContracts.d.ts +3 -3
- package/dist/appDomain/security/securityContracts.d.ts.map +1 -1
- package/dist/appDomain/security/securityContracts.es.js.map +1 -1
- package/dist/appDomain/security/securityProvider.d.ts +2 -2
- package/dist/appDomain/security/securityProvider.es.js.map +1 -1
- package/dist/componentModel/DynamicContent.d.ts +14 -0
- package/dist/componentModel/DynamicContent.d.ts.map +1 -0
- package/dist/componentModel/DynamicContent.es.js +14 -0
- package/dist/componentModel/DynamicContent.es.js.map +1 -0
- package/dist/componentModel/componentContext.d.ts +8 -0
- package/dist/componentModel/componentContext.d.ts.map +1 -0
- package/dist/componentModel/componentContext.es.js +77 -0
- package/dist/componentModel/componentContext.es.js.map +1 -0
- package/dist/componentModel/componentModel.d.ts +58 -34
- package/dist/componentModel/componentModel.d.ts.map +1 -1
- package/dist/componentModel/componentModel.es.js +263 -134
- package/dist/componentModel/componentModel.es.js.map +1 -1
- package/dist/componentModel/contracts.d.ts +22 -0
- package/dist/componentModel/contracts.d.ts.map +1 -0
- package/dist/componentModel/contracts.es.js +2 -0
- package/dist/componentModel/contracts.es.js.map +1 -0
- package/dist/dist/componentModel/componentContext.es.es.js +15 -0
- package/dist/dist/componentModel/componentContext.es.es.js.map +1 -0
- package/dist/dist/componentModel/componentModel.es.es.js +260 -0
- package/dist/dist/componentModel/componentModel.es.es.js.map +1 -0
- package/dist/dist/globals.es.es.js +10 -0
- package/dist/dist/globals.es.es.js.map +1 -0
- package/dist/dist/reactHooks.es.es.js +9 -0
- package/dist/dist/reactHooks.es.es.js.map +1 -0
- package/dist/globals.d.ts +11 -0
- package/dist/globals.d.ts.map +1 -0
- package/dist/globals.es.js +10 -0
- package/dist/globals.es.js.map +1 -0
- package/dist/net/client.es.js.map +1 -1
- package/dist/services/NavService.d.ts +17 -0
- package/dist/services/NavService.d.ts.map +1 -0
- package/dist/services/NavService.es.js +65 -0
- package/dist/services/NavService.es.js.map +1 -0
- package/dist/services/StorageService.d.ts +15 -0
- package/dist/services/StorageService.d.ts.map +1 -0
- package/dist/services/StorageService.es.js +54 -0
- package/dist/services/StorageService.es.js.map +1 -0
- package/package.json +18 -12
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { MsgBus, MsgStruct } from '@actdim/msgmesh/msgBusCore';
|
|
2
|
+
export type MsgProviderAdapter = {
|
|
3
|
+
service: any;
|
|
4
|
+
channelResolver: (methodName: string) => string;
|
|
5
|
+
};
|
|
6
|
+
export type MsgBusAdapterConfig = {
|
|
7
|
+
providers: MsgProviderAdapter[];
|
|
8
|
+
};
|
|
9
|
+
export declare function registerAdapters<TMsgStruct extends MsgStruct = MsgStruct>(msgBus: MsgBus<TMsgStruct>, { providers }: MsgBusAdapterConfig): void;
|
|
10
|
+
//# sourceMappingURL=adapters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/appDomain/adapters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAW/D,MAAM,MAAM,kBAAkB,GAAG;IAC7B,OAAO,EAAE,GAAG,CAAC;IAEb,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;CACnD,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAC9B,SAAS,EAAE,kBAAkB,EAAE,CAAA;CAClC,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,UAAU,SAAS,SAAS,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,mBAAmB,QAqBxI"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ClientBase as i } from "../net/client.es.js";
|
|
2
|
+
const c = (t) => Object.getOwnPropertyNames(t).filter(
|
|
3
|
+
(e) => e !== "constructor" && typeof t[e] == "function"
|
|
4
|
+
);
|
|
5
|
+
c(i.prototype);
|
|
6
|
+
function l(t, { providers: e }) {
|
|
7
|
+
if (e)
|
|
8
|
+
for (const f of e) {
|
|
9
|
+
const { service: o, channelResolver: r } = f;
|
|
10
|
+
if (!o || r)
|
|
11
|
+
throw new Error("client and channelResolver are required for an adapter");
|
|
12
|
+
for (const n of c(Object.getPrototypeOf(o))) {
|
|
13
|
+
const a = r?.(n);
|
|
14
|
+
a && t.provide({
|
|
15
|
+
channel: a,
|
|
16
|
+
topic: "/.*/",
|
|
17
|
+
callback: (s) => o[n](...s.payload || [])
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
l as registerAdapters
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=adapters.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.es.js","sources":["../../src/appDomain/adapters.ts"],"sourcesContent":["import { ClientBase } from \"@/net/client\";\r\nimport { MsgBus, MsgStruct } from \"@actdim/msgmesh/msgBusCore\";\r\nimport { Func } from \"@actdim/utico/typeCore\";\r\n\r\nconst getMethodNames = (client: any) => {\r\n // return new Set(...)\r\n return Object.getOwnPropertyNames(client).filter(\r\n (name) => name !== 'constructor' && typeof client[name] === 'function',\r\n );\r\n};\r\nconst baseMethodNames = getMethodNames(ClientBase.prototype);\r\n\r\nexport type MsgProviderAdapter = {\r\n service: any;\r\n // channelSelector/channelMapper\r\n channelResolver: (methodName: string) => string;\r\n};\r\n\r\nexport type MsgBusAdapterConfig = {\r\n providers: MsgProviderAdapter[]\r\n};\r\n\r\nexport function registerAdapters<TMsgStruct extends MsgStruct = MsgStruct>(msgBus: MsgBus<TMsgStruct>, { providers }: MsgBusAdapterConfig) {\r\n if (providers) {\r\n for (const adapter of providers) {\r\n const { service, channelResolver } = adapter;\r\n if (!service || !!channelResolver) {\r\n throw new Error(\"client and channelResolver are required for an adapter\")\r\n }\r\n for (const methodName of getMethodNames(Object.getPrototypeOf(service))) {\r\n const channel = channelResolver?.(methodName);\r\n if (channel) {\r\n msgBus.provide({\r\n channel: channel as keyof TMsgStruct,\r\n topic: '/.*/',\r\n callback: (msg) => {\r\n return (service[methodName] as Func)(...((msg.payload || []) as any[]));\r\n },\r\n });\r\n }\r\n }\r\n }\r\n }\r\n}"],"names":["getMethodNames","client","name","ClientBase","registerAdapters","msgBus","providers","adapter","service","channelResolver","methodName","channel","msg"],"mappings":";AAIA,MAAMA,IAAiB,CAACC,MAEb,OAAO,oBAAoBA,CAAM,EAAE;AAAA,EACtC,CAACC,MAASA,MAAS,iBAAiB,OAAOD,EAAOC,CAAI,KAAM;AAAA;AAG5CF,EAAeG,EAAW,SAAS;AAYpD,SAASC,EAA2DC,GAA4B,EAAE,WAAAC,KAAkC;AACvI,MAAIA;AACA,eAAWC,KAAWD,GAAW;AAC7B,YAAM,EAAE,SAAAE,GAAS,iBAAAC,EAAA,IAAoBF;AACrC,UAAI,CAACC,KAAaC;AACd,cAAM,IAAI,MAAM,wDAAwD;AAE5E,iBAAWC,KAAcV,EAAe,OAAO,eAAeQ,CAAO,CAAC,GAAG;AACrE,cAAMG,IAAUF,IAAkBC,CAAU;AAC5C,QAAIC,KACAN,EAAO,QAAQ;AAAA,UACX,SAAAM;AAAA,UACA,OAAO;AAAA,UACP,UAAU,CAACC,MACCJ,EAAQE,CAAU,EAAW,GAAKE,EAAI,WAAW,CAAA,CAAa;AAAA,QAC1E,CACH;AAAA,MAET;AAAA,IACJ;AAER;"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BaseSecurityDomainConfig as BaseSecurityDomainConfig,
|
|
1
|
+
import { MsgStructBase, MsgStructFactory } from '@actdim/msgmesh/msgBusCore';
|
|
2
|
+
import { BaseSecurityDomainConfig as BaseSecurityDomainConfig, BaseSecurityMsgStruct } from './security/securityContracts';
|
|
3
3
|
import { ReactNode } from 'react';
|
|
4
|
+
import { KeysOf } from '@actdim/utico/typeCore';
|
|
5
|
+
import { ComponentRegistryContext } from '../componentModel/contracts';
|
|
4
6
|
export declare const $NAV_GOTO = "APP-NAV-GOTO";
|
|
5
|
-
export declare const $NAV_GET_CONTEXT = "APP-NAV-CONTEXT";
|
|
7
|
+
export declare const $NAV_GET_CONTEXT = "APP-NAV-GET-CONTEXT";
|
|
8
|
+
export declare const $NAV_CONTEXT_CHANGED = "APP-NAV-CONTEXT-CHANGED";
|
|
6
9
|
export declare const $NAV_READ_HISTORY = "APP-NAV-READ-HISTORY";
|
|
7
10
|
export declare const $NOTICE = "APP-NOTICE";
|
|
8
11
|
export declare const $CONFIG_GET = "APP-CONFIG-GET";
|
|
@@ -29,6 +32,12 @@ export type NavRoute<TParams extends NavRouteParams = NavRouteParams> = {
|
|
|
29
32
|
defaultParams?: TParams;
|
|
30
33
|
};
|
|
31
34
|
export type NavRoutes = Record<string, NavRoute>;
|
|
35
|
+
type NavRouteStruct<TNavRoutes extends NavRoutes> = {
|
|
36
|
+
[K in keyof TNavRoutes]: {
|
|
37
|
+
route: K;
|
|
38
|
+
params?: TNavRoutes[K]["defaultParams"];
|
|
39
|
+
};
|
|
40
|
+
}[keyof TNavRoutes];
|
|
32
41
|
export type NavContext = {
|
|
33
42
|
location?: NavLocation;
|
|
34
43
|
searchParams?: URLSearchParams;
|
|
@@ -47,8 +56,8 @@ export type AppError<TModule = Module> = {
|
|
|
47
56
|
field?: string;
|
|
48
57
|
reason?: string;
|
|
49
58
|
};
|
|
50
|
-
export type
|
|
51
|
-
export type
|
|
59
|
+
export type BaseApiMsgStruct = BaseSecurityMsgStruct & MsgStructFactory<{}>;
|
|
60
|
+
export type BaseAppMsgStruct<TNavRoutes extends NavRoutes = NavRoutes> = BaseApiMsgStruct & MsgStructFactory<{
|
|
52
61
|
[$NOTICE]: {
|
|
53
62
|
in: {
|
|
54
63
|
text: string;
|
|
@@ -63,12 +72,17 @@ export type BaseAppBusStruct = BaseApiBusStruct & MsgBusStructFactory<{
|
|
|
63
72
|
};
|
|
64
73
|
[$NAV_GOTO]: {
|
|
65
74
|
in: string | number;
|
|
75
|
+
ex: NavRouteStruct<TNavRoutes>;
|
|
66
76
|
out: void;
|
|
67
77
|
};
|
|
68
78
|
[$NAV_GET_CONTEXT]: {
|
|
69
79
|
in: void;
|
|
70
80
|
out: NavContext;
|
|
71
81
|
};
|
|
82
|
+
[$NAV_CONTEXT_CHANGED]: {
|
|
83
|
+
in: NavContext;
|
|
84
|
+
out: void;
|
|
85
|
+
};
|
|
72
86
|
[$NAV_READ_HISTORY]: {
|
|
73
87
|
in: number;
|
|
74
88
|
out: NavContext;
|
|
@@ -101,7 +115,7 @@ export type BaseAppBusStruct = BaseApiBusStruct & MsgBusStructFactory<{
|
|
|
101
115
|
};
|
|
102
116
|
out: void;
|
|
103
117
|
};
|
|
104
|
-
} &
|
|
118
|
+
} & MsgStructBase>;
|
|
105
119
|
export type BaseApiConfig = {
|
|
106
120
|
url?: string;
|
|
107
121
|
versions?: string[];
|
|
@@ -113,7 +127,8 @@ export type BaseAppDomainConfig<TSecurityDomainConfig extends BaseSecurityDomain
|
|
|
113
127
|
security: TSecurityDomainConfig;
|
|
114
128
|
apis: Record<string, TApiConfig>;
|
|
115
129
|
};
|
|
116
|
-
export type
|
|
117
|
-
|
|
118
|
-
|
|
130
|
+
export type BaseAppBusChannels<TChannel extends keyof BaseAppMsgStruct | Array<keyof BaseAppMsgStruct>> = KeysOf<BaseAppMsgStruct, TChannel>;
|
|
131
|
+
export type BaseAppContext<TMsgStruct extends BaseAppMsgStruct = BaseAppMsgStruct> = ComponentRegistryContext<TMsgStruct> & {};
|
|
132
|
+
export declare const useBaseAppContext: <TMsgStruct extends BaseAppMsgStruct = BaseAppMsgStruct>() => BaseAppContext<TMsgStruct>;
|
|
133
|
+
export {};
|
|
119
134
|
//# sourceMappingURL=appContracts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appContracts.d.ts","sourceRoot":"","sources":["../../src/appDomain/appContracts.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"appContracts.d.ts","sourceRoot":"","sources":["../../src/appDomain/appContracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,aAAa,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC3G,OAAO,EAAE,wBAAwB,IAAI,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AACrI,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,eAAO,MAAM,SAAS,iBAAiB,CAAC;AACxC,eAAO,MAAM,gBAAgB,wBAAwB,CAAC;AACtD,eAAO,MAAM,oBAAoB,4BAA4B,CAAC;AAC9D,eAAO,MAAM,iBAAiB,yBAAyB,CAAC;AAExD,eAAO,MAAM,OAAO,eAAe,CAAC;AACpC,eAAO,MAAM,WAAW,mBAAmB,CAAC;AAE5C,eAAO,MAAM,MAAM,cAAc,CAAC;AAElC,eAAO,MAAM,aAAa,qBAAqB,CAAC;AAChD,eAAO,MAAM,aAAa,qBAAqB,CAAC;AAChD,eAAO,MAAM,gBAAgB,wBAAwB,CAAC;AAGtD,MAAM,MAAM,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC;AAE/C,MAAM,MAAM,OAAO,GAAG;IAIlB,QAAQ,EAAE,MAAM,CAAC;IAIjB,MAAM,EAAE,MAAM,CAAC;IAIf,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,KAAK,GAAG,GAAG,IAAI,OAAO,GAAG;IAI7C,KAAK,EAAE,KAAK,CAAC;IAOb,GAAG,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,SAAS,GAQf,KAAK,GAML,MAAM,GAKN,SAAS,CAAC;AAGhB,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAGhE,MAAM,MAAM,QAAQ,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,IAAI;IACpE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,OAAO,EAAE,SAAS,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAEjD,KAAK,cAAc,CAAC,UAAU,SAAS,SAAS,IAAI;KAC/C,CAAC,IAAI,MAAM,UAAU,GAAG;QACrB,KAAK,EAAE,CAAC,CAAC;QACT,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;KAC3C;CACJ,CAAC,MAAM,UAAU,CAAC,CAAC;AAEpB,MAAM,MAAM,UAAU,GAAG;IAErB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,YAAY,CAAC,EAAE,eAAe,CAAC;IAC/B,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,OAAO,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;AAG3C,MAAM,MAAM,QAAQ,CAAC,OAAO,GAAG,MAAM,IAAI;IACrC,MAAM,EAAE,OAAO,CAAC;IAEhB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,OAAO,CAAC,EAAE,GAAG,CAAC;IAEd,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAGF,MAAM,MAAM,gBAAgB,GAAG,qBAAqB,GAChD,gBAAgB,CAAC,EAIhB,CAAC,CAAC;AAGP,MAAM,MAAM,gBAAgB,CAAC,UAAU,SAAS,SAAS,GAAG,SAAS,IAAI,gBAAgB,GACrF,gBAAgB,CACZ;IACI,CAAC,OAAO,CAAC,EAAE;QACP,EAAE,EAAE;YACA,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,EAAE,GAAG,CAAC;SACb,CAAC;QACF,GAAG,EAAE,IAAI,CAAC;KACb,CAAC;IACF,CAAC,WAAW,CAAC,EAAE;QACX,EAAE,EAAE,IAAI,CAAC;QACT,GAAG,EAAE,mBAAmB,CAAC;KAC5B,CAAC;IACF,CAAC,SAAS,CAAC,EAAE;QACT,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QACpB,EAAE,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;QAC/B,GAAG,EAAE,IAAI,CAAC;KACb,CAAC;IACF,CAAC,gBAAgB,CAAC,EAAE;QAChB,EAAE,EAAE,IAAI,CAAC;QACT,GAAG,EAAE,UAAU,CAAC;KACnB,CAAC;IACF,CAAC,oBAAoB,CAAC,EAAE;QACpB,EAAE,EAAE,UAAU,CAAC;QACf,GAAG,EAAE,IAAI,CAAC;KACb,CAAC;IACF,CAAC,iBAAiB,CAAC,EAAE;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,GAAG,EAAE,UAAU,CAAC;KACnB,CAAC;IACF,CAAC,MAAM,CAAC,EAAE;QACN,EAAE,EAAE;YACA,GAAG,EAAE,MAAM,CAAC;YACZ,MAAM,EAAE,WAAW,CAAC;SACvB,CAAC;QACF,GAAG,EAAE,QAAQ,CAAC;KACjB,CAAC;IACF,CAAC,aAAa,CAAC,EAAE;QACb,EAAE,EAAE;YACA,GAAG,EAAE,MAAM,CAAC;YACZ,aAAa,CAAC,EAAE,OAAO,CAAC;SAC3B,CAAC;QACF,GAAG,EAAE,MAAM,CAAC;KACf,CAAC;IACF,CAAC,aAAa,CAAC,EAAE;QACb,EAAE,EAAE;YACA,GAAG,EAAE,MAAM,CAAC;YACZ,KAAK,EAAE,GAAG,CAAC;YACX,aAAa,CAAC,EAAE,OAAO,CAAC;SAC3B,CAAC;QACF,GAAG,EAAE,IAAI,CAAC;KACb,CAAC;IACF,CAAC,gBAAgB,CAAC,EAAE;QAChB,EAAE,EAAE;YACA,GAAG,EAAE,MAAM,CAAC;SACf,CAAC;QACF,GAAG,EAAE,IAAI,CAAC;KACb,CAAC;CACL,GAAG,aAAa,CACpB,CAAC;AAEN,MAAM,MAAM,aAAa,GAAG;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAGF,MAAM,MAAM,mBAAmB,CAC3B,qBAAqB,SAAS,wBAAwB,GAAG,wBAAwB,EACjF,UAAU,SAAS,aAAa,GAAG,aAAa,IAChD;IACA,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CAEpC,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,QAAQ,SAAS,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,gBAAgB,CAAC,IAAI,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;AAE7I,MAAM,MAAM,cAAc,CAAC,UAAU,SAAS,gBAAgB,GAAG,gBAAgB,IAAI,wBAAwB,CAAC,UAAU,CAAC,GAAG,EAE3H,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,UAAU,SAAS,gBAAgB,GAAG,gBAAgB,OAAgC,cAAc,CAAC,UAAU,CAAC,CAAC"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
import { useComponentContext as E } from "../componentModel/componentContext.es.js";
|
|
2
|
+
const A = "APP-NAV-GOTO", O = "APP-NAV-GET-CONTEXT", P = "APP-NAV-CONTEXT-CHANGED", o = "APP-NAV-READ-HISTORY", t = "APP-NOTICE", N = "APP-CONFIG-GET", V = "APP-FETCH", n = "APP-KV-STORE-GET", C = "APP-KV-STORE-SET", s = "APP-KV-STORE-REMOVE", _ = () => E();
|
|
2
3
|
export {
|
|
3
|
-
|
|
4
|
+
N as $CONFIG_GET,
|
|
4
5
|
V as $FETCH,
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
n as $KV_STORE_GET,
|
|
7
|
+
s as $KV_STORE_REMOVE,
|
|
8
|
+
C as $KV_STORE_SET,
|
|
9
|
+
P as $NAV_CONTEXT_CHANGED,
|
|
10
|
+
O as $NAV_GET_CONTEXT,
|
|
11
|
+
A as $NAV_GOTO,
|
|
12
|
+
o as $NAV_READ_HISTORY,
|
|
13
|
+
t as $NOTICE,
|
|
14
|
+
_ as useBaseAppContext
|
|
12
15
|
};
|
|
13
16
|
//# sourceMappingURL=appContracts.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appContracts.es.js","sources":["../../src/appDomain/appContracts.ts"],"sourcesContent":["import { $CG_ERROR, MsgBus,
|
|
1
|
+
{"version":3,"file":"appContracts.es.js","sources":["../../src/appDomain/appContracts.ts"],"sourcesContent":["import { $CG_ERROR, MsgBus, MsgStruct, MsgStructBase, MsgStructFactory } from \"@actdim/msgmesh/msgBusCore\";\r\nimport { BaseSecurityDomainConfig as BaseSecurityDomainConfig, BaseSecurityMsgStruct } from \"@/appDomain/security/securityContracts\";\r\nimport { ReactNode } from \"react\";\r\nimport { KeysOf } from \"@actdim/utico/typeCore\";\r\nimport { ComponentRegistryContext } from \"@/componentModel/contracts\";\r\nimport { useComponentContext } from \"@/componentModel/componentContext\";\r\n\r\nexport const $NAV_GOTO = \"APP-NAV-GOTO\";\r\nexport const $NAV_GET_CONTEXT = \"APP-NAV-GET-CONTEXT\";\r\nexport const $NAV_CONTEXT_CHANGED = \"APP-NAV-CONTEXT-CHANGED\";\r\nexport const $NAV_READ_HISTORY = \"APP-NAV-READ-HISTORY\";\r\n// TOAST\r\nexport const $NOTICE = \"APP-NOTICE\";\r\nexport const $CONFIG_GET = \"APP-CONFIG-GET\";\r\n// ERROR?\r\nexport const $FETCH = \"APP-FETCH\";\r\n\r\nexport const $KV_STORE_GET = \"APP-KV-STORE-GET\";\r\nexport const $KV_STORE_SET = \"APP-KV-STORE-SET\";\r\nexport const $KV_STORE_REMOVE = \"APP-KV-STORE-REMOVE\";\r\n// TODO: has, clear, entries\r\n\r\nexport type Module = \"security\" | \"api-client\";\r\n\r\nexport type NavPath = {\r\n /**\r\n * A URL pathname, beginning with a /.\r\n */\r\n pathname: string;\r\n /**\r\n * A URL search string, beginning with a ?.\r\n */\r\n search: string;\r\n /**\r\n * A URL fragment identifier, beginning with a #.\r\n */\r\n hash: string;\r\n};\r\n\r\nexport type NavLocation<State = any> = NavPath & {\r\n /**\r\n * A value of arbitrary data associated with this location.\r\n */\r\n state: State;\r\n /**\r\n * A unique string associated with this location. May be used to safely store\r\n * and retrieve data in some other storage API, like `localStorage`.\r\n *\r\n * Note: This value is always \"default\" on the initial location.\r\n */\r\n key: string;\r\n};\r\n\r\nexport type NavAction =\r\n /**\r\n * A POP indicates a change to an arbitrary index in the history stack, such\r\n * as a back or forward navigation. It does not describe the direction of the\r\n * navigation, only that the current index changed.\r\n *\r\n * Note: This is the default action for newly created history objects.\r\n */\r\n | \"POP\"\r\n /**\r\n * A PUSH indicates a new entry being added to the history stack, such as when\r\n * a link is clicked and a new page loads. When this happens, all subsequent\r\n * entries in the stack are lost.\r\n */\r\n | \"PUSH\"\r\n /**\r\n * A REPLACE indicates the entry at the current index in the history stack\r\n * being replaced by a new one.\r\n */\r\n | \"REPLACE\";\r\n\r\n// AppRouteParams\r\nexport type NavRouteParams = Record<string, string | undefined>;\r\n\r\n// AppRoute\r\nexport type NavRoute<TParams extends NavRouteParams = NavRouteParams> = {\r\n path(params?: TParams): string;\r\n match(path: string): TParams;\r\n element: ReactNode;\r\n defaultParams?: TParams;\r\n};\r\n\r\nexport type NavRoutes = Record<string, NavRoute>;\r\n\r\ntype NavRouteStruct<TNavRoutes extends NavRoutes> = {\r\n [K in keyof TNavRoutes]: {\r\n route: K;\r\n params?: TNavRoutes[K][\"defaultParams\"];\r\n };\r\n}[keyof TNavRoutes];\r\n\r\nexport type NavContext = {\r\n // route?: NavRoute;\r\n location?: NavLocation;\r\n searchParams?: URLSearchParams;\r\n params?: NavRouteParams;\r\n navType?: NavAction;\r\n};\r\n\r\nexport type NavHistory = Array<NavContext>;\r\n\r\n// OperationContext?\r\nexport type AppError<TModule = Module> = {\r\n module: TModule;\r\n // code: string;\r\n type: string;\r\n title?: string;\r\n source?: any;\r\n details?: any;\r\n // instance?: string;\r\n timestamp?: string;\r\n // errors: AppError[];\r\n traceId?: string;\r\n field?: string;\r\n reason?: string;\r\n};\r\n\r\n// Base(App)ApiMsgStruct\r\nexport type BaseApiMsgStruct = BaseSecurityMsgStruct &\r\n MsgStructFactory<{\r\n // \"GET-VERSION\"?: {\r\n // in: any;\r\n // };\r\n }>;\r\n\r\n// BaseAppMsgStruct\r\nexport type BaseAppMsgStruct<TNavRoutes extends NavRoutes = NavRoutes> = BaseApiMsgStruct &\r\n MsgStructFactory<\r\n {\r\n [$NOTICE]: {\r\n in: {\r\n text: string;\r\n title?: string;\r\n type: any;\r\n };\r\n out: void;\r\n };\r\n [$CONFIG_GET]: {\r\n in: void;\r\n out: BaseAppDomainConfig;\r\n };\r\n [$NAV_GOTO]: {\r\n in: string | number;\r\n ex: NavRouteStruct<TNavRoutes>;\r\n out: void;\r\n };\r\n [$NAV_GET_CONTEXT]: {\r\n in: void;\r\n out: NavContext;\r\n };\r\n [$NAV_CONTEXT_CHANGED]: {\r\n in: NavContext;\r\n out: void;\r\n };\r\n [$NAV_READ_HISTORY]: {\r\n in: number;\r\n out: NavContext;\r\n };\r\n [$FETCH]: {\r\n in: {\r\n url: string;\r\n params: RequestInit;\r\n };\r\n out: Response;\r\n };\r\n [$KV_STORE_GET]: {\r\n in: {\r\n key: string;\r\n useEncryption?: boolean;\r\n };\r\n out: string;\r\n };\r\n [$KV_STORE_SET]: {\r\n in: {\r\n key: string;\r\n value: any;\r\n useEncryption?: boolean;\r\n };\r\n out: void;\r\n };\r\n [$KV_STORE_REMOVE]: {\r\n in: {\r\n key: string;\r\n };\r\n out: void;\r\n };\r\n } & MsgStructBase\r\n >;\r\n\r\nexport type BaseApiConfig = {\r\n url?: string;\r\n versions?: string[];\r\n};\r\n\r\n// BaseApp(Domain)Config\r\nexport type BaseAppDomainConfig<\r\n TSecurityDomainConfig extends BaseSecurityDomainConfig = BaseSecurityDomainConfig,\r\n TApiConfig extends BaseApiConfig = BaseApiConfig\r\n> = {\r\n id: string;\r\n name?: string;\r\n baseUrl: string;\r\n security: TSecurityDomainConfig;\r\n apis: Record<string, TApiConfig>;\r\n // HATEOAS? (React Admin)\r\n};\r\n\r\nexport type BaseAppBusChannels<TChannel extends keyof BaseAppMsgStruct | Array<keyof BaseAppMsgStruct>> = KeysOf<BaseAppMsgStruct, TChannel>;\r\n\r\nexport type BaseAppContext<TMsgStruct extends BaseAppMsgStruct = BaseAppMsgStruct> = ComponentRegistryContext<TMsgStruct> & {\r\n // securityProvider: SecurityProvider;\r\n};\r\n\r\nexport const useBaseAppContext = <TMsgStruct extends BaseAppMsgStruct = BaseAppMsgStruct>() => useComponentContext() as BaseAppContext<TMsgStruct>;"],"names":["$NAV_GOTO","$NAV_GET_CONTEXT","$NAV_CONTEXT_CHANGED","$NAV_READ_HISTORY","$NOTICE","$CONFIG_GET","$FETCH","$KV_STORE_GET","$KV_STORE_SET","$KV_STORE_REMOVE","useBaseAppContext","useComponentContext"],"mappings":";AAOO,MAAMA,IAAY,gBACZC,IAAmB,uBACnBC,IAAuB,2BACvBC,IAAoB,wBAEpBC,IAAU,cACVC,IAAc,kBAEdC,IAAS,aAETC,IAAgB,oBAChBC,IAAgB,oBAChBC,IAAmB,uBAqMnBC,IAAoB,MAA8DC,EAAA;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactHooks.d.ts","sourceRoot":"","sources":["../../src/appDomain/reactHooks.tsx"],"names":[],"mappings":"AACA,OAAO,EAAiB,iBAAiB,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAoB,MAAM,YAAY,CAAC;AAKnE,wBAAgB,qBAAqB,CACjC,KAAK,EAAE,iBAAiB,CAAC;IACrB,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC/B,CAAC,OAKL"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { useComponentContext as r } from "../componentModel/componentContext.es.js";
|
|
2
|
+
import o, { createContext as n } from "react";
|
|
3
|
+
import { registerAdapters as a } from "./adapters.es.js";
|
|
4
|
+
const c = n(void 0);
|
|
5
|
+
function s(e) {
|
|
6
|
+
const t = r();
|
|
7
|
+
return a(t.msgBus, e.value), /* @__PURE__ */ o.createElement(c.Provider, { value: e.value }, e.children);
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
s as MsgBusAdapterProvider
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=reactHooks.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactHooks.es.js","sources":["../../src/appDomain/reactHooks.tsx"],"sourcesContent":["import { useComponentContext } from '@/componentModel/componentContext';\r\nimport { createContext, PropsWithChildren } from 'react';\r\nimport { MsgBusAdapterConfig, registerAdapters } from './adapters';\r\nimport React from 'react';\r\n\r\nconst ReactContext = createContext<MsgBusAdapterConfig>(undefined);\r\n\r\nexport function MsgBusAdapterProvider(\r\n props: PropsWithChildren<{\r\n value?: MsgBusAdapterConfig;\r\n }>,\r\n) {\r\n const context = useComponentContext();\r\n registerAdapters(context.msgBus, props.value);\r\n return <ReactContext.Provider value={props.value}>{props.children}</ReactContext.Provider>;\r\n}\r\n"],"names":["ReactContext","createContext","MsgBusAdapterProvider","props","context","useComponentContext","registerAdapters","React"],"mappings":";;;AAKA,MAAMA,IAAeC,EAAmC,MAAS;AAE1D,SAASC,EACZC,GAGF;AACE,QAAMC,IAAUC,EAAA;AAChB,SAAAC,EAAiBF,EAAQ,QAAQD,EAAM,KAAK,GACrC,gBAAAI,EAAA,cAACP,EAAa,UAAb,EAAsB,OAAOG,EAAM,MAAA,GAAQA,EAAM,QAAS;AACtE;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MsgStruct, MsgStructBase } from '@actdim/msgmesh/msgBusCore';
|
|
2
2
|
import { RequireExtends, Skip } from '@actdim/utico/typeCore';
|
|
3
3
|
export declare enum AccessLevel {
|
|
4
4
|
None = 0,
|
|
@@ -29,7 +29,7 @@ export type SecurityTokens = {
|
|
|
29
29
|
accessToken?: string;
|
|
30
30
|
refreshToken?: string;
|
|
31
31
|
};
|
|
32
|
-
export type
|
|
32
|
+
export type BaseSecurityMsgStruct = RequireExtends<{
|
|
33
33
|
[$SIGNIN]: {
|
|
34
34
|
in: UserCredentials;
|
|
35
35
|
out: SecurityContext;
|
|
@@ -68,7 +68,7 @@ export type BaseSecurityBusStruct = RequireExtends<{
|
|
|
68
68
|
in: void;
|
|
69
69
|
out: BaseSecurityDomainConfig;
|
|
70
70
|
};
|
|
71
|
-
} &
|
|
71
|
+
} & MsgStructBase, MsgStruct>;
|
|
72
72
|
export type ISecurable = {
|
|
73
73
|
id: string;
|
|
74
74
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"securityContracts.d.ts","sourceRoot":"","sources":["../../../src/appDomain/security/securityContracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,
|
|
1
|
+
{"version":3,"file":"securityContracts.d.ts","sourceRoot":"","sources":["../../../src/appDomain/security/securityContracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"securityContracts.es.js","sources":["../../../src/appDomain/security/securityContracts.ts"],"sourcesContent":["import { MsgBus,
|
|
1
|
+
{"version":3,"file":"securityContracts.es.js","sources":["../../../src/appDomain/security/securityContracts.ts"],"sourcesContent":["import { MsgBus, MsgStruct, MsgStructBase } from \"@actdim/msgmesh/msgBusCore\";\r\nimport { RequireExtends, Skip } from \"@actdim/utico/typeCore\";\r\n// abstract\r\nexport enum AccessLevel {\r\n None = 0,\r\n Inherited = 1 << 0, // Unset\r\n NoRender = 1 << 1,\r\n Hidden = 1 << 2,\r\n Disabled = 1 << 3,\r\n ReadOnly = 1 << 4, // View\r\n Full = ~(~0 << 5) // Unrestricted\r\n}\r\n\r\n// HTTP RFC 7231\r\nexport type UserCredentials = {\r\n username: string;\r\n password: string;\r\n};\r\n\r\nexport type IAccessDescriptor = {\r\n // deny/grant reason(s)\r\n [P in AccessLevel]?: string;\r\n};\r\n\r\nexport const $SIGNIN = \"APP-SECURITY-AUTH-SIGNIN\";\r\nexport const $REQUEST_SIGNIN = \"APP-SECURITY-REQUEST-AUTH-SIGNIN\";\r\nexport const $SIGNOUT = \"APP-SECURITY-AUTH-SIGNOUT\";\r\nexport const $REQUEST_SIGNOUT = \"APP-SECURITY-REQUEST-AUTH-SIGNOUT\";\r\nexport const $REFRESH = \"APP-SECURITY-AUTH-REFRESH\";\r\nexport const $REQUEST_AUTH = \"APP-SECURITY-REQUEST-AUTH\";\r\nexport const $GET_ACL = \"APP-SECURITY-GET-ACL\";\r\nexport const $GET_CONTEXT = \"APP-SECURITY-GET-CONTEXT\";\r\nexport const $GET_CONFIG = \"APP-SECURITY-GET-CONFIG\";\r\n\r\nexport type SecurityTokens = {\r\n accessToken?: string;\r\n refreshToken?: string;\r\n};\r\n\r\n// Base(App)SecurityMsgStruct\r\nexport type BaseSecurityMsgStruct = RequireExtends<\r\n {\r\n [$SIGNIN]: {\r\n in: UserCredentials;\r\n out: SecurityContext;\r\n };\r\n [$REQUEST_SIGNIN]: {\r\n in: {\r\n callbackUrl: string;\r\n };\r\n // out: void;\r\n };\r\n [$SIGNOUT]: {\r\n in: void;\r\n out: void;\r\n };\r\n [$REQUEST_SIGNOUT]: {\r\n in: {\r\n callbackUrl: string;\r\n };\r\n // out: void;\r\n };\r\n [$REFRESH]: {\r\n in: Skip<SecurityTokens, \"accessToken\">;\r\n out: SecurityContext;\r\n };\r\n [$REQUEST_AUTH]: {\r\n in: void;\r\n out: void;\r\n };\r\n [$GET_ACL]: {\r\n in: ISecurable;\r\n out: IAccessDescriptor;\r\n };\r\n [$GET_CONTEXT]: {\r\n in: void;\r\n out: SecurityContext;\r\n };\r\n [$GET_CONFIG]: {\r\n in: void;\r\n out: BaseSecurityDomainConfig;\r\n }; \r\n } & MsgStructBase,\r\n MsgStruct\r\n>;\r\n\r\nexport type ISecurable = {\r\n id: string;\r\n};\r\n\r\n// AppSecurityContext\r\nexport type SecurityContext<TUserInfo = any> = {\r\n // isAuthenticated: boolean;\r\n // isExpired: boolean;\r\n accessToken: string;\r\n refreshToken: string;\r\n // sessionToken: string;\r\n // sid: string; // SID is an acronym for \"security identity\", grant recipient\r\n userInfo: TUserInfo;\r\n // authority: string;\r\n authProvider: string; // authSource\r\n domain: string; // protection space, scope of protection\r\n // authExpiresAt\r\n tokenExpiresAt: string;\r\n // acl: any;\r\n};\r\n\r\n// Base(App)Security(Domain)Config\r\nexport type BaseSecurityDomainConfig = {\r\n id: string;\r\n name?: string;\r\n authType: string;\r\n // endpoints\r\n routes: {\r\n authSignIn: string;\r\n authSignOut: string;\r\n authRefresh: string;\r\n // RFC 8414 (OIDC) — \"OAuth 2.0 Authorization Server Metadata\"\r\n // https://datatracker.ietf.org/doc/html/rfc8414 \r\n authService: string;\r\n };\r\n};\r\n"],"names":["AccessLevel","$SIGNIN","$REQUEST_SIGNIN","$SIGNOUT","$REQUEST_SIGNOUT","$REFRESH","$REQUEST_AUTH","$GET_ACL","$GET_CONTEXT","$GET_CONFIG"],"mappings":"AAGO,IAAKA,sBAAAA,OACRA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,YAAY,CAAA,IAAZ,aACAA,EAAAA,EAAA,WAAW,CAAA,IAAX,YACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,WAAW,CAAA,IAAX,YACAA,EAAAA,EAAA,WAAW,EAAA,IAAX,YACAA,EAAAA,EAAA,OAAO,EAAA,IAAP,QAPQA,IAAAA,KAAA,CAAA,CAAA;AAqBL,MAAMC,IAAU,4BACVC,IAAkB,oCAClBC,IAAW,6BACXC,IAAmB,qCACnBC,IAAW,6BACXC,IAAgB,6BAChBC,IAAW,wBACXC,IAAe,4BACfC,IAAc;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AccessLevel, IAccessDescriptor, ISecurable, UserCredentials, SecurityContext } from './securityContracts';
|
|
2
2
|
import { MsgBus } from '@actdim/msgmesh/msgBusCore';
|
|
3
|
-
import {
|
|
3
|
+
import { BaseAppMsgStruct } from '../appContracts';
|
|
4
4
|
export declare class SecurityProvider<TUserInfo = any> {
|
|
5
5
|
private msgBus;
|
|
6
6
|
private domainConfig;
|
|
@@ -14,7 +14,7 @@ export declare class SecurityProvider<TUserInfo = any> {
|
|
|
14
14
|
private acl;
|
|
15
15
|
private fetcher;
|
|
16
16
|
private init;
|
|
17
|
-
constructor(msgBus: MsgBus<
|
|
17
|
+
constructor(msgBus: MsgBus<BaseAppMsgStruct>);
|
|
18
18
|
getContext(): SecurityContext;
|
|
19
19
|
private updateConfigAsync;
|
|
20
20
|
restoreDataAsync(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"securityProvider.es.js","sources":["../../../src/appDomain/security/securityProvider.ts"],"sourcesContent":["import {\r\n AccessLevel,\r\n IAccessDescriptor,\r\n ISecurable,\r\n BaseSecurityDomainConfig,\r\n UserCredentials,\r\n SecurityTokens,\r\n SecurityContext\r\n} from \"./securityContracts\";\r\nimport { getValuePrefixer } from \"@actdim/utico/typeCore\";\r\nimport { jwtDecode } from \"jwt-decode\";\r\nimport { getResponseResult, IRequestParams, IRequestState, IResponseState } from \"@/net/request\";\r\nimport { ApiError } from \"@/net/apiError\";\r\nimport { MsgBus } from \"@actdim/msgmesh/msgBusCore\";\r\nimport { BaseAppBusStruct } from \"@/appDomain/appContracts\";\r\n\r\nconst userNameClaim = \"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name\";\r\n\r\n// JwtTokenPayload\r\ntype TokenPayload = {\r\n [userNameClaim]: string;\r\n};\r\n\r\n// Access denied\r\n// Insufficient privileges to perform this operation\r\nconst defaultAccessDeniedReason = \"Insufficient privileges. Contact your system Administrator.\";\r\n\r\nconst storageKeys = {\r\n accessToken: \"ACCESS_TOKEN\",\r\n refreshToken: \"REFRESH_TOKEN\",\r\n acl: \"ACL\",\r\n userCredentials: \"USER_CREDENTIALS\",\r\n userInfo: \"USER_INFO\"\r\n};\r\n\r\nfunction decodeJWTToken<T extends TokenPayload>(token: string): T {\r\n if (!token) {\r\n return null;\r\n }\r\n try {\r\n return jwtDecode<T>(this.accessToken);\r\n } catch {\r\n // something wrong with the token\r\n return null;\r\n }\r\n}\r\n\r\nexport class SecurityProvider<TUserInfo = any> {\r\n // private isAuthenticated: boolean;\r\n\r\n // private isExpired: boolean;\r\n\r\n private msgBus: MsgBus<BaseAppBusStruct>;\r\n\r\n private domainConfig: BaseSecurityDomainConfig;\r\n\r\n private storageKeys: typeof storageKeys;\r\n\r\n private accessToken: string;\r\n\r\n private refreshToken: string;\r\n\r\n private userCredentials: UserCredentials;\r\n\r\n private userInfo: TUserInfo;\r\n\r\n // private authority: string;\r\n private authProvider: string;\r\n\r\n private tokenExpiresAt: string;\r\n\r\n // RBAC vs ABAC vs PBAC: https://habr.com/ru/companies/otus/articles/698080/\r\n private acl: any;\r\n\r\n private fetcher: { fetch(url: RequestInfo, init?: RequestInit): Promise<Response> } = window;\r\n\r\n private init: Promise<any>;\r\n\r\n constructor(msgBus: MsgBus<BaseAppBusStruct>) {\r\n this.msgBus = msgBus;\r\n\r\n this.init = this.updateConfigAsync();\r\n\r\n // TODO: support custom requests\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-GET-CONTEXT\",\r\n callback: (msg) => {\r\n return this.getContext();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-GET-ACL\",\r\n callback: (msg) => {\r\n return this.getAcl(msg.payload);\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-AUTH-SIGNIN\",\r\n callback: (msg) => {\r\n return this.signInAsync(msg.payload);\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-AUTH-SIGNOUT\",\r\n callback: (msg) => {\r\n return this.signOutAsync();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-AUTH-REFRESH\",\r\n callback: (msg) => {\r\n return this.refreshAsync();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-REQUEST-AUTH\",\r\n callback: (msg) => {\r\n return this.requestAuthorize();\r\n }\r\n });\r\n\r\n // HELPER\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-GET-CONFIG\",\r\n callback: async (msg) => {\r\n return (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-CONFIG-GET\"\r\n })\r\n ).payload?.security;\r\n }\r\n });\r\n }\r\n\r\n public getContext(): SecurityContext {\r\n return {\r\n accessToken: this.accessToken,\r\n refreshToken: this.refreshToken,\r\n userInfo: this.userInfo,\r\n authProvider: this.authProvider,\r\n domain: this.domain,\r\n tokenExpiresAt: this.tokenExpiresAt\r\n };\r\n }\r\n\r\n private async updateConfigAsync() {\r\n const msg = await this.msgBus.dispatchAsync({\r\n channel: \"APP-CONFIG-GET\"\r\n });\r\n this.domainConfig = msg.payload.security;\r\n const prefixer = getValuePrefixer<typeof storageKeys>(`${this.domainConfig.id}/`);\r\n this.storageKeys = prefixer(storageKeys);\r\n await this.restoreDataAsync();\r\n }\r\n\r\n async restoreDataAsync() {\r\n this.accessToken = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.accessToken\r\n }\r\n })\r\n ).payload;\r\n this.refreshToken = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.refreshToken\r\n }\r\n })\r\n ).payload;\r\n let value = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.userCredentials\r\n }\r\n })\r\n ).payload;\r\n\r\n this.userCredentials = value\r\n ? JSON.parse(value)\r\n : {\r\n username: undefined,\r\n password: undefined\r\n };\r\n\r\n value = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.acl\r\n }\r\n })\r\n ).payload;\r\n\r\n this.acl = value ? JSON.parse(value) : {};\r\n\r\n if (this.accessToken) {\r\n this.msgBus.dispatch({\r\n channel: \"APP-SECURITY-AUTH-SIGNIN\",\r\n group: \"out\",\r\n payload: this.getContext()\r\n });\r\n }\r\n }\r\n\r\n public get domain(): string {\r\n return this.domainConfig.id;\r\n }\r\n\r\n // cleanUserAndActionsStorage = (): void => {\r\n // const obsoleteKeysRegexMatch = /^(user|actions)@.+$/;\r\n // for (let i = localStorage.length - 1; i >= 0; i--) {\r\n // const key = localStorage.key(i);\r\n // if (key && obsoleteKeysRegexMatch.test(key)) {\r\n // localStorage.removeItem(key);\r\n // }\r\n // }\r\n // };\r\n\r\n // removeSavedData\r\n async clearSavedDataAsync() {\r\n this.accessToken = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.accessToken\r\n }\r\n });\r\n this.refreshToken = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.refreshToken\r\n }\r\n });\r\n this.userCredentials = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.userCredentials\r\n }\r\n });\r\n this.acl = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.acl\r\n }\r\n });\r\n }\r\n\r\n async requestAuthorize() {\r\n this.accessToken = null;\r\n this.acl = null;\r\n\r\n const signIn = this.msgBus.onceAsync({\r\n channel: \"APP-SECURITY-AUTH-SIGNIN\",\r\n group: \"out\"\r\n });\r\n\r\n const signOut = async () => {\r\n await this.msgBus.onceAsync({\r\n channel: \"APP-SECURITY-AUTH-SIGNOUT\",\r\n group: \"out\"\r\n });\r\n throw new Error(\"Auth failed: login aborted\");\r\n };\r\n\r\n this.msgBus.dispatch({\r\n channel: \"APP-SECURITY-REQUEST-AUTH-SIGNIN\",\r\n payload: {\r\n callbackUrl: window.location.pathname + window.location.search\r\n }\r\n });\r\n await Promise.race([signIn, signOut]);\r\n }\r\n\r\n async signInAsync(credentials: UserCredentials) {\r\n let url = this.domainConfig.routes?.authSignIn;\r\n\r\n url = url.replace(/[?&]$/, \"\");\r\n\r\n const content = JSON.stringify(credentials);\r\n\r\n // application/x-www-form-urlencoded?\r\n // username=&password=\r\n\r\n const requestParams: IRequestParams = {\r\n url: url,\r\n body: content,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"text/plain\"\r\n }\r\n };\r\n\r\n const request: IRequestState = {\r\n ...requestParams,\r\n status: \"executing\"\r\n };\r\n\r\n const response: IResponseState = await this.fetcher.fetch(url, requestParams);\r\n await getResponseResult(response, request);\r\n ApiError.assert(response, request);\r\n\r\n let tokens = response.resolved.json as SecurityTokens;\r\n\r\n this.userCredentials = credentials;\r\n\r\n this.accessToken = tokens.accessToken;\r\n this.refreshToken = tokens.refreshToken;\r\n // this.acl = ...;\r\n\r\n this.saveDataAsync();\r\n\r\n return this.getContext();\r\n }\r\n\r\n async saveDataAsync() {\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.accessToken,\r\n value: this.accessToken || null\r\n }\r\n });\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.refreshToken,\r\n value: this.refreshToken || null\r\n }\r\n });\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.userCredentials,\r\n value: this.userCredentials ? JSON.stringify(this.userCredentials) : \"\"\r\n }\r\n });\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.acl,\r\n value: this.acl ? JSON.stringify(this.acl) : \"\"\r\n }\r\n });\r\n }\r\n\r\n async signOutAsync() {\r\n let url = this.domainConfig.routes?.authSignOut;\r\n if (url) {\r\n url = url.replace(/[?&]$/, \"\");\r\n }\r\n\r\n const requestParams: IRequestParams = {\r\n url: url,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"text/plain\"\r\n }\r\n };\r\n\r\n const request: IRequestState = {\r\n ...requestParams,\r\n status: \"executing\"\r\n };\r\n\r\n const response: IResponseState = await this.fetcher.fetch(url, requestParams);\r\n await getResponseResult(response, request);\r\n ApiError.assert(response, request);\r\n\r\n // this.accessToken = null;\r\n // this.refreshToken = null;\r\n // this.userCredentials = null;\r\n // this.acl = null;\r\n // this.saveDataAsync();\r\n this.clearSavedDataAsync();\r\n }\r\n\r\n async refreshAsync() {\r\n let url = this.domainConfig.routes?.authRefresh;\r\n if (url) {\r\n url = url.replace(/[?&]$/, \"\");\r\n }\r\n\r\n let tokens: SecurityTokens = {\r\n refreshToken: this.refreshToken\r\n };\r\n\r\n const content = JSON.stringify(tokens);\r\n\r\n const requestParams: IRequestParams = {\r\n url: url,\r\n body: content,\r\n method: \"POST\",\r\n // useAuth: true,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"text/plain\"\r\n }\r\n };\r\n\r\n const request: IRequestState = {\r\n ...requestParams,\r\n status: \"executing\"\r\n };\r\n\r\n const response: IResponseState = await this.fetcher.fetch(url, requestParams);\r\n await getResponseResult(response, request);\r\n ApiError.assert(response, request);\r\n\r\n tokens = response.resolved.json as SecurityTokens;\r\n\r\n this.accessToken = tokens.accessToken;\r\n this.refreshToken = tokens.refreshToken;\r\n // this.userInfo = ...; // TODO\r\n // this.acl = ...;\r\n\r\n this.saveDataAsync();\r\n\r\n return this.getContext();\r\n }\r\n\r\n async getAcl<T extends ISecurable>(obj: T) {\r\n // TODO: read from this.acl\r\n\r\n return {\r\n [AccessLevel.Full]: \"\"\r\n } as IAccessDescriptor;\r\n }\r\n\r\n // authorize\r\n async verifyAccess<T extends ISecurable>(obj: T, accessLevel = AccessLevel.Full) {\r\n const acl = this.getAcl(obj);\r\n\r\n // TODO: check accessDescriptors\r\n\r\n return false;\r\n }\r\n}\r\n"],"names":["storageKeys","SecurityProvider","msgBus","msg","prefixer","getValuePrefixer","value","signIn","signOut","credentials","url","content","requestParams","request","response","getResponseResult","ApiError","tokens","obj","AccessLevel","accessLevel"],"mappings":";;;;;AA2BA,MAAMA,IAAc;AAAA,EAChB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,KAAK;AAAA,EACL,iBAAiB;AAAA,EACjB,UAAU;AACd;AAcO,MAAMC,EAAkC;AAAA;AAAA;AAAA,EAKnC;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA;AAAA,EAGA;AAAA,EAEA;AAAA;AAAA,EAGA;AAAA,EAEA,UAA8E;AAAA,EAE9E;AAAA,EAER,YAAYC,GAAkC;AAC1C,SAAK,SAASA,GAEd,KAAK,OAAO,KAAK,kBAAA,GAIjB,KAAK,OAAO,QAAQ;AAAA,MAChB,SAAS;AAAA,MACT,UAAU,CAACC,MACA,KAAK,WAAA;AAAA,IAChB,CACH,GAED,KAAK,OAAO,QAAQ;AAAA,MAChB,SAAS;AAAA,MACT,UAAU,CAACA,MACA,KAAK,OAAOA,EAAI,OAAO;AAAA,IAClC,CACH,GAED,KAAK,OAAO,QAAQ;AAAA,MAChB,SAAS;AAAA,MACT,UAAU,CAACA,MACA,KAAK,YAAYA,EAAI,OAAO;AAAA,IACvC,CACH,GAED,KAAK,OAAO,QAAQ;AAAA,MAChB,SAAS;AAAA,MACT,UAAU,CAACA,MACA,KAAK,aAAA;AAAA,IAChB,CACH,GAED,KAAK,OAAO,QAAQ;AAAA,MAChB,SAAS;AAAA,MACT,UAAU,CAACA,MACA,KAAK,aAAA;AAAA,IAChB,CACH,GAED,KAAK,OAAO,QAAQ;AAAA,MAChB,SAAS;AAAA,MACT,UAAU,CAACA,MACA,KAAK,iBAAA;AAAA,IAChB,CACH,GAGD,KAAK,OAAO,QAAQ;AAAA,MAChB,SAAS;AAAA,MACT,UAAU,OAAOA,OAET,MAAM,KAAK,OAAO,cAAc;AAAA,QAC5B,SAAS;AAAA,MAAA,CACZ,GACH,SAAS;AAAA,IACf,CACH;AAAA,EACL;AAAA,EAEO,aAA8B;AACjC,WAAO;AAAA,MACH,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB,UAAU,KAAK;AAAA,MACf,cAAc,KAAK;AAAA,MACnB,QAAQ,KAAK;AAAA,MACb,gBAAgB,KAAK;AAAA,IAAA;AAAA,EAE7B;AAAA,EAEA,MAAc,oBAAoB;AAC9B,UAAMA,IAAM,MAAM,KAAK,OAAO,cAAc;AAAA,MACxC,SAAS;AAAA,IAAA,CACZ;AACD,SAAK,eAAeA,EAAI,QAAQ;AAChC,UAAMC,IAAWC,EAAqC,GAAG,KAAK,aAAa,EAAE,GAAG;AAChF,SAAK,cAAcD,EAASJ,CAAW,GACvC,MAAM,KAAK,iBAAA;AAAA,EACf;AAAA,EAEA,MAAM,mBAAmB;AACrB,SAAK,eACD,MAAM,KAAK,OAAO,cAAc;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,QACL,KAAK,KAAK,YAAY;AAAA,MAAA;AAAA,IAC1B,CACH,GACH,SACF,KAAK,gBACD,MAAM,KAAK,OAAO,cAAc;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,QACL,KAAK,KAAK,YAAY;AAAA,MAAA;AAAA,IAC1B,CACH,GACH;AACF,QAAIM,KACA,MAAM,KAAK,OAAO,cAAc;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,QACL,KAAK,KAAK,YAAY;AAAA,MAAA;AAAA,IAC1B,CACH,GACH;AAEF,SAAK,kBAAkBA,IACjB,KAAK,MAAMA,CAAK,IAChB;AAAA,MACE,UAAU;AAAA,MACV,UAAU;AAAA,IAAA,GAGlBA,KACI,MAAM,KAAK,OAAO,cAAc;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,QACL,KAAK,KAAK,YAAY;AAAA,MAAA;AAAA,IAC1B,CACH,GACH,SAEF,KAAK,MAAMA,IAAQ,KAAK,MAAMA,CAAK,IAAI,CAAA,GAEnC,KAAK,eACL,KAAK,OAAO,SAAS;AAAA,MACjB,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS,KAAK,WAAA;AAAA,IAAW,CAC5B;AAAA,EAET;AAAA,EAEA,IAAW,SAAiB;AACxB,WAAO,KAAK,aAAa;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,sBAAsB;AACxB,SAAK,cAAc,MACnB,MAAM,KAAK,OAAO,cAAc;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,QACL,KAAK,KAAK,YAAY;AAAA,MAAA;AAAA,IAC1B,CACH,GACD,KAAK,eAAe,MACpB,MAAM,KAAK,OAAO,cAAc;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,QACL,KAAK,KAAK,YAAY;AAAA,MAAA;AAAA,IAC1B,CACH,GACD,KAAK,kBAAkB,MACvB,MAAM,KAAK,OAAO,cAAc;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,QACL,KAAK,KAAK,YAAY;AAAA,MAAA;AAAA,IAC1B,CACH,GACD,KAAK,MAAM,MACX,MAAM,KAAK,OAAO,cAAc;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,QACL,KAAK,KAAK,YAAY;AAAA,MAAA;AAAA,IAC1B,CACH;AAAA,EACL;AAAA,EAEA,MAAM,mBAAmB;AACrB,SAAK,cAAc,MACnB,KAAK,MAAM;AAEX,UAAMC,IAAS,KAAK,OAAO,UAAU;AAAA,MACjC,SAAS;AAAA,MACT,OAAO;AAAA,IAAA,CACV,GAEKC,IAAU,YAAY;AACxB,kBAAM,KAAK,OAAO,UAAU;AAAA,QACxB,SAAS;AAAA,QACT,OAAO;AAAA,MAAA,CACV,GACK,IAAI,MAAM,4BAA4B;AAAA,IAChD;AAEA,SAAK,OAAO,SAAS;AAAA,MACjB,SAAS;AAAA,MACT,SAAS;AAAA,QACL,aAAa,OAAO,SAAS,WAAW,OAAO,SAAS;AAAA,MAAA;AAAA,IAC5D,CACH,GACD,MAAM,QAAQ,KAAK,CAACD,GAAQC,CAAO,CAAC;AAAA,EACxC;AAAA,EAEA,MAAM,YAAYC,GAA8B;AAC5C,QAAIC,IAAM,KAAK,aAAa,QAAQ;AAEpC,IAAAA,IAAMA,EAAI,QAAQ,SAAS,EAAE;AAE7B,UAAMC,IAAU,KAAK,UAAUF,CAAW,GAKpCG,IAAgC;AAAA,MAClC,KAAAF;AAAA,MACA,MAAMC;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB;AAAA,QAChB,QAAQ;AAAA,MAAA;AAAA,IACZ,GAGEE,IAAyB;AAAA,MAC3B,GAAGD;AAAA,MACH,QAAQ;AAAA,IAAA,GAGNE,IAA2B,MAAM,KAAK,QAAQ,MAAMJ,GAAKE,CAAa;AAC5E,UAAMG,EAAkBD,GAAUD,CAAO,GACzCG,EAAS,OAAOF,GAAUD,CAAO;AAEjC,QAAII,IAASH,EAAS,SAAS;AAE/B,gBAAK,kBAAkBL,GAEvB,KAAK,cAAcQ,EAAO,aAC1B,KAAK,eAAeA,EAAO,cAG3B,KAAK,cAAA,GAEE,KAAK,WAAA;AAAA,EAChB;AAAA,EAEA,MAAM,gBAAgB;AAClB,UAAM,KAAK,OAAO,cAAc;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,QACL,KAAK,KAAK,YAAY;AAAA,QACtB,OAAO,KAAK,eAAe;AAAA,MAAA;AAAA,IAC/B,CACH,GACD,MAAM,KAAK,OAAO,cAAc;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,QACL,KAAK,KAAK,YAAY;AAAA,QACtB,OAAO,KAAK,gBAAgB;AAAA,MAAA;AAAA,IAChC,CACH,GACD,MAAM,KAAK,OAAO,cAAc;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,QACL,KAAK,KAAK,YAAY;AAAA,QACtB,OAAO,KAAK,kBAAkB,KAAK,UAAU,KAAK,eAAe,IAAI;AAAA,MAAA;AAAA,IACzE,CACH,GACD,MAAM,KAAK,OAAO,cAAc;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,QACL,KAAK,KAAK,YAAY;AAAA,QACtB,OAAO,KAAK,MAAM,KAAK,UAAU,KAAK,GAAG,IAAI;AAAA,MAAA;AAAA,IACjD,CACH;AAAA,EACL;AAAA,EAEA,MAAM,eAAe;AACjB,QAAIP,IAAM,KAAK,aAAa,QAAQ;AACpC,IAAIA,MACAA,IAAMA,EAAI,QAAQ,SAAS,EAAE;AAGjC,UAAME,IAAgC;AAAA,MAClC,KAAAF;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB;AAAA,QAChB,QAAQ;AAAA,MAAA;AAAA,IACZ,GAGEG,IAAyB;AAAA,MAC3B,GAAGD;AAAA,MACH,QAAQ;AAAA,IAAA,GAGNE,IAA2B,MAAM,KAAK,QAAQ,MAAMJ,GAAKE,CAAa;AAC5E,UAAMG,EAAkBD,GAAUD,CAAO,GACzCG,EAAS,OAAOF,GAAUD,CAAO,GAOjC,KAAK,oBAAA;AAAA,EACT;AAAA,EAEA,MAAM,eAAe;AACjB,QAAIH,IAAM,KAAK,aAAa,QAAQ;AACpC,IAAIA,MACAA,IAAMA,EAAI,QAAQ,SAAS,EAAE;AAGjC,QAAIO,IAAyB;AAAA,MACzB,cAAc,KAAK;AAAA,IAAA;AAGvB,UAAMN,IAAU,KAAK,UAAUM,CAAM,GAE/BL,IAAgC;AAAA,MAClC,KAAAF;AAAA,MACA,MAAMC;AAAA,MACN,QAAQ;AAAA;AAAA,MAER,SAAS;AAAA,QACL,gBAAgB;AAAA,QAChB,QAAQ;AAAA,MAAA;AAAA,IACZ,GAGEE,IAAyB;AAAA,MAC3B,GAAGD;AAAA,MACH,QAAQ;AAAA,IAAA,GAGNE,IAA2B,MAAM,KAAK,QAAQ,MAAMJ,GAAKE,CAAa;AAC5E,iBAAMG,EAAkBD,GAAUD,CAAO,GACzCG,EAAS,OAAOF,GAAUD,CAAO,GAEjCI,IAASH,EAAS,SAAS,MAE3B,KAAK,cAAcG,EAAO,aAC1B,KAAK,eAAeA,EAAO,cAI3B,KAAK,cAAA,GAEE,KAAK,WAAA;AAAA,EAChB;AAAA,EAEA,MAAM,OAA6BC,GAAQ;AAGvC,WAAO;AAAA,MACH,CAACC,EAAY,IAAI,GAAG;AAAA,IAAA;AAAA,EAE5B;AAAA;AAAA,EAGA,MAAM,aAAmCD,GAAQE,IAAcD,EAAY,MAAM;AACjE,gBAAK,OAAOD,CAAG,GAIpB;AAAA,EACX;AACJ;"}
|
|
1
|
+
{"version":3,"file":"securityProvider.es.js","sources":["../../../src/appDomain/security/securityProvider.ts"],"sourcesContent":["import {\r\n AccessLevel,\r\n IAccessDescriptor,\r\n ISecurable,\r\n BaseSecurityDomainConfig,\r\n UserCredentials,\r\n SecurityTokens,\r\n SecurityContext\r\n} from \"./securityContracts\";\r\nimport { getValuePrefixer } from \"@actdim/utico/typeCore\";\r\nimport { jwtDecode } from \"jwt-decode\";\r\nimport { getResponseResult, IRequestParams, IRequestState, IResponseState } from \"@/net/request\";\r\nimport { ApiError } from \"@/net/apiError\";\r\nimport { MsgBus } from \"@actdim/msgmesh/msgBusCore\";\r\nimport { BaseAppMsgStruct } from \"@/appDomain/appContracts\";\r\n\r\nconst userNameClaim = \"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name\";\r\n\r\n// JwtTokenPayload\r\ntype TokenPayload = {\r\n [userNameClaim]: string;\r\n};\r\n\r\n// Access denied\r\n// Insufficient privileges to perform this operation\r\nconst defaultAccessDeniedReason = \"Insufficient privileges. Contact your system Administrator.\";\r\n\r\nconst storageKeys = {\r\n accessToken: \"ACCESS_TOKEN\",\r\n refreshToken: \"REFRESH_TOKEN\",\r\n acl: \"ACL\",\r\n userCredentials: \"USER_CREDENTIALS\",\r\n userInfo: \"USER_INFO\"\r\n};\r\n\r\nfunction decodeJWTToken<T extends TokenPayload>(token: string): T {\r\n if (!token) {\r\n return null;\r\n }\r\n try {\r\n return jwtDecode<T>(this.accessToken);\r\n } catch {\r\n // something wrong with the token\r\n return null;\r\n }\r\n}\r\n\r\nexport class SecurityProvider<TUserInfo = any> {\r\n // private isAuthenticated: boolean;\r\n\r\n // private isExpired: boolean;\r\n\r\n private msgBus: MsgBus<BaseAppMsgStruct>;\r\n\r\n private domainConfig: BaseSecurityDomainConfig;\r\n\r\n private storageKeys: typeof storageKeys;\r\n\r\n private accessToken: string;\r\n\r\n private refreshToken: string;\r\n\r\n private userCredentials: UserCredentials;\r\n\r\n private userInfo: TUserInfo;\r\n\r\n // private authority: string;\r\n private authProvider: string;\r\n\r\n private tokenExpiresAt: string;\r\n\r\n // RBAC vs ABAC vs PBAC: https://habr.com/ru/companies/otus/articles/698080/\r\n private acl: any;\r\n\r\n private fetcher: { fetch(url: RequestInfo, init?: RequestInit): Promise<Response> } = window;\r\n\r\n private init: Promise<any>;\r\n\r\n constructor(msgBus: MsgBus<BaseAppMsgStruct>) {\r\n this.msgBus = msgBus;\r\n\r\n this.init = this.updateConfigAsync();\r\n\r\n // TODO: support custom requests\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-GET-CONTEXT\",\r\n callback: (msg) => {\r\n return this.getContext();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-GET-ACL\",\r\n callback: (msg) => {\r\n return this.getAcl(msg.payload);\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-AUTH-SIGNIN\",\r\n callback: (msg) => {\r\n return this.signInAsync(msg.payload);\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-AUTH-SIGNOUT\",\r\n callback: (msg) => {\r\n return this.signOutAsync();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-AUTH-REFRESH\",\r\n callback: (msg) => {\r\n return this.refreshAsync();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-REQUEST-AUTH\",\r\n callback: (msg) => {\r\n return this.requestAuthorize();\r\n }\r\n });\r\n\r\n // HELPER\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-GET-CONFIG\",\r\n callback: async (msg) => {\r\n return (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-CONFIG-GET\"\r\n })\r\n ).payload?.security;\r\n }\r\n });\r\n }\r\n\r\n public getContext(): SecurityContext {\r\n return {\r\n accessToken: this.accessToken,\r\n refreshToken: this.refreshToken,\r\n userInfo: this.userInfo,\r\n authProvider: this.authProvider,\r\n domain: this.domain,\r\n tokenExpiresAt: this.tokenExpiresAt\r\n };\r\n }\r\n\r\n private async updateConfigAsync() {\r\n const msg = await this.msgBus.dispatchAsync({\r\n channel: \"APP-CONFIG-GET\"\r\n });\r\n this.domainConfig = msg.payload.security;\r\n const prefixer = getValuePrefixer<typeof storageKeys>(`${this.domainConfig.id}/`);\r\n this.storageKeys = prefixer(storageKeys);\r\n await this.restoreDataAsync();\r\n }\r\n\r\n async restoreDataAsync() {\r\n this.accessToken = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.accessToken\r\n }\r\n })\r\n ).payload;\r\n this.refreshToken = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.refreshToken\r\n }\r\n })\r\n ).payload;\r\n let value = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.userCredentials\r\n }\r\n })\r\n ).payload;\r\n\r\n this.userCredentials = value\r\n ? JSON.parse(value)\r\n : {\r\n username: undefined,\r\n password: undefined\r\n };\r\n\r\n value = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.acl\r\n }\r\n })\r\n ).payload;\r\n\r\n this.acl = value ? JSON.parse(value) : {};\r\n\r\n if (this.accessToken) {\r\n this.msgBus.dispatch({\r\n channel: \"APP-SECURITY-AUTH-SIGNIN\",\r\n group: \"out\",\r\n payload: this.getContext()\r\n });\r\n }\r\n }\r\n\r\n public get domain(): string {\r\n return this.domainConfig.id;\r\n }\r\n\r\n // cleanUserAndActionsStorage = (): void => {\r\n // const obsoleteKeysRegexMatch = /^(user|actions)@.+$/;\r\n // for (let i = localStorage.length - 1; i >= 0; i--) {\r\n // const key = localStorage.key(i);\r\n // if (key && obsoleteKeysRegexMatch.test(key)) {\r\n // localStorage.removeItem(key);\r\n // }\r\n // }\r\n // };\r\n\r\n // removeSavedData\r\n async clearSavedDataAsync() {\r\n this.accessToken = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.accessToken\r\n }\r\n });\r\n this.refreshToken = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.refreshToken\r\n }\r\n });\r\n this.userCredentials = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.userCredentials\r\n }\r\n });\r\n this.acl = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.acl\r\n }\r\n });\r\n }\r\n\r\n async requestAuthorize() {\r\n this.accessToken = null;\r\n this.acl = null;\r\n\r\n const signIn = this.msgBus.onceAsync({\r\n channel: \"APP-SECURITY-AUTH-SIGNIN\",\r\n group: \"out\"\r\n });\r\n\r\n const signOut = async () => {\r\n await this.msgBus.onceAsync({\r\n channel: \"APP-SECURITY-AUTH-SIGNOUT\",\r\n group: \"out\"\r\n });\r\n throw new Error(\"Auth failed: login aborted\");\r\n };\r\n\r\n this.msgBus.dispatch({\r\n channel: \"APP-SECURITY-REQUEST-AUTH-SIGNIN\",\r\n payload: {\r\n callbackUrl: window.location.pathname + window.location.search\r\n }\r\n });\r\n await Promise.race([signIn, signOut]);\r\n }\r\n\r\n async signInAsync(credentials: UserCredentials) {\r\n let url = this.domainConfig.routes?.authSignIn;\r\n\r\n url = url.replace(/[?&]$/, \"\");\r\n\r\n const content = JSON.stringify(credentials);\r\n\r\n // application/x-www-form-urlencoded?\r\n // username=&password=\r\n\r\n const requestParams: IRequestParams = {\r\n url: url,\r\n body: content,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"text/plain\"\r\n }\r\n };\r\n\r\n const request: IRequestState = {\r\n ...requestParams,\r\n status: \"executing\"\r\n };\r\n\r\n const response: IResponseState = await this.fetcher.fetch(url, requestParams);\r\n await getResponseResult(response, request);\r\n ApiError.assert(response, request);\r\n\r\n let tokens = response.resolved.json as SecurityTokens;\r\n\r\n this.userCredentials = credentials;\r\n\r\n this.accessToken = tokens.accessToken;\r\n this.refreshToken = tokens.refreshToken;\r\n // this.acl = ...;\r\n\r\n this.saveDataAsync();\r\n\r\n return this.getContext();\r\n }\r\n\r\n async saveDataAsync() {\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.accessToken,\r\n value: this.accessToken || null\r\n }\r\n });\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.refreshToken,\r\n value: this.refreshToken || null\r\n }\r\n });\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.userCredentials,\r\n value: this.userCredentials ? JSON.stringify(this.userCredentials) : \"\"\r\n }\r\n });\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.acl,\r\n value: this.acl ? JSON.stringify(this.acl) : \"\"\r\n }\r\n });\r\n }\r\n\r\n async signOutAsync() {\r\n let url = this.domainConfig.routes?.authSignOut;\r\n if (url) {\r\n url = url.replace(/[?&]$/, \"\");\r\n }\r\n\r\n const requestParams: IRequestParams = {\r\n url: url,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"text/plain\"\r\n }\r\n };\r\n\r\n const request: IRequestState = {\r\n ...requestParams,\r\n status: \"executing\"\r\n };\r\n\r\n const response: IResponseState = await this.fetcher.fetch(url, requestParams);\r\n await getResponseResult(response, request);\r\n ApiError.assert(response, request);\r\n\r\n // this.accessToken = null;\r\n // this.refreshToken = null;\r\n // this.userCredentials = null;\r\n // this.acl = null;\r\n // this.saveDataAsync();\r\n this.clearSavedDataAsync();\r\n }\r\n\r\n async refreshAsync() {\r\n let url = this.domainConfig.routes?.authRefresh;\r\n if (url) {\r\n url = url.replace(/[?&]$/, \"\");\r\n }\r\n\r\n let tokens: SecurityTokens = {\r\n refreshToken: this.refreshToken\r\n };\r\n\r\n const content = JSON.stringify(tokens);\r\n\r\n const requestParams: IRequestParams = {\r\n url: url,\r\n body: content,\r\n method: \"POST\",\r\n // useAuth: true,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"text/plain\"\r\n }\r\n };\r\n\r\n const request: IRequestState = {\r\n ...requestParams,\r\n status: \"executing\"\r\n };\r\n\r\n const response: IResponseState = await this.fetcher.fetch(url, requestParams);\r\n await getResponseResult(response, request);\r\n ApiError.assert(response, request);\r\n\r\n tokens = response.resolved.json as SecurityTokens;\r\n\r\n this.accessToken = tokens.accessToken;\r\n this.refreshToken = tokens.refreshToken;\r\n // this.userInfo = ...; // TODO\r\n // this.acl = ...;\r\n\r\n this.saveDataAsync();\r\n\r\n return this.getContext();\r\n }\r\n\r\n async getAcl<T extends ISecurable>(obj: T) {\r\n // TODO: read from this.acl\r\n\r\n return {\r\n [AccessLevel.Full]: \"\"\r\n } as IAccessDescriptor;\r\n }\r\n\r\n // authorize\r\n async verifyAccess<T extends ISecurable>(obj: T, accessLevel = AccessLevel.Full) {\r\n const acl = this.getAcl(obj);\r\n\r\n // TODO: check accessDescriptors\r\n\r\n return false;\r\n }\r\n}\r\n"],"names":["storageKeys","SecurityProvider","msgBus","msg","prefixer","getValuePrefixer","value","signIn","signOut","credentials","url","content","requestParams","request","response","getResponseResult","ApiError","tokens","obj","AccessLevel","accessLevel"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ComponentParams, ComponentStruct } from './componentModel';
|
|
2
|
+
import { default as React } from 'react';
|
|
3
|
+
import { MsgStruct } from '@actdim/msgmesh/msgBusCore';
|
|
4
|
+
export type DynamicContentStruct<TData = any, TMsgStruct extends MsgStruct = MsgStruct> = ComponentStruct<TMsgStruct, {
|
|
5
|
+
props: {
|
|
6
|
+
data: TData;
|
|
7
|
+
render: () => React.ReactNode;
|
|
8
|
+
};
|
|
9
|
+
methods: {};
|
|
10
|
+
children: {};
|
|
11
|
+
msgScope: {};
|
|
12
|
+
}>;
|
|
13
|
+
export declare function useDynamicContent<TData = any>(params: ComponentParams<DynamicContentStruct<TData>>): any;
|
|
14
|
+
//# sourceMappingURL=DynamicContent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DynamicContent.d.ts","sourceRoot":"","sources":["../../src/componentModel/DynamicContent.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEH,eAAe,EACf,eAAe,EAElB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,MAAM,MAAM,oBAAoB,CAC5B,KAAK,GAAG,GAAG,EACX,UAAU,SAAS,SAAS,GAAG,SAAS,IACxC,eAAe,CACf,UAAU,EACV;IACI,KAAK,EAAE;QACH,IAAI,EAAE,KAAK,CAAC;QACZ,MAAM,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;KACjC,CAAC;IACF,OAAO,EAAE,EAAE,CAAC;IACZ,QAAQ,EAAE,EAAE,CAAC;IACb,QAAQ,EAAE,EAAE,CAAC;CAChB,CACJ,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,KAAK,GAAG,GAAG,EACzC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,OAcvD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { useComponent as e } from "./componentModel.es.js";
|
|
2
|
+
function p(o) {
|
|
3
|
+
return e({
|
|
4
|
+
props: {
|
|
5
|
+
render: void 0,
|
|
6
|
+
data: void 0
|
|
7
|
+
},
|
|
8
|
+
view: (m, n) => n.render()
|
|
9
|
+
}, o);
|
|
10
|
+
}
|
|
11
|
+
export {
|
|
12
|
+
p as useDynamicContent
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=DynamicContent.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DynamicContent.es.js","sources":["../../src/componentModel/DynamicContent.tsx"],"sourcesContent":["import {\n Component,\n ComponentParams,\n ComponentStruct,\n useComponent,\n} from '@/componentModel/componentModel';\nimport React from 'react';\nimport { MsgStruct } from '@actdim/msgmesh/msgBusCore';\n\nexport type DynamicContentStruct<\n TData = any,\n TMsgStruct extends MsgStruct = MsgStruct,\n> = ComponentStruct<\n TMsgStruct,\n {\n props: {\n data: TData;\n render: () => React.ReactNode;\n };\n methods: {};\n children: {};\n msgScope: {};\n }\n>;\n\nexport function useDynamicContent<TData = any>(\n params: ComponentParams<DynamicContentStruct<TData>>,\n) {\n const component: Component<DynamicContentStruct<TData>> = {\n props: {\n render: undefined,\n data: undefined,\n },\n view: (_, m) => {\n return m.render();\n },\n };\n\n const model = useComponent(component, params);\n return model;\n}\n"],"names":["useDynamicContent","params","useComponent","_","m"],"mappings":";AAyBO,SAASA,EACZC,GACF;AAYE,SADcC,EAV4C;AAAA,IACtD,OAAO;AAAA,MACH,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,IAEV,MAAM,CAACC,GAAGC,MACCA,EAAE,OAAA;AAAA,EACb,GAGkCH,CAAM;AAEhD;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { PropsWithChildren } from 'react';
|
|
2
|
+
import { BaseComponentContext } from './contracts';
|
|
3
|
+
export declare const ReactComponentContext: any;
|
|
4
|
+
export declare function ComponentContextProvider(props: PropsWithChildren<{
|
|
5
|
+
value?: BaseComponentContext;
|
|
6
|
+
}>): any;
|
|
7
|
+
export declare function useComponentContext(): any;
|
|
8
|
+
//# sourceMappingURL=componentContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"componentContext.d.ts","sourceRoot":"","sources":["../../src/componentModel/componentContext.tsx"],"names":[],"mappings":"AAIA,OAAc,EAAiB,iBAAiB,EAAsB,MAAM,OAAO,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAsC,MAAM,aAAa,CAAC;AAEvF,eAAO,MAAM,qBAAqB,KAAqD,CAAC;AAGxF,wBAAgB,wBAAwB,CACpC,KAAK,EAAE,iBAAiB,CAAC;IACrB,KAAK,CAAC,EAAE,oBAAoB,CAAC;CAChC,CAAC,OAgKL;AAGD,wBAAgB,mBAAmB,QASlC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import P, { createContext as R, useContext as k, useRef as i } from "react";
|
|
2
|
+
const f = R(void 0);
|
|
3
|
+
function E(o) {
|
|
4
|
+
let h;
|
|
5
|
+
const c = i(/* @__PURE__ */ new Map()), u = i([]), g = () => u.current[u.current.length - 1], d = (e, t) => {
|
|
6
|
+
let n = c.current.get(e);
|
|
7
|
+
if (n ? n.parentId = t : (n = {
|
|
8
|
+
id: e,
|
|
9
|
+
parentId: t,
|
|
10
|
+
children: /* @__PURE__ */ new Set()
|
|
11
|
+
}, c.current.set(e, n)), t) {
|
|
12
|
+
let r = c.current.get(t);
|
|
13
|
+
r || (r = {
|
|
14
|
+
id: t,
|
|
15
|
+
children: /* @__PURE__ */ new Set()
|
|
16
|
+
}, c.current.set(t, r)), r.children.has(e) || r.children.add(e);
|
|
17
|
+
}
|
|
18
|
+
u.current.push(e);
|
|
19
|
+
}, a = (e) => {
|
|
20
|
+
const t = c.current.get(e);
|
|
21
|
+
if (!t)
|
|
22
|
+
return;
|
|
23
|
+
t.parentId && c.current.get(t.parentId)?.children.delete(e), t.children.forEach((r) => a(r)), c.current.delete(e);
|
|
24
|
+
const n = u.current.lastIndexOf(e);
|
|
25
|
+
n >= 0 && u.current.splice(n, 1);
|
|
26
|
+
}, s = (e) => c.current.get(e)?.parentId, p = (e) => Array.from(c.current.get(e)?.children ?? []), C = (e) => {
|
|
27
|
+
const t = [];
|
|
28
|
+
let n = e;
|
|
29
|
+
for (; ; ) {
|
|
30
|
+
const r = s(n);
|
|
31
|
+
if (!r)
|
|
32
|
+
break;
|
|
33
|
+
t.push(r), n = r;
|
|
34
|
+
}
|
|
35
|
+
return t;
|
|
36
|
+
}, x = (e) => {
|
|
37
|
+
const t = [], n = [e];
|
|
38
|
+
for (; n.length > 0; ) {
|
|
39
|
+
const r = n.pop(), v = p(r);
|
|
40
|
+
for (const l of v)
|
|
41
|
+
t.includes(l) || (t.push(l), n.push(l));
|
|
42
|
+
}
|
|
43
|
+
return t;
|
|
44
|
+
}, w = (e) => {
|
|
45
|
+
e || (e = g());
|
|
46
|
+
const t = [];
|
|
47
|
+
let n = e;
|
|
48
|
+
for (; n; )
|
|
49
|
+
t.push(n), n = s(n);
|
|
50
|
+
return t.reverse().join("/");
|
|
51
|
+
}, m = () => c.current;
|
|
52
|
+
return h = i({
|
|
53
|
+
...o.value,
|
|
54
|
+
register: d,
|
|
55
|
+
unregister: a,
|
|
56
|
+
getParent: s,
|
|
57
|
+
getChildren: p,
|
|
58
|
+
getChainUp: C,
|
|
59
|
+
getChainDown: x,
|
|
60
|
+
getHierarchyPath: w,
|
|
61
|
+
getNodeMap: m
|
|
62
|
+
}), /* @__PURE__ */ P.createElement(f.Provider, { value: h.current }, o.children);
|
|
63
|
+
}
|
|
64
|
+
function S() {
|
|
65
|
+
const o = k(f);
|
|
66
|
+
if (!o)
|
|
67
|
+
throw new Error(
|
|
68
|
+
"Can't resolve ComponentContext. Please wrap your component tree with <ComponentContextProvider>."
|
|
69
|
+
);
|
|
70
|
+
return o;
|
|
71
|
+
}
|
|
72
|
+
export {
|
|
73
|
+
E as ComponentContextProvider,
|
|
74
|
+
f as ReactComponentContext,
|
|
75
|
+
S as useComponentContext
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=componentContext.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"componentContext.es.js","sources":["../../src/componentModel/componentContext.tsx"],"sourcesContent":["//##############################################################################\r\n//# Copyright (c) Pavel Borodaev #\r\n//##############################################################################\r\n\r\nimport React, { createContext, PropsWithChildren, useContext, useRef } from 'react';\r\nimport { BaseComponentContext, ComponentRegistryContext, TreeNode } from './contracts';\r\n\r\nexport const ReactComponentContext = createContext<ComponentRegistryContext>(undefined);\r\n\r\n// ComponentRegistry(Context)Provider\r\nexport function ComponentContextProvider(\r\n props: PropsWithChildren<{\r\n value?: BaseComponentContext;\r\n }>,\r\n) {\r\n let context: React.RefObject<ComponentRegistryContext>;\r\n const treeRef = useRef(new Map<string, TreeNode>());\r\n // idStack\r\n const regStack = useRef([]);\r\n\r\n const getCurrentId = () => {\r\n return regStack.current[regStack.current.length - 1];\r\n };\r\n\r\n const register = (id: string, parentId?: string) => {\r\n let node = treeRef.current.get(id);\r\n\r\n if (!node) {\r\n node = {\r\n id,\r\n parentId,\r\n children: new Set(),\r\n };\r\n treeRef.current.set(id, node);\r\n } else {\r\n node.parentId = parentId;\r\n }\r\n\r\n if (parentId) {\r\n let parentNode = treeRef.current.get(parentId);\r\n if (!parentNode) {\r\n parentNode = {\r\n id: parentId,\r\n children: new Set(),\r\n };\r\n treeRef.current.set(parentId, parentNode);\r\n }\r\n if (!parentNode.children.has(id)) {\r\n parentNode.children.add(id);\r\n }\r\n }\r\n\r\n regStack.current.push(id);\r\n };\r\n\r\n const unregister = (id: string) => {\r\n const node = treeRef.current.get(id);\r\n if (!node) {\r\n return;\r\n }\r\n\r\n if (node.parentId) {\r\n const parent = treeRef.current.get(node.parentId);\r\n parent?.children.delete(id);\r\n }\r\n\r\n node.children.forEach((childId) => unregister(childId));\r\n treeRef.current.delete(id);\r\n\r\n const index = regStack.current.lastIndexOf(id);\r\n if (index >= 0) {\r\n regStack.current.splice(index, 1);\r\n }\r\n };\r\n\r\n const getParent = (id: string) => {\r\n return treeRef.current.get(id)?.parentId;\r\n };\r\n const getChildren = (id: string) => {\r\n return Array.from(treeRef.current.get(id)?.children ?? []) as string[];\r\n };\r\n\r\n const getChainUp = (id: string): string[] => {\r\n const result: string[] = [];\r\n let current = id;\r\n while (true) {\r\n const parent = getParent(current);\r\n if (!parent) {\r\n break;\r\n }\r\n result.push(parent);\r\n current = parent;\r\n }\r\n return result;\r\n };\r\n\r\n const getChainDown = (id: string): string[] => {\r\n const result: string[] = [];\r\n const stack: string[] = [id];\r\n while (stack.length > 0) {\r\n const current = stack.pop();\r\n const children = getChildren(current)!;\r\n for (const child of children) {\r\n if (!result.includes(child)) {\r\n result.push(child);\r\n stack.push(child);\r\n }\r\n }\r\n // result.push(...children);\r\n // stack.push(...children);\r\n }\r\n return result;\r\n };\r\n\r\n const getHierarchy = (rootId: string) => {\r\n const buildNode = (id: string): TreeNode => {\r\n const childrenIds = getChildren(id) || [];\r\n return {\r\n id,\r\n parentId: getParent(id),\r\n children: childrenIds.map(buildNode),\r\n } as TreeNode & { children: TreeNode[] };\r\n };\r\n return buildNode(rootId);\r\n };\r\n\r\n const getSiblings = (id: string) => {\r\n const parent = getParent(id);\r\n if (!parent) {\r\n return [];\r\n }\r\n const children = getChildren(parent);\r\n if (!children) {\r\n return [];\r\n }\r\n return children.filter((child) => child !== id);\r\n };\r\n\r\n const getHierarchyPath = (id: string): string => {\r\n if (!id) {\r\n id = getCurrentId();\r\n }\r\n const path: string[] = [];\r\n let current = id;\r\n\r\n while (current) {\r\n path.push(current);\r\n current = getParent(current);\r\n }\r\n\r\n return path.reverse().join('/');\r\n };\r\n\r\n // getNodes\r\n const getNodeMap = () => treeRef.current;\r\n\r\n context = useRef({\r\n ...props.value,\r\n register,\r\n unregister,\r\n getParent,\r\n getChildren,\r\n getChainUp,\r\n getChainDown,\r\n getHierarchyPath,\r\n getNodeMap,\r\n });\r\n\r\n return (\r\n <ReactComponentContext.Provider value={context.current}>\r\n {props.children}\r\n </ReactComponentContext.Provider>\r\n );\r\n}\r\n\r\n// useComponentRegistry(Context)\r\nexport function useComponentContext() {\r\n const context = useContext(ReactComponentContext);\r\n if (!context) {\r\n // useComponentContext must be used within a ComponentContextProvider\r\n throw new Error(\r\n \"Can't resolve ComponentContext. Please wrap your component tree with <ComponentContextProvider>.\",\r\n );\r\n }\r\n return context;\r\n}\r\n"],"names":["ReactComponentContext","createContext","ComponentContextProvider","props","context","treeRef","useRef","regStack","getCurrentId","register","id","parentId","node","parentNode","unregister","childId","index","getParent","getChildren","getChainUp","result","current","parent","getChainDown","stack","children","child","getHierarchyPath","path","getNodeMap","React","useComponentContext","useContext"],"mappings":"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"}
|