@actdim/dynstruct 1.1.8 → 1.2.2

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.
@@ -64,7 +64,7 @@ export type BaseAppMsgStruct<TNavRoutes extends NavRoutes = NavRoutes> = BaseApi
64
64
  text: string;
65
65
  title?: string;
66
66
  detail?: string;
67
- severity: Severity;
67
+ severity?: Severity;
68
68
  properties?: Record<string | number, any>;
69
69
  };
70
70
  out: void;
@@ -1 +1 @@
1
- {"version":3,"file":"appContracts.d.ts","sourceRoot":"","sources":["../../src/appDomain/appContracts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"appContracts.d.ts","sourceRoot":"","sources":["../../src/appDomain/appContracts.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"appContracts.es.js","sources":["../../src/appDomain/appContracts.ts"],"sourcesContent":["import { MsgStructBase, MsgStructFactory } from \"@actdim/msgmesh/contracts\";\r\nimport { BaseSecurityDomainConfig as BaseSecurityDomainConfig, BaseSecurityMsgStruct } from \"@/appDomain/security/securityContracts\";\r\nimport { ReactNode } from \"react\";\r\nimport { KeysOf } from \"@actdim/utico/typeCore\";\r\nimport { BaseContext } from \"@/componentModel/contracts\";\r\nimport { StoreItem } from \"@actdim/utico/store/storeContracts\";\r\n\r\nexport const $NAV_GOTO = \"APP.NAV.GOTO\";\r\nexport const $NAV_CONTEXT_GET = \"APP.NAV.CONTEXT.GET\";\r\nexport const $NAV_CONTEXT_CHANGED = \"APP.NAV.CONTEXT.CHANGED\";\r\nexport const $NAV_HISTORY_READ = \"APP.NAV.HISTORY.READ\";\r\n\r\nexport const $NOTICE = \"APP.NOTICE\";\r\nexport const $CONFIG_GET = \"APP.CONFIG.GET\";\r\n\r\nexport const $ERROR = \"APP.ERROR\";\r\nexport const $FETCH = \"APP.FETCH\";\r\n\r\nexport const $STORE_GET = \"APP.STORE.GET\";\r\nexport const $STORE_SET = \"APP.STORE.SET\";\r\nexport const $STORE_REMOVE = \"APP.STORE.REMOVE\";\r\n// TODO: HAS, CLEAR\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 = {\r\n // code?: string;\r\n type?: string;\r\n name?: string;\r\n source?: any;\r\n // module: string;\r\n // description\r\n detail?: string;\r\n timestamp?: string;\r\n // errors: AppError[];\r\n // traceId?: string; \r\n message: string;\r\n // reason?: string;\r\n // propertyBag/context\r\n properties?: Record<string | number, any>;\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\nexport type Importance =\r\n | \"critical\"\r\n | \"high\"\r\n | \"normal\"\r\n | \"low\"\r\n | undefined\r\n\r\n// Intent\r\nexport type Severity =\r\n // critical/high\r\n | 'emergency'\r\n | 'alert' // danger\r\n | 'error' // failure\r\n | 'warn' // caution\r\n // normal\r\n | 'notice' // notification\r\n | 'info' // default\r\n | 'success' // confirmation\r\n // low\r\n | 'hint' // note\r\n | 'debug' // trace\r\n | undefined;\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 detail?: string;\r\n severity: Severity;\r\n // propertyBag/context\r\n properties?: Record<string | number, 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_CONTEXT_GET]: {\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_HISTORY_READ]: {\r\n in: number;\r\n out: NavContext;\r\n };\r\n [$ERROR]: {\r\n in: AppError;\r\n out: boolean;\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 [$STORE_GET]: {\r\n in: {\r\n key: string;\r\n useEncryption?: boolean;\r\n };\r\n out: StoreItem;\r\n };\r\n [$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 [$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 defaultApi?: string;\r\n apis: Record<string, TApiConfig>;\r\n // HATEOAS? (React Admin)\r\n};\r\n\r\nexport type BaseAppMsgChannels<TChannel extends keyof BaseAppMsgStruct | Array<keyof BaseAppMsgStruct>> = KeysOf<BaseAppMsgStruct, TChannel>;\r\n\r\nexport type BaseAppContext<TMsgStruct extends BaseAppMsgStruct = BaseAppMsgStruct> = BaseContext<TMsgStruct> & {\r\n // securityProvider: SecurityProvider;\r\n};"],"names":["$NAV_GOTO","$NAV_CONTEXT_GET","$NAV_CONTEXT_CHANGED","$NAV_HISTORY_READ","$NOTICE","$CONFIG_GET","$ERROR","$FETCH","$STORE_GET","$STORE_SET","$STORE_REMOVE"],"mappings":"AAOO,MAAMA,IAAY,gBACZC,IAAmB,uBACnBC,IAAuB,2BACvBC,IAAoB,wBAEpBC,IAAU,cACVC,IAAc,kBAEdC,IAAS,aACTC,IAAS,aAETC,IAAa,iBACbC,IAAa,iBACbC,IAAgB;"}
1
+ {"version":3,"file":"appContracts.es.js","sources":["../../src/appDomain/appContracts.ts"],"sourcesContent":["import { MsgStructBase, MsgStructFactory } from \"@actdim/msgmesh/contracts\";\r\nimport { BaseSecurityDomainConfig as BaseSecurityDomainConfig, BaseSecurityMsgStruct } from \"@/appDomain/security/securityContracts\";\r\nimport { ReactNode } from \"react\";\r\nimport { KeysOf } from \"@actdim/utico/typeCore\";\r\nimport { BaseContext } from \"@/componentModel/contracts\";\r\nimport { StoreItem } from \"@actdim/utico/store/storeContracts\";\r\n\r\nexport const $NAV_GOTO = \"APP.NAV.GOTO\";\r\nexport const $NAV_CONTEXT_GET = \"APP.NAV.CONTEXT.GET\";\r\nexport const $NAV_CONTEXT_CHANGED = \"APP.NAV.CONTEXT.CHANGED\";\r\nexport const $NAV_HISTORY_READ = \"APP.NAV.HISTORY.READ\";\r\n\r\nexport const $NOTICE = \"APP.NOTICE\";\r\nexport const $CONFIG_GET = \"APP.CONFIG.GET\";\r\n\r\nexport const $ERROR = \"APP.ERROR\";\r\nexport const $FETCH = \"APP.FETCH\";\r\n\r\nexport const $STORE_GET = \"APP.STORE.GET\";\r\nexport const $STORE_SET = \"APP.STORE.SET\";\r\nexport const $STORE_REMOVE = \"APP.STORE.REMOVE\";\r\n// TODO: HAS, CLEAR\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 = {\r\n // code?: string;\r\n type?: string;\r\n name?: string;\r\n source?: any;\r\n // module: string;\r\n // description\r\n detail?: string;\r\n timestamp?: string;\r\n // errors: AppError[];\r\n // traceId?: string; \r\n message: string;\r\n // reason?: string;\r\n // propertyBag/context\r\n properties?: Record<string | number, any>;\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\nexport type Importance =\r\n | \"critical\"\r\n | \"high\"\r\n | \"normal\"\r\n | \"low\"\r\n | undefined\r\n\r\n// Intent\r\nexport type Severity =\r\n // critical/high\r\n | 'emergency'\r\n | 'alert' // danger\r\n | 'error' // failure\r\n | 'warn' // caution\r\n // normal\r\n | 'notice' // notification\r\n | 'info' // default\r\n | 'success' // confirmation\r\n // low\r\n | 'hint' // note\r\n | 'debug' // trace\r\n | undefined;\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 detail?: string;\r\n severity?: Severity;\r\n // propertyBag/context\r\n properties?: Record<string | number, 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_CONTEXT_GET]: {\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_HISTORY_READ]: {\r\n in: number;\r\n out: NavContext;\r\n };\r\n [$ERROR]: {\r\n in: AppError;\r\n out: boolean;\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 [$STORE_GET]: {\r\n in: {\r\n key: string;\r\n useEncryption?: boolean;\r\n };\r\n out: StoreItem;\r\n };\r\n [$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 [$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 defaultApi?: string;\r\n apis: Record<string, TApiConfig>;\r\n // HATEOAS? (React Admin)\r\n};\r\n\r\nexport type BaseAppMsgChannels<TChannel extends keyof BaseAppMsgStruct | Array<keyof BaseAppMsgStruct>> = KeysOf<BaseAppMsgStruct, TChannel>;\r\n\r\nexport type BaseAppContext<TMsgStruct extends BaseAppMsgStruct = BaseAppMsgStruct> = BaseContext<TMsgStruct> & {\r\n // securityProvider: SecurityProvider;\r\n};"],"names":["$NAV_GOTO","$NAV_CONTEXT_GET","$NAV_CONTEXT_CHANGED","$NAV_HISTORY_READ","$NOTICE","$CONFIG_GET","$ERROR","$FETCH","$STORE_GET","$STORE_SET","$STORE_REMOVE"],"mappings":"AAOO,MAAMA,IAAY,gBACZC,IAAmB,uBACnBC,IAAuB,2BACvBC,IAAoB,wBAEpBC,IAAU,cACVC,IAAc,kBAEdC,IAAS,aACTC,IAAS,aAETC,IAAa,iBACbC,IAAa,iBACbC,IAAgB;"}
@@ -1,6 +1,6 @@
1
1
  import { NavRoute, NavRouteParams } from './appContracts';
2
2
  import { ReactNode } from 'react';
3
- export declare function createNavigationRoute<TParams extends NavRouteParams = NavRouteParams>(config: {
3
+ export declare function createNavigationRoute<TParams extends NavRouteParams = NavRouteParams>(options: {
4
4
  pattern: string;
5
5
  element: ReactNode;
6
6
  defaultParams?: TParams;
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/appDomain/navigation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,wBAAgB,qBAAqB,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE;IAC3F,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,SAAS,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B,GAmBQ,QAAQ,CAAC,OAAO,CAAC,CACzB"}
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/appDomain/navigation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,wBAAgB,qBAAqB,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,OAAO,EAAE;IAC5F,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,SAAS,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B,GAmBQ,QAAQ,CAAC,OAAO,CAAC,CACzB"}
@@ -1,6 +1,6 @@
1
- import { compile as m, match as u } from "path-to-regexp";
2
- function l(t) {
3
- const a = m(t.pattern), n = u(t.pattern);
1
+ import { compile as m, match as c } from "path-to-regexp";
2
+ function f(t) {
3
+ const a = m(t.pattern), n = c(t.pattern);
4
4
  return {
5
5
  path: (e) => e ? a(e) : t.pattern,
6
6
  match: (e) => {
@@ -13,6 +13,6 @@ function l(t) {
13
13
  };
14
14
  }
15
15
  export {
16
- l as createNavigationRoute
16
+ f as createNavigationRoute
17
17
  };
18
18
  //# sourceMappingURL=navigation.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.es.js","sources":["../../src/appDomain/navigation.ts"],"sourcesContent":["import { compile, match } from \"path-to-regexp\";\r\nimport { NavRoute, NavRouteParams } from \"./appContracts\";\r\nimport { ReactNode } from \"react\";\r\n// createAppRoute\r\nexport function createNavigationRoute<TParams extends NavRouteParams = NavRouteParams>(config: {\r\n pattern: string;\r\n element: ReactNode;\r\n defaultParams?: TParams;\r\n}) {\r\n const toPath = compile(config.pattern);\r\n const matcher = match(config.pattern);\r\n return {\r\n path: (params?: object) => {\r\n if (!params) {\r\n return config.pattern;\r\n }\r\n return toPath(params);\r\n },\r\n match: (path: string) => {\r\n const matchResult = matcher(path);\r\n if (matchResult === false) {\r\n return undefined;\r\n }\r\n return matchResult.params;\r\n },\r\n element: config.element,\r\n defaultParams: config.defaultParams\r\n } as NavRoute<TParams>;\r\n}\r\n"],"names":["createNavigationRoute","config","toPath","compile","matcher","match","params","path","matchResult"],"mappings":";AAIO,SAASA,EAAuEC,GAIpF;AACC,QAAMC,IAASC,EAAQF,EAAO,OAAO,GAC/BG,IAAUC,EAAMJ,EAAO,OAAO;AACpC,SAAO;AAAA,IACH,MAAM,CAACK,MACEA,IAGEJ,EAAOI,CAAM,IAFTL,EAAO;AAAA,IAItB,OAAO,CAACM,MAAiB;AACrB,YAAMC,IAAcJ,EAAQG,CAAI;AAChC,UAAIC,MAAgB;AAGpB,eAAOA,EAAY;AAAA,IACvB;AAAA,IACA,SAASP,EAAO;AAAA,IAChB,eAAeA,EAAO;AAAA,EAAA;AAE9B;"}
1
+ {"version":3,"file":"navigation.es.js","sources":["../../src/appDomain/navigation.ts"],"sourcesContent":["import { compile, match } from \"path-to-regexp\";\r\nimport { NavRoute, NavRouteParams } from \"./appContracts\";\r\nimport { ReactNode } from \"react\";\r\n// createAppRoute\r\nexport function createNavigationRoute<TParams extends NavRouteParams = NavRouteParams>(options: {\r\n pattern: string;\r\n element: ReactNode;\r\n defaultParams?: TParams;\r\n}) {\r\n const toPath = compile(options.pattern);\r\n const matcher = match(options.pattern);\r\n return {\r\n path: (params?: object) => {\r\n if (!params) {\r\n return options.pattern;\r\n }\r\n return toPath(params);\r\n },\r\n match: (path: string) => {\r\n const matchResult = matcher(path);\r\n if (matchResult === false) {\r\n return undefined;\r\n }\r\n return matchResult.params;\r\n },\r\n element: options.element,\r\n defaultParams: options.defaultParams\r\n } as NavRoute<TParams>;\r\n}\r\n"],"names":["createNavigationRoute","options","toPath","compile","matcher","match","params","path","matchResult"],"mappings":";AAIO,SAASA,EAAuEC,GAIpF;AACC,QAAMC,IAASC,EAAQF,EAAQ,OAAO,GAChCG,IAAUC,EAAMJ,EAAQ,OAAO;AACrC,SAAO;AAAA,IACH,MAAM,CAACK,MACEA,IAGEJ,EAAOI,CAAM,IAFTL,EAAQ;AAAA,IAIvB,OAAO,CAACM,MAAiB;AACrB,YAAMC,IAAcJ,EAAQG,CAAI;AAChC,UAAIC,MAAgB;AAGpB,eAAOA,EAAY;AAAA,IACvB;AAAA,IACA,SAASP,EAAQ;AAAA,IACjB,eAAeA,EAAQ;AAAA,EAAA;AAE/B;"}
@@ -10,7 +10,7 @@ export declare enum AccessLevel {
10
10
  Full = 31
11
11
  }
12
12
  export type UserCredentials = {
13
- username: string;
13
+ userName: string;
14
14
  password: string;
15
15
  };
16
16
  export type IAccessDescriptor = {
@@ -72,10 +72,10 @@ export type BaseSecurityMsgStruct = RequireExtends<{
72
72
  export type ISecurable = {
73
73
  id: string;
74
74
  };
75
- export type SecurityContext<TUserInfo = any> = {
75
+ export type SecurityContext = {
76
76
  accessToken: string;
77
77
  refreshToken: string;
78
- userInfo: TUserInfo;
78
+ authInfo?: any;
79
79
  authProvider: string;
80
80
  domain: string;
81
81
  tokenExpiresAt: string;
@@ -1 +1 @@
1
- {"version":3,"file":"securityContracts.d.ts","sourceRoot":"","sources":["../../../src/appDomain/security/securityContracts.ts"],"names":[],"mappings":"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"}
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, MsgStruct, MsgStructBase } from \"@actdim/msgmesh/contracts\";\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 $AUTH_SIGNIN = \"APP.SECURITY.AUTH.SIGNIN\" as const;\r\nexport const $AUTH_SIGNIN_REQUEST = \"APP.SECURITY.AUTH.SIGNIN.REQUEST\" as const;\r\nexport const $AUTH_SIGNOUT = \"APP.SECURITY.AUTH.SIGNOUT\" as const;\r\nexport const $AUTH_SIGNOUT_REQUEST = \"APP.SECURITY.AUTH.SIGNOUT.REQUEST\" as const;\r\nexport const $AUTH_REFRESH = \"APP.SECURITY.AUTH.REFRESH\" as const;\r\n// require\r\nexport const $AUTH_ENSURE = \"APP.SECURITY.AUTH.ENSURE\" as const;\r\nexport const $ACL_GET = \"APP.SECURITY.ACL.GET\" as const;\r\nexport const $CONTEXT_GET = \"APP.SECURITY.CONTEXT.GET\" as const;\r\nexport const $CONFIG_GET = \"APP.SECURITY.CONFIG.GET\" as const;\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 [$AUTH_SIGNIN]: {\r\n in: UserCredentials;\r\n out: SecurityContext;\r\n };\r\n [$AUTH_SIGNIN_REQUEST]: {\r\n in: {\r\n callbackUrl: string;\r\n };\r\n // out: void;\r\n };\r\n [$AUTH_SIGNOUT]: {\r\n in: void;\r\n out: void;\r\n };\r\n [$AUTH_SIGNOUT_REQUEST]: {\r\n in: {\r\n callbackUrl: string;\r\n };\r\n // out: void;\r\n };\r\n [$AUTH_REFRESH]: {\r\n in: Skip<SecurityTokens, \"accessToken\">;\r\n out: SecurityContext;\r\n };\r\n [$AUTH_ENSURE]: {\r\n in: void;\r\n out: void;\r\n };\r\n [$ACL_GET]: {\r\n in: ISecurable;\r\n out: IAccessDescriptor;\r\n };\r\n [$CONTEXT_GET]: {\r\n in: void;\r\n out: SecurityContext;\r\n };\r\n [$CONFIG_GET]: {\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","$AUTH_SIGNIN","$AUTH_SIGNIN_REQUEST","$AUTH_SIGNOUT","$AUTH_SIGNOUT_REQUEST","$AUTH_REFRESH","$AUTH_ENSURE","$ACL_GET","$CONTEXT_GET","$CONFIG_GET"],"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,IAAe,4BACfC,IAAuB,oCACvBC,IAAgB,6BAChBC,IAAwB,qCACxBC,IAAgB,6BAEhBC,IAAe,4BACfC,IAAW,wBACXC,IAAe,4BACfC,IAAc;"}
1
+ {"version":3,"file":"securityContracts.es.js","sources":["../../../src/appDomain/security/securityContracts.ts"],"sourcesContent":["import { MsgBus, MsgStruct, MsgStructBase } from \"@actdim/msgmesh/contracts\";\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\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 $AUTH_SIGNIN = \"APP.SECURITY.AUTH.SIGNIN\" as const;\r\nexport const $AUTH_SIGNIN_REQUEST = \"APP.SECURITY.AUTH.SIGNIN.REQUEST\" as const;\r\nexport const $AUTH_SIGNOUT = \"APP.SECURITY.AUTH.SIGNOUT\" as const;\r\nexport const $AUTH_SIGNOUT_REQUEST = \"APP.SECURITY.AUTH.SIGNOUT.REQUEST\" as const;\r\nexport const $AUTH_REFRESH = \"APP.SECURITY.AUTH.REFRESH\" as const;\r\n// require\r\nexport const $AUTH_ENSURE = \"APP.SECURITY.AUTH.ENSURE\" as const;\r\nexport const $ACL_GET = \"APP.SECURITY.ACL.GET\" as const;\r\nexport const $CONTEXT_GET = \"APP.SECURITY.CONTEXT.GET\" as const;\r\nexport const $CONFIG_GET = \"APP.SECURITY.CONFIG.GET\" as const;\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 [$AUTH_SIGNIN]: {\r\n in: UserCredentials;\r\n out: SecurityContext;\r\n };\r\n [$AUTH_SIGNIN_REQUEST]: {\r\n in: {\r\n callbackUrl: string;\r\n };\r\n // out: void;\r\n };\r\n [$AUTH_SIGNOUT]: {\r\n in: void;\r\n out: void;\r\n };\r\n [$AUTH_SIGNOUT_REQUEST]: {\r\n in: {\r\n callbackUrl: string;\r\n };\r\n // out: void;\r\n };\r\n [$AUTH_REFRESH]: {\r\n in: Skip<SecurityTokens, \"accessToken\">;\r\n out: SecurityContext;\r\n };\r\n [$AUTH_ENSURE]: {\r\n in: void;\r\n out: void;\r\n };\r\n [$ACL_GET]: {\r\n in: ISecurable;\r\n out: IAccessDescriptor;\r\n };\r\n [$CONTEXT_GET]: {\r\n in: void;\r\n out: SecurityContext;\r\n };\r\n [$CONFIG_GET]: {\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 = {\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 // signInInfo\r\n authInfo?: any;\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","$AUTH_SIGNIN","$AUTH_SIGNIN_REQUEST","$AUTH_SIGNOUT","$AUTH_SIGNOUT_REQUEST","$AUTH_REFRESH","$AUTH_ENSURE","$ACL_GET","$CONTEXT_GET","$CONFIG_GET"],"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;AAoBL,MAAMC,IAAe,4BACfC,IAAuB,oCACvBC,IAAgB,6BAChBC,IAAwB,qCACxBC,IAAgB,6BAEhBC,IAAe,4BACfC,IAAW,wBACXC,IAAe,4BACfC,IAAc;"}
@@ -1,14 +1,14 @@
1
1
  import { AccessLevel, IAccessDescriptor, ISecurable, UserCredentials, SecurityContext } from './securityContracts';
2
2
  import { MsgBus } from '@actdim/msgmesh/contracts';
3
3
  import { BaseAppMsgStruct } from '../appContracts';
4
- export declare class SecurityProvider<TUserInfo = any> {
4
+ export declare class SecurityProvider {
5
5
  private msgBus;
6
6
  private domainConfig;
7
7
  private storageKeys;
8
8
  private accessToken;
9
9
  private refreshToken;
10
10
  private userCredentials;
11
- private userInfo;
11
+ private authInfo;
12
12
  private authProvider;
13
13
  private tokenExpiresAt;
14
14
  private acl;
@@ -1 +1 @@
1
- {"version":3,"file":"securityProvider.d.ts","sourceRoot":"","sources":["../../../src/appDomain/security/securityProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,WAAW,EACX,iBAAiB,EACjB,UAAU,EAEV,eAAe,EAEf,eAAe,EASlB,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAsD,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAiChH,qBAAa,gBAAgB,CAAC,SAAS,GAAG,GAAG;IAKzC,OAAO,CAAC,MAAM,CAA2B;IAEzC,OAAO,CAAC,YAAY,CAA2B;IAE/C,OAAO,CAAC,WAAW,CAAqB;IAExC,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,eAAe,CAAkB;IAEzC,OAAO,CAAC,QAAQ,CAAY;IAG5B,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,cAAc,CAAS;IAG/B,OAAO,CAAC,GAAG,CAAM;IAEjB,OAAO,CAAC,OAAO,CAA8E;IAE7F,OAAO,CAAC,IAAI,CAAe;gBAEf,MAAM,EAAE,MAAM,CAAC,gBAAgB,CAAC;IA8DrC,UAAU,IAAI,eAAe;YAWtB,YAAY;IAUpB,WAAW;IA+CjB,IAAW,MAAM,IAAI,MAAM,CAE1B;IAaK,cAAc;IA+Bd,UAAU;IA0BV,MAAM,CAAC,WAAW,EAAE,eAAe;IA0CnC,QAAQ;IA+BR,OAAO;IAgCP,WAAW;IA6CX,MAAM,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,CAAC;IASnC,YAAY,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,WAAW,cAAmB;CAOlF"}
1
+ {"version":3,"file":"securityProvider.d.ts","sourceRoot":"","sources":["../../../src/appDomain/security/securityProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,WAAW,EACX,iBAAiB,EACjB,UAAU,EAEV,eAAe,EAEf,eAAe,EASlB,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAsD,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAkChH,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,MAAM,CAA2B;IAEzC,OAAO,CAAC,YAAY,CAA2B;IAE/C,OAAO,CAAC,WAAW,CAAqB;IAExC,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,eAAe,CAAkB;IAEzC,OAAO,CAAC,QAAQ,CAAM;IAGtB,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,cAAc,CAAS;IAG/B,OAAO,CAAC,GAAG,CAAM;IAEjB,OAAO,CAAC,OAAO,CAA8E;IAE7F,OAAO,CAAC,IAAI,CAAe;gBAEf,MAAM,EAAE,MAAM,CAAC,gBAAgB,CAAC;IA8DrC,UAAU,IAAI,eAAe;YAWtB,YAAY;IAUpB,WAAW;IAuDjB,IAAW,MAAM,IAAI,MAAM,CAE1B;IAaK,cAAc;IAsCd,UAAU;IA0BV,MAAM,CAAC,WAAW,EAAE,eAAe;IA6CnC,QAAQ;IAsCR,OAAO;IAgCP,WAAW;IA6CX,MAAM,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,CAAC;IASnC,YAAY,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,WAAW,cAAmB;CAOlF"}
@@ -1,17 +1,18 @@
1
- import { $CONTEXT_GET as m, $ACL_GET as T, $AUTH_SIGNIN as c, $AUTH_SIGNOUT as d, $AUTH_REFRESH as k, $AUTH_ENSURE as f, $CONFIG_GET as C, $AUTH_SIGNIN_REQUEST as E, AccessLevel as y } from "./securityContracts.es.js";
2
- import { getValuePrefixer as w } from "@actdim/utico/typeCore";
1
+ import { $CONTEXT_GET as m, $ACL_GET as f, $AUTH_SIGNIN as l, $AUTH_SIGNOUT as d, $AUTH_REFRESH as T, $AUTH_ENSURE as k, $CONFIG_GET as C, $AUTH_SIGNIN_REQUEST as w, AccessLevel as y } from "./securityContracts.es.js";
2
+ import { getValuePrefixer as E } from "@actdim/utico/typeCore";
3
3
  import "jwt-decode";
4
- import { getResponseResult as l } from "../../net/request.es.js";
4
+ import { getResponseResult as c } from "../../net/request.es.js";
5
5
  import { ApiError as u } from "../../net/apiError.es.js";
6
- import { $CONFIG_GET as p, $STORE_GET as i, $STORE_REMOVE as o, $STORE_SET as h } from "../appContracts.es.js";
6
+ import { $CONFIG_GET as p, $STORE_GET as r, $STORE_REMOVE as o, $STORE_SET as h } from "../appContracts.es.js";
7
7
  const v = {
8
8
  accessToken: "ACCESS_TOKEN",
9
9
  refreshToken: "REFRESH_TOKEN",
10
10
  acl: "ACL",
11
11
  userCredentials: "USER_CREDENTIALS",
12
- userInfo: "USER_INFO"
12
+ // signInInfo
13
+ authInfo: "AUTH_INFO"
13
14
  };
14
- class $ {
15
+ class _ {
15
16
  // private isAuthenticated: boolean;
16
17
  // private isExpired: boolean;
17
18
  msgBus;
@@ -20,7 +21,7 @@ class $ {
20
21
  accessToken;
21
22
  refreshToken;
22
23
  userCredentials;
23
- userInfo;
24
+ authInfo;
24
25
  // private authority: string;
25
26
  authProvider;
26
27
  tokenExpiresAt;
@@ -33,19 +34,19 @@ class $ {
33
34
  channel: m,
34
35
  callback: (e) => this.getContext()
35
36
  }), this.msgBus.provide({
36
- channel: T,
37
+ channel: f,
37
38
  callback: (e) => this.getAcl(e.payload)
38
39
  }), this.msgBus.provide({
39
- channel: c,
40
+ channel: l,
40
41
  callback: (e) => this.signIn(e.payload)
41
42
  }), this.msgBus.provide({
42
43
  channel: d,
43
44
  callback: (e) => this.signOut()
44
45
  }), this.msgBus.provide({
45
- channel: k,
46
+ channel: T,
46
47
  callback: (e) => this.refreshAuth()
47
48
  }), this.msgBus.provide({
48
- channel: f,
49
+ channel: k,
49
50
  callback: (e) => this.ensureAuth()
50
51
  }), this.msgBus.provide({
51
52
  channel: C,
@@ -58,7 +59,7 @@ class $ {
58
59
  return {
59
60
  accessToken: this.accessToken,
60
61
  refreshToken: this.refreshToken,
61
- userInfo: this.userInfo,
62
+ authInfo: this.authInfo,
62
63
  authProvider: this.authProvider,
63
64
  domain: this.domain,
64
65
  tokenExpiresAt: this.tokenExpiresAt
@@ -69,35 +70,40 @@ class $ {
69
70
  channel: p
70
71
  });
71
72
  this.domainConfig = s.payload.security;
72
- const e = w(`${this.domainConfig.id}/`);
73
+ const e = E(`${this.domainConfig.id}/`);
73
74
  this.storageKeys = e(v), await this.restoreData();
74
75
  }
75
76
  async restoreData() {
76
77
  this.accessToken = (await this.msgBus.request({
77
- channel: i,
78
+ channel: r,
78
79
  payload: {
79
80
  key: this.storageKeys.accessToken
80
81
  }
81
82
  })).payload.data.value, this.refreshToken = (await this.msgBus.request({
82
- channel: i,
83
+ channel: r,
83
84
  payload: {
84
85
  key: this.storageKeys.refreshToken
85
86
  }
86
87
  })).payload.data.value, this.userCredentials = (await this.msgBus.request({
87
- channel: i,
88
+ channel: r,
88
89
  payload: {
89
90
  key: this.storageKeys.userCredentials
90
91
  }
91
92
  })).payload.data.value || {
92
- username: null,
93
+ userName: null,
93
94
  password: null
94
- }, this.acl = (await this.msgBus.request({
95
- channel: i,
95
+ }, this.authInfo = (await this.msgBus.request({
96
+ channel: r,
97
+ payload: {
98
+ key: this.storageKeys.authInfo
99
+ }
100
+ })).payload.data.value, this.acl = (await this.msgBus.request({
101
+ channel: r,
96
102
  payload: {
97
103
  key: this.storageKeys.acl
98
104
  }
99
105
  })).payload.data.value || null, this.accessToken && this.msgBus.request({
100
- channel: c,
106
+ channel: l,
101
107
  group: "out",
102
108
  payload: this.getContext()
103
109
  });
@@ -131,6 +137,11 @@ class $ {
131
137
  payload: {
132
138
  key: this.storageKeys.userCredentials
133
139
  }
140
+ }), this.authInfo = null, await this.msgBus.request({
141
+ channel: o,
142
+ payload: {
143
+ key: this.storageKeys.authInfo
144
+ }
134
145
  }), this.acl = null, await this.msgBus.request({
135
146
  channel: o,
136
147
  payload: {
@@ -141,7 +152,7 @@ class $ {
141
152
  async ensureAuth() {
142
153
  this.accessToken = null, this.acl = null;
143
154
  const s = this.msgBus.once({
144
- channel: c,
155
+ channel: l,
145
156
  group: "out"
146
157
  }), e = async () => {
147
158
  throw await this.msgBus.once({
@@ -150,7 +161,7 @@ class $ {
150
161
  }), new Error("Auth failed: login aborted");
151
162
  };
152
163
  this.msgBus.send({
153
- channel: E,
164
+ channel: w,
154
165
  payload: {
155
166
  callbackUrl: window.location.pathname + window.location.search
156
167
  }
@@ -167,12 +178,12 @@ class $ {
167
178
  "Content-Type": "application/json",
168
179
  Accept: "text/plain"
169
180
  }
170
- }, r = {
181
+ }, i = {
171
182
  ...t,
172
183
  status: "executing"
173
184
  }, a = await this.fetcher.fetch(e, t);
174
- await l(a, r), u.assert(a, r);
175
- let g = a.resolved.json;
185
+ await c(a, i), u.assert(a, i), this.authInfo = a.resolved.json;
186
+ const g = this.authInfo;
176
187
  return this.userCredentials = s, this.accessToken = g.accessToken, this.refreshToken = g.refreshToken, this.saveData(), this.getContext();
177
188
  }
178
189
  async saveData() {
@@ -194,6 +205,12 @@ class $ {
194
205
  key: this.storageKeys.userCredentials,
195
206
  value: this.userCredentials ? this.userCredentials : null
196
207
  }
208
+ }), await this.msgBus.request({
209
+ channel: h,
210
+ payload: {
211
+ key: this.storageKeys.authInfo,
212
+ value: this.authInfo ? this.authInfo : null
213
+ }
197
214
  }), await this.msgBus.request({
198
215
  channel: h,
199
216
  payload: {
@@ -216,7 +233,7 @@ class $ {
216
233
  ...e,
217
234
  status: "executing"
218
235
  }, t = await this.fetcher.fetch(s, e);
219
- await l(t, n), u.assert(t, n), this.clearSavedData();
236
+ await c(t, n), u.assert(t, n), this.clearSavedData();
220
237
  }
221
238
  async refreshAuth() {
222
239
  let s = this.domainConfig.routes?.authRefresh;
@@ -233,11 +250,11 @@ class $ {
233
250
  "Content-Type": "application/json",
234
251
  Accept: "text/plain"
235
252
  }
236
- }, r = {
253
+ }, i = {
237
254
  ...t,
238
255
  status: "executing"
239
256
  }, a = await this.fetcher.fetch(s, t);
240
- return await l(a, r), u.assert(a, r), e = a.resolved.json, this.accessToken = e.accessToken, this.refreshToken = e.refreshToken, this.saveData(), this.getContext();
257
+ return await c(a, i), u.assert(a, i), e = a.resolved.json, this.accessToken = e.accessToken, this.refreshToken = e.refreshToken, this.saveData(), this.getContext();
241
258
  }
242
259
  async getAcl(s) {
243
260
  return {
@@ -250,6 +267,6 @@ class $ {
250
267
  }
251
268
  }
252
269
  export {
253
- $ as SecurityProvider
270
+ _ as SecurityProvider
254
271
  };
255
272
  //# sourceMappingURL=securityProvider.es.js.map
@@ -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 $AUTH_SIGNIN,\r\n $AUTH_SIGNOUT,\r\n $AUTH_SIGNIN_REQUEST,\r\n $CONTEXT_GET,\r\n $ACL_GET,\r\n $AUTH_REFRESH,\r\n $AUTH_ENSURE,\r\n $CONFIG_GET as $SECURITY_CONFIG_GET\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/contracts\";\r\nimport { $CONFIG_GET, $STORE_GET, $STORE_REMOVE, $STORE_SET, 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.updateConfig();\r\n\r\n // TODO: support custom requests\r\n\r\n this.msgBus.provide({\r\n channel: $CONTEXT_GET,\r\n callback: (msg) => {\r\n return this.getContext();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $ACL_GET,\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: $AUTH_SIGNIN,\r\n callback: (msg) => {\r\n return this.signIn(msg.payload);\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $AUTH_SIGNOUT,\r\n callback: (msg) => {\r\n return this.signOut();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $AUTH_REFRESH,\r\n callback: (msg) => {\r\n return this.refreshAuth();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $AUTH_ENSURE,\r\n callback: (msg) => {\r\n return this.ensureAuth();\r\n }\r\n });\r\n\r\n // HELPER\r\n this.msgBus.provide({\r\n channel: $SECURITY_CONFIG_GET,\r\n callback: async (msg) => {\r\n return (\r\n await this.msgBus.request({\r\n channel: $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 updateConfig() {\r\n const msg = await this.msgBus.request({\r\n channel: $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.restoreData();\r\n }\r\n\r\n async restoreData() {\r\n this.accessToken = (\r\n await this.msgBus.request({\r\n channel: $STORE_GET,\r\n payload: {\r\n key: this.storageKeys.accessToken\r\n }\r\n })\r\n ).payload.data.value;\r\n this.refreshToken = (\r\n await this.msgBus.request({\r\n channel: $STORE_GET,\r\n payload: {\r\n key: this.storageKeys.refreshToken\r\n }\r\n })\r\n ).payload.data.value;\r\n this.userCredentials = (\r\n await this.msgBus.request({\r\n channel: $STORE_GET,\r\n payload: {\r\n key: this.storageKeys.userCredentials\r\n }\r\n })\r\n ).payload.data.value || {\r\n username: null,\r\n password: null\r\n };\r\n\r\n this.acl = (\r\n await this.msgBus.request({\r\n channel: $STORE_GET,\r\n payload: {\r\n key: this.storageKeys.acl\r\n }\r\n })\r\n ).payload.data.value || null;\r\n\r\n if (this.accessToken) {\r\n this.msgBus.request({\r\n channel: $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 clearSavedData() {\r\n this.accessToken = null;\r\n await this.msgBus.request({\r\n channel: $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.request({\r\n channel: $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.request({\r\n channel: $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.request({\r\n channel: $STORE_REMOVE,\r\n payload: {\r\n key: this.storageKeys.acl\r\n }\r\n });\r\n }\r\n\r\n async ensureAuth() {\r\n this.accessToken = null;\r\n this.acl = null;\r\n\r\n const signIn = this.msgBus.once({\r\n channel: $AUTH_SIGNIN,\r\n group: \"out\"\r\n });\r\n\r\n const signOut = async () => {\r\n await this.msgBus.once({\r\n channel: $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.send({\r\n channel: $AUTH_SIGNIN_REQUEST,\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 signIn(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.saveData();\r\n\r\n return this.getContext();\r\n }\r\n\r\n async saveData() {\r\n await this.msgBus.request({\r\n channel: $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.request({\r\n channel: $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.request({\r\n channel: $STORE_SET,\r\n payload: {\r\n key: this.storageKeys.userCredentials,\r\n value: this.userCredentials ? this.userCredentials : null\r\n }\r\n });\r\n await this.msgBus.request({\r\n channel: $STORE_SET,\r\n payload: {\r\n key: this.storageKeys.acl,\r\n value: this.acl ? this.acl : null\r\n }\r\n });\r\n }\r\n\r\n async signOut() {\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.saveData();\r\n this.clearSavedData();\r\n }\r\n\r\n async refreshAuth() {\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 // const content = 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.saveData();\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","$CONTEXT_GET","msg","$ACL_GET","$AUTH_SIGNIN","$AUTH_SIGNOUT","$AUTH_REFRESH","$AUTH_ENSURE","$SECURITY_CONFIG_GET","$CONFIG_GET","prefixer","getValuePrefixer","$STORE_GET","$STORE_REMOVE","signIn","signOut","$AUTH_SIGNIN_REQUEST","credentials","url","content","requestParams","request","response","getResponseResult","ApiError","tokens","$STORE_SET","obj","AccessLevel","accessLevel"],"mappings":"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"}
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 $AUTH_SIGNIN,\r\n $AUTH_SIGNOUT,\r\n $AUTH_SIGNIN_REQUEST,\r\n $CONTEXT_GET,\r\n $ACL_GET,\r\n $AUTH_REFRESH,\r\n $AUTH_ENSURE,\r\n $CONFIG_GET as $SECURITY_CONFIG_GET\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/contracts\";\r\nimport { $CONFIG_GET, $STORE_GET, $STORE_REMOVE, $STORE_SET, 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 // signInInfo\r\n authInfo: \"AUTH_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 {\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 authInfo: any;\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.updateConfig();\r\n\r\n // TODO: support custom requests\r\n\r\n this.msgBus.provide({\r\n channel: $CONTEXT_GET,\r\n callback: (msg) => {\r\n return this.getContext();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $ACL_GET,\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: $AUTH_SIGNIN,\r\n callback: (msg) => {\r\n return this.signIn(msg.payload);\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $AUTH_SIGNOUT,\r\n callback: (msg) => {\r\n return this.signOut();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $AUTH_REFRESH,\r\n callback: (msg) => {\r\n return this.refreshAuth();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $AUTH_ENSURE,\r\n callback: (msg) => {\r\n return this.ensureAuth();\r\n }\r\n });\r\n\r\n // HELPER\r\n this.msgBus.provide({\r\n channel: $SECURITY_CONFIG_GET,\r\n callback: async (msg) => {\r\n return (\r\n await this.msgBus.request({\r\n channel: $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 authInfo: this.authInfo,\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 updateConfig() {\r\n const msg = await this.msgBus.request({\r\n channel: $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.restoreData();\r\n }\r\n\r\n async restoreData() {\r\n this.accessToken = (\r\n await this.msgBus.request({\r\n channel: $STORE_GET,\r\n payload: {\r\n key: this.storageKeys.accessToken\r\n }\r\n })\r\n ).payload.data.value;\r\n this.refreshToken = (\r\n await this.msgBus.request({\r\n channel: $STORE_GET,\r\n payload: {\r\n key: this.storageKeys.refreshToken\r\n }\r\n })\r\n ).payload.data.value;\r\n this.userCredentials = (\r\n await this.msgBus.request({\r\n channel: $STORE_GET,\r\n payload: {\r\n key: this.storageKeys.userCredentials\r\n }\r\n })\r\n ).payload.data.value || {\r\n userName: null,\r\n password: null\r\n };\r\n this.authInfo = (\r\n await this.msgBus.request({\r\n channel: $STORE_GET,\r\n payload: {\r\n key: this.storageKeys.authInfo\r\n }\r\n })\r\n ).payload.data.value;\r\n\r\n this.acl = (\r\n await this.msgBus.request({\r\n channel: $STORE_GET,\r\n payload: {\r\n key: this.storageKeys.acl\r\n }\r\n })\r\n ).payload.data.value || null;\r\n\r\n if (this.accessToken) {\r\n this.msgBus.request({\r\n channel: $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 clearSavedData() {\r\n this.accessToken = null;\r\n await this.msgBus.request({\r\n channel: $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.request({\r\n channel: $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.request({\r\n channel: $STORE_REMOVE,\r\n payload: {\r\n key: this.storageKeys.userCredentials\r\n }\r\n });\r\n this.authInfo = null;\r\n await this.msgBus.request({\r\n channel: $STORE_REMOVE,\r\n payload: {\r\n key: this.storageKeys.authInfo\r\n }\r\n });\r\n this.acl = null;\r\n await this.msgBus.request({\r\n channel: $STORE_REMOVE,\r\n payload: {\r\n key: this.storageKeys.acl\r\n }\r\n });\r\n }\r\n\r\n async ensureAuth() {\r\n this.accessToken = null;\r\n this.acl = null;\r\n\r\n const signIn = this.msgBus.once({\r\n channel: $AUTH_SIGNIN,\r\n group: \"out\"\r\n });\r\n\r\n const signOut = async () => {\r\n await this.msgBus.once({\r\n channel: $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.send({\r\n channel: $AUTH_SIGNIN_REQUEST,\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 signIn(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 // TODO:\r\n // application/x-www-form-urlencoded?\r\n // ?userName=&password=\r\n // userName:password (BASIC)\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 this.authInfo = response.resolved.json;\r\n const tokens = this.authInfo 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.saveData();\r\n\r\n return this.getContext();\r\n }\r\n\r\n async saveData() {\r\n await this.msgBus.request({\r\n channel: $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.request({\r\n channel: $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.request({\r\n channel: $STORE_SET,\r\n payload: {\r\n key: this.storageKeys.userCredentials,\r\n value: this.userCredentials ? this.userCredentials : null\r\n }\r\n });\r\n await this.msgBus.request({\r\n channel: $STORE_SET,\r\n payload: {\r\n key: this.storageKeys.authInfo,\r\n value: this.authInfo ? this.authInfo : null\r\n }\r\n });\r\n await this.msgBus.request({\r\n channel: $STORE_SET,\r\n payload: {\r\n key: this.storageKeys.acl,\r\n value: this.acl ? this.acl : null\r\n }\r\n });\r\n }\r\n\r\n async signOut() {\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.saveData();\r\n this.clearSavedData();\r\n }\r\n\r\n async refreshAuth() {\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 // const content = 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.saveData();\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","$CONTEXT_GET","msg","$ACL_GET","$AUTH_SIGNIN","$AUTH_SIGNOUT","$AUTH_REFRESH","$AUTH_ENSURE","$SECURITY_CONFIG_GET","$CONFIG_GET","prefixer","getValuePrefixer","$STORE_GET","$STORE_REMOVE","signIn","signOut","$AUTH_SIGNIN_REQUEST","credentials","url","content","requestParams","request","response","getResponseResult","ApiError","tokens","$STORE_SET","obj","AccessLevel","accessLevel"],"mappings":"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"}
@@ -104,7 +104,7 @@ function N(e) {
104
104
  ...s,
105
105
  channel: t,
106
106
  group: r,
107
- config: {
107
+ options: {
108
108
  abortSignal: e.msgBroker.abortController.signal
109
109
  }
110
110
  });
@@ -1 +1 @@
1
- {"version":3,"file":"core.es.js","sources":["../../src/componentModel/core.tsx"],"sourcesContent":["import React from 'react';\r\nimport { MsgBus } from '@actdim/msgmesh/contracts';\r\nimport { isObservable, runInAction, toJS, autorun, IReactionDisposer } from 'mobx';\r\nimport type {\r\n Binding,\r\n Component,\r\n ComponentMsgHeaders,\r\n ComponentStruct,\r\n EffectController,\r\n EffectFn,\r\n MsgChannelGroupProviderParams,\r\n MsgChannelGroupSubscriberParams,\r\n PropEventHandlers,\r\n PropValueChangeHandler,\r\n PropValueChangingHandler,\r\n Validator,\r\n ValueConverter,\r\n} from './contracts';\r\nimport { $isBinding, ComponentMsgFilter } from './contracts';\r\nimport { isPlainObject } from 'mobx/dist/internal';\r\n\r\nconst blankView = () => null;\r\n\r\nexport function isBinding(obj: any): obj is Binding {\r\n return obj[$isBinding] === true;\r\n}\r\n\r\nexport function bind<T, TFrom = any>(\r\n get: () => T,\r\n set?: (value: T) => void,\r\n converter?: ValueConverter<T, TFrom>,\r\n validator?: Validator<T>,\r\n): Binding {\r\n return {\r\n get: get,\r\n set: set,\r\n converter: converter,\r\n validator: validator,\r\n readOnly: !!set,\r\n [$isBinding]: true,\r\n };\r\n}\r\n\r\nexport function bindProp<T extends object, P extends keyof T>(target: () => T, prop: P): Binding {\r\n return {\r\n get: () => target()[prop],\r\n set: (value: T[P]) => {\r\n target()[prop] = value;\r\n },\r\n [$isBinding]: true,\r\n };\r\n}\r\n\r\nconst proxyCache = new WeakMap<object, any>();\r\n\r\nexport type ProxyEventHandlers = {\r\n onPropChanging?: PropValueChangingHandler<PropertyKey>;\r\n onPropChange?: PropValueChangeHandler<PropertyKey>;\r\n} & Record<PropertyKey, PropEventHandlers>;\r\n\r\nexport function createRecursiveProxy(\r\n target: any,\r\n bindings: Map<PropertyKey, Binding>,\r\n handlers: ProxyEventHandlers,\r\n) {\r\n if (typeof target !== 'object' || target === null) {\r\n return target;\r\n }\r\n\r\n // isPlainObject\r\n if (!isObservable(target)) {\r\n return target;\r\n }\r\n\r\n if (proxyCache.has(target)) {\r\n return proxyCache.get(target);\r\n }\r\n\r\n const proxy = new Proxy(target, {\r\n get(obj, prop, receiver) {\r\n // 1. custom handlers\r\n const onGet = handlers[prop]?.onGet;\r\n if (onGet) return onGet();\r\n\r\n // 2. bindings\r\n const binding = bindings.get(prop);\r\n if (binding?.get) {\r\n return binding.get();\r\n }\r\n\r\n const value = Reflect.get(obj, prop, receiver);\r\n\r\n if (typeof value === 'object' && value !== null && isObservable(value)) {\r\n return createRecursiveProxy(value, bindings, handlers);\r\n }\r\n\r\n return value;\r\n },\r\n\r\n set(obj, prop, value, receiver) {\r\n const oldValue = obj[prop];\r\n\r\n // before-change hooks\r\n const onChanging = handlers[prop]?.onChanging;\r\n if (onChanging && onChanging(oldValue, value) === false) {\r\n return true;\r\n }\r\n\r\n if (\r\n handlers.onPropChanging &&\r\n handlers.onPropChanging(prop, oldValue, value) === false\r\n ) {\r\n return true;\r\n }\r\n\r\n const result = runInAction(() => {\r\n return Reflect.set(obj, prop, value, receiver);\r\n });\r\n\r\n // bindings\r\n const binding = bindings.get(prop);\r\n binding?.set?.(value);\r\n\r\n // after-change hooks\r\n handlers[prop]?.onChange?.(value);\r\n handlers.onPropChange?.(prop, value);\r\n\r\n return result;\r\n },\r\n });\r\n\r\n proxyCache.set(target, proxy);\r\n return proxy;\r\n}\r\n\r\nexport function toHtmlId(url: string): string {\r\n let parts = url\r\n .split('/')\r\n .filter(Boolean)\r\n .map((segment) => decodeURIComponent(segment));\r\n\r\n const raw = parts.join('-');\r\n // sanitize\r\n let id = raw\r\n .normalize('NFKD')\r\n .replace(/[^a-zA-Z0-9\\-_:.+#]/g, '-')\r\n .replace(/-+/g, '-')\r\n .replace(/^[^a-zA-Z]+/, '-')\r\n // .replace(/:/g, '-')\r\n // .replace(/\\./g, '_')\r\n // .replace(/#/g, '-')\r\n .replace(/[+#]$/, '-');\r\n return id;\r\n}\r\n\r\nexport function getComponentSourceByCaller(depth = 2): string | null {\r\n const err = new Error();\r\n const stack = err.stack?.split('\\n');\r\n if (!stack || stack.length <= depth) {\r\n return null;\r\n }\r\n const match = stack[depth].match(/\\(([^)]+)\\)/);\r\n const result = match?.[1];\r\n if (result) {\r\n if (\r\n document.querySelector('script[type=\"module\"][src*=\"/@vite/\"]') &&\r\n globalThis['CONFIG_TYPE'] === 'DEVELOPMENT'\r\n ) {\r\n return result.replace(/\\?[^:]+/, '');\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nexport function getComponentNameByCaller(depth = 2): string | null {\r\n const err = new Error();\r\n const stack = err.stack?.split('\\n');\r\n if (!stack || stack.length <= depth) {\r\n return null;\r\n }\r\n const line = stack[depth].trim();\r\n const match = line.match(/^at\\s+([^\\s(]+)/);\r\n if (!match) {\r\n return null;\r\n }\r\n const fnName = match[1];\r\n const hookMatch = fnName.match(/^use(.+)/);\r\n if (hookMatch) {\r\n return hookMatch[1];\r\n }\r\n return fnName;\r\n}\r\n\r\nexport function registerMsgBroker<TStruct extends ComponentStruct = ComponentStruct>(\r\n component: Component<TStruct>,\r\n) {\r\n const providers = component?.msgBroker.provide;\r\n if (providers) {\r\n for (const [channel, providerGroups] of Object.entries(providers)) {\r\n for (const [g, p] of Object.entries(providerGroups)) {\r\n const provider = p as MsgChannelGroupProviderParams;\r\n const callback = provider.callback;\r\n if (callback) {\r\n provider.callback = (msg, headers) => {\r\n return callback(msg, headers, component);\r\n };\r\n }\r\n const filter = provider.filter;\r\n const componentFilter = provider.componentFilter || ComponentMsgFilter.None;\r\n provider.filter = (msg) => {\r\n let result = true;\r\n if (componentFilter & ComponentMsgFilter.FromAncestors) {\r\n const ancestorIds = component.getChainUp();\r\n result = ancestorIds?.indexOf(msg.headers?.sourceId) >= 0;\r\n }\r\n if (result && componentFilter & ComponentMsgFilter.FromDescendants) {\r\n const descendantIds = component.getChainDown();\r\n result = descendantIds?.indexOf(msg.headers?.sourceId) >= 0;\r\n }\r\n if (result && filter) {\r\n result = filter(msg, component);\r\n }\r\n return result;\r\n };\r\n\r\n component.msgBus.provide({\r\n ...p,\r\n channel: channel,\r\n group: g,\r\n options: {\r\n abortSignal: component.msgBroker.abortController.signal,\r\n },\r\n });\r\n }\r\n }\r\n }\r\n const subscribers = component?.msgBroker?.subscribe;\r\n if (subscribers) {\r\n for (const [channel, subscriberGroups] of Object.entries(subscribers)) {\r\n for (const [g, s] of Object.entries(subscriberGroups)) {\r\n const subscriber = s as MsgChannelGroupSubscriberParams;\r\n const callback = subscriber.callback;\r\n if (callback) {\r\n subscriber.callback = (msg) => {\r\n return callback(msg, component);\r\n };\r\n }\r\n const filter = subscriber.filter;\r\n const componentFilter = subscriber.componentFilter || ComponentMsgFilter.None;\r\n subscriber.filter = (msg) => {\r\n let result = true;\r\n if (componentFilter & ComponentMsgFilter.FromAncestors) {\r\n const ancestorIds = component.getChainUp();\r\n result = ancestorIds?.indexOf(msg.headers?.sourceId) >= 0;\r\n }\r\n if (result && componentFilter & ComponentMsgFilter.FromDescendants) {\r\n const descendantIds = component.getChainDown();\r\n result = descendantIds?.indexOf(msg.headers?.sourceId) >= 0;\r\n }\r\n if (result && filter) {\r\n result = filter(msg, component);\r\n }\r\n return result;\r\n };\r\n\r\n component.msgBus.on({\r\n ...s,\r\n channel: channel,\r\n group: g,\r\n config: {\r\n abortSignal: component.msgBroker.abortController.signal,\r\n },\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function getComponentMsgBus<TStruct extends ComponentStruct = ComponentStruct>(\r\n msgBus: MsgBus<TStruct['msg']>,\r\n headerSetter: (headers?: ComponentMsgHeaders) => void,\r\n) {\r\n const updateParams = (params: { payload?: any; headers?: ComponentMsgHeaders }) => {\r\n if (params.payload != undefined) {\r\n params.payload = structuredClone(toJS(params.payload)); // always?\r\n }\r\n if (!params.headers) {\r\n params.headers = {};\r\n }\r\n headerSetter?.(params.headers);\r\n };\r\n return {\r\n config: msgBus.config,\r\n on: (params) => {\r\n return msgBus.on(params);\r\n },\r\n once: (params) => {\r\n return msgBus.once(params);\r\n },\r\n stream: (params) => {\r\n return msgBus.stream(params);\r\n },\r\n provide: (params) => {\r\n updateParams(params);\r\n return msgBus.provide(params);\r\n },\r\n send: (params) => {\r\n updateParams(params);\r\n return msgBus.send(params);\r\n },\r\n request: (params) => {\r\n updateParams(params);\r\n return msgBus.request(params);\r\n },\r\n } as MsgBus<TStruct['msg']>;\r\n}\r\n\r\nexport function createEffect<\r\n TStruct extends ComponentStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n>(\r\n component: Component<TStruct, TMsgHeaders>,\r\n name: string,\r\n fn: EffectFn<TStruct, TMsgHeaders>,\r\n): EffectController {\r\n let disposer: IReactionDisposer | null = null;\r\n let paused = false;\r\n let effectCleanup: () => void = undefined;\r\n\r\n const start = () => {\r\n if (disposer) {\r\n return;\r\n }\r\n\r\n disposer = autorun(\r\n () => {\r\n if (!paused) {\r\n const cleanup = fn(component);\r\n if (typeof cleanup === 'function') {\r\n cleanup();\r\n effectCleanup = cleanup;\r\n }\r\n }\r\n },\r\n { name: `effect:${name}` },\r\n );\r\n };\r\n\r\n const stop = () => {\r\n disposer?.();\r\n disposer = null;\r\n if (effectCleanup) {\r\n effectCleanup();\r\n effectCleanup = undefined;\r\n }\r\n };\r\n\r\n const pause = () => {\r\n paused = true;\r\n };\r\n\r\n const resume = () => {\r\n paused = false;\r\n };\r\n\r\n const restart = () => {\r\n stop();\r\n start();\r\n };\r\n\r\n start();\r\n\r\n return { start, pause, resume, stop, restart };\r\n}\r\n\r\n// TODO: move to utico\r\n// function asyncToGeneratorFlow(asyncFn: (...args: any[]) => Promise<any>) {\r\n// return function* (...args: any[]) {\r\n// const result = yield asyncFn(...args);\r\n// return result;\r\n// };\r\n// }\r\n"],"names":["isBinding","obj","$isBinding","bind","get","set","converter","validator","bindProp","target","prop","value","proxyCache","createRecursiveProxy","bindings","handlers","isObservable","proxy","receiver","onGet","binding","oldValue","onChanging","result","runInAction","toHtmlId","url","segment","getComponentSourceByCaller","depth","stack","getComponentNameByCaller","match","fnName","hookMatch","registerMsgBroker","component","providers","channel","providerGroups","g","p","provider","callback","msg","headers","filter","componentFilter","ComponentMsgFilter","subscribers","subscriberGroups","subscriber","getComponentMsgBus","msgBus","headerSetter","updateParams","params","toJS","createEffect","name","fn","disposer","paused","effectCleanup","start","autorun","cleanup","stop","pause","resume","restart"],"mappings":"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"}
1
+ {"version":3,"file":"core.es.js","sources":["../../src/componentModel/core.tsx"],"sourcesContent":["import React from 'react';\r\nimport { MsgBus } from '@actdim/msgmesh/contracts';\r\nimport { isObservable, runInAction, toJS, autorun, IReactionDisposer } from 'mobx';\r\nimport type {\r\n Binding,\r\n Component,\r\n ComponentMsgHeaders,\r\n ComponentStruct,\r\n EffectController,\r\n EffectFn,\r\n MsgChannelGroupProviderParams,\r\n MsgChannelGroupSubscriberParams,\r\n PropEventHandlers,\r\n PropValueChangeHandler,\r\n PropValueChangingHandler,\r\n Validator,\r\n ValueConverter,\r\n} from './contracts';\r\nimport { $isBinding, ComponentMsgFilter } from './contracts';\r\nimport { isPlainObject } from 'mobx/dist/internal';\r\n\r\nconst blankView = () => null;\r\n\r\nexport function isBinding(obj: any): obj is Binding {\r\n return obj[$isBinding] === true;\r\n}\r\n\r\nexport function bind<T, TFrom = any>(\r\n get: () => T,\r\n set?: (value: T) => void,\r\n converter?: ValueConverter<T, TFrom>,\r\n validator?: Validator<T>,\r\n): Binding {\r\n return {\r\n get: get,\r\n set: set,\r\n converter: converter,\r\n validator: validator,\r\n readOnly: !!set,\r\n [$isBinding]: true,\r\n };\r\n}\r\n\r\nexport function bindProp<T extends object, P extends keyof T>(target: () => T, prop: P): Binding {\r\n return {\r\n get: () => target()[prop],\r\n set: (value: T[P]) => {\r\n target()[prop] = value;\r\n },\r\n [$isBinding]: true,\r\n };\r\n}\r\n\r\nconst proxyCache = new WeakMap<object, any>();\r\n\r\nexport type ProxyEventHandlers = {\r\n onPropChanging?: PropValueChangingHandler<PropertyKey>;\r\n onPropChange?: PropValueChangeHandler<PropertyKey>;\r\n} & Record<PropertyKey, PropEventHandlers>;\r\n\r\nexport function createRecursiveProxy(\r\n target: any,\r\n bindings: Map<PropertyKey, Binding>,\r\n handlers: ProxyEventHandlers,\r\n) {\r\n if (typeof target !== 'object' || target === null) {\r\n return target;\r\n }\r\n\r\n // isPlainObject\r\n if (!isObservable(target)) {\r\n return target;\r\n }\r\n\r\n if (proxyCache.has(target)) {\r\n return proxyCache.get(target);\r\n }\r\n\r\n const proxy = new Proxy(target, {\r\n get(obj, prop, receiver) {\r\n // 1. custom handlers\r\n const onGet = handlers[prop]?.onGet;\r\n if (onGet) return onGet();\r\n\r\n // 2. bindings\r\n const binding = bindings.get(prop);\r\n if (binding?.get) {\r\n return binding.get();\r\n }\r\n\r\n const value = Reflect.get(obj, prop, receiver);\r\n\r\n if (typeof value === 'object' && value !== null && isObservable(value)) {\r\n return createRecursiveProxy(value, bindings, handlers);\r\n }\r\n\r\n return value;\r\n },\r\n\r\n set(obj, prop, value, receiver) {\r\n const oldValue = obj[prop];\r\n\r\n // before-change hooks\r\n const onChanging = handlers[prop]?.onChanging;\r\n if (onChanging && onChanging(oldValue, value) === false) {\r\n return true;\r\n }\r\n\r\n if (\r\n handlers.onPropChanging &&\r\n handlers.onPropChanging(prop, oldValue, value) === false\r\n ) {\r\n return true;\r\n }\r\n\r\n const result = runInAction(() => {\r\n return Reflect.set(obj, prop, value, receiver);\r\n });\r\n\r\n // bindings\r\n const binding = bindings.get(prop);\r\n binding?.set?.(value);\r\n\r\n // after-change hooks\r\n handlers[prop]?.onChange?.(value);\r\n handlers.onPropChange?.(prop, value);\r\n\r\n return result;\r\n },\r\n });\r\n\r\n proxyCache.set(target, proxy);\r\n return proxy;\r\n}\r\n\r\nexport function toHtmlId(url: string): string {\r\n let parts = url\r\n .split('/')\r\n .filter(Boolean)\r\n .map((segment) => decodeURIComponent(segment));\r\n\r\n const raw = parts.join('-');\r\n // sanitize\r\n let id = raw\r\n .normalize('NFKD')\r\n .replace(/[^a-zA-Z0-9\\-_:.+#]/g, '-')\r\n .replace(/-+/g, '-')\r\n .replace(/^[^a-zA-Z]+/, '-')\r\n // .replace(/:/g, '-')\r\n // .replace(/\\./g, '_')\r\n // .replace(/#/g, '-')\r\n .replace(/[+#]$/, '-');\r\n return id;\r\n}\r\n\r\nexport function getComponentSourceByCaller(depth = 2): string | null {\r\n const err = new Error();\r\n const stack = err.stack?.split('\\n');\r\n if (!stack || stack.length <= depth) {\r\n return null;\r\n }\r\n const match = stack[depth].match(/\\(([^)]+)\\)/);\r\n const result = match?.[1];\r\n if (result) {\r\n if (\r\n document.querySelector('script[type=\"module\"][src*=\"/@vite/\"]') &&\r\n globalThis['CONFIG_TYPE'] === 'DEVELOPMENT'\r\n ) {\r\n return result.replace(/\\?[^:]+/, '');\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nexport function getComponentNameByCaller(depth = 2): string | null {\r\n const err = new Error();\r\n const stack = err.stack?.split('\\n');\r\n if (!stack || stack.length <= depth) {\r\n return null;\r\n }\r\n const line = stack[depth].trim();\r\n const match = line.match(/^at\\s+([^\\s(]+)/);\r\n if (!match) {\r\n return null;\r\n }\r\n const fnName = match[1];\r\n const hookMatch = fnName.match(/^use(.+)/);\r\n if (hookMatch) {\r\n return hookMatch[1];\r\n }\r\n return fnName;\r\n}\r\n\r\nexport function registerMsgBroker<TStruct extends ComponentStruct = ComponentStruct>(\r\n component: Component<TStruct>,\r\n) {\r\n const providers = component?.msgBroker.provide;\r\n if (providers) {\r\n for (const [channel, providerGroups] of Object.entries(providers)) {\r\n for (const [g, p] of Object.entries(providerGroups)) {\r\n const provider = p as MsgChannelGroupProviderParams;\r\n const callback = provider.callback;\r\n if (callback) {\r\n provider.callback = (msg, headers) => {\r\n return callback(msg, headers, component);\r\n };\r\n }\r\n const filter = provider.filter;\r\n const componentFilter = provider.componentFilter || ComponentMsgFilter.None;\r\n provider.filter = (msg) => {\r\n let result = true;\r\n if (componentFilter & ComponentMsgFilter.FromAncestors) {\r\n const ancestorIds = component.getChainUp();\r\n result = ancestorIds?.indexOf(msg.headers?.sourceId) >= 0;\r\n }\r\n if (result && componentFilter & ComponentMsgFilter.FromDescendants) {\r\n const descendantIds = component.getChainDown();\r\n result = descendantIds?.indexOf(msg.headers?.sourceId) >= 0;\r\n }\r\n if (result && filter) {\r\n result = filter(msg, component);\r\n }\r\n return result;\r\n };\r\n\r\n component.msgBus.provide({\r\n ...p,\r\n channel: channel,\r\n group: g,\r\n options: {\r\n abortSignal: component.msgBroker.abortController.signal,\r\n },\r\n });\r\n }\r\n }\r\n }\r\n const subscribers = component?.msgBroker?.subscribe;\r\n if (subscribers) {\r\n for (const [channel, subscriberGroups] of Object.entries(subscribers)) {\r\n for (const [g, s] of Object.entries(subscriberGroups)) {\r\n const subscriber = s as MsgChannelGroupSubscriberParams;\r\n const callback = subscriber.callback;\r\n if (callback) {\r\n subscriber.callback = (msg) => {\r\n return callback(msg, component);\r\n };\r\n }\r\n const filter = subscriber.filter;\r\n const componentFilter = subscriber.componentFilter || ComponentMsgFilter.None;\r\n subscriber.filter = (msg) => {\r\n let result = true;\r\n if (componentFilter & ComponentMsgFilter.FromAncestors) {\r\n const ancestorIds = component.getChainUp();\r\n result = ancestorIds?.indexOf(msg.headers?.sourceId) >= 0;\r\n }\r\n if (result && componentFilter & ComponentMsgFilter.FromDescendants) {\r\n const descendantIds = component.getChainDown();\r\n result = descendantIds?.indexOf(msg.headers?.sourceId) >= 0;\r\n }\r\n if (result && filter) {\r\n result = filter(msg, component);\r\n }\r\n return result;\r\n };\r\n\r\n component.msgBus.on({\r\n ...s,\r\n channel: channel,\r\n group: g,\r\n options: {\r\n abortSignal: component.msgBroker.abortController.signal,\r\n },\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function getComponentMsgBus<TStruct extends ComponentStruct = ComponentStruct>(\r\n msgBus: MsgBus<TStruct['msg']>,\r\n headerSetter: (headers?: ComponentMsgHeaders) => void,\r\n) {\r\n const updateParams = (params: { payload?: any; headers?: ComponentMsgHeaders }) => {\r\n if (params.payload != undefined) {\r\n params.payload = structuredClone(toJS(params.payload)); // always?\r\n }\r\n if (!params.headers) {\r\n params.headers = {};\r\n }\r\n headerSetter?.(params.headers);\r\n };\r\n return {\r\n config: msgBus.config,\r\n on: (params) => {\r\n return msgBus.on(params);\r\n },\r\n once: (params) => {\r\n return msgBus.once(params);\r\n },\r\n stream: (params) => {\r\n return msgBus.stream(params);\r\n },\r\n provide: (params) => {\r\n updateParams(params);\r\n return msgBus.provide(params);\r\n },\r\n send: (params) => {\r\n updateParams(params);\r\n return msgBus.send(params);\r\n },\r\n request: (params) => {\r\n updateParams(params);\r\n return msgBus.request(params);\r\n },\r\n } as MsgBus<TStruct['msg']>;\r\n}\r\n\r\nexport function createEffect<\r\n TStruct extends ComponentStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n>(\r\n component: Component<TStruct, TMsgHeaders>,\r\n name: string,\r\n fn: EffectFn<TStruct, TMsgHeaders>,\r\n): EffectController {\r\n let disposer: IReactionDisposer | null = null;\r\n let paused = false;\r\n let effectCleanup: () => void = undefined;\r\n\r\n const start = () => {\r\n if (disposer) {\r\n return;\r\n }\r\n\r\n disposer = autorun(\r\n () => {\r\n if (!paused) {\r\n const cleanup = fn(component);\r\n if (typeof cleanup === 'function') {\r\n cleanup();\r\n effectCleanup = cleanup;\r\n }\r\n }\r\n },\r\n { name: `effect:${name}` },\r\n );\r\n };\r\n\r\n const stop = () => {\r\n disposer?.();\r\n disposer = null;\r\n if (effectCleanup) {\r\n effectCleanup();\r\n effectCleanup = undefined;\r\n }\r\n };\r\n\r\n const pause = () => {\r\n paused = true;\r\n };\r\n\r\n const resume = () => {\r\n paused = false;\r\n };\r\n\r\n const restart = () => {\r\n stop();\r\n start();\r\n };\r\n\r\n start();\r\n\r\n return { start, pause, resume, stop, restart };\r\n}\r\n\r\n// TODO: move to utico\r\n// function asyncToGeneratorFlow(asyncFn: (...args: any[]) => Promise<any>) {\r\n// return function* (...args: any[]) {\r\n// const result = yield asyncFn(...args);\r\n// return result;\r\n// };\r\n// }\r\n"],"names":["isBinding","obj","$isBinding","bind","get","set","converter","validator","bindProp","target","prop","value","proxyCache","createRecursiveProxy","bindings","handlers","isObservable","proxy","receiver","onGet","binding","oldValue","onChanging","result","runInAction","toHtmlId","url","segment","getComponentSourceByCaller","depth","stack","getComponentNameByCaller","match","fnName","hookMatch","registerMsgBroker","component","providers","channel","providerGroups","g","p","provider","callback","msg","headers","filter","componentFilter","ComponentMsgFilter","subscribers","subscriberGroups","subscriber","getComponentMsgBus","msgBus","headerSetter","updateParams","params","toJS","createEffect","name","fn","disposer","paused","effectCleanup","start","autorun","cleanup","stop","pause","resume","restart"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { FC } from 'react';
1
+ import { default as React } from 'react';
2
2
  import { Component, ComponentDef, ComponentMsgHeaders, ComponentParams, ComponentStruct } from './contracts';
3
3
  export declare function useComponent<TStruct extends ComponentStruct = ComponentStruct, TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders>(componentDef: ComponentDef<TStruct, TMsgHeaders>, params: ComponentParams<TStruct>): any;
4
- export declare function getFC<TStruct extends ComponentStruct>(factory: (params: ComponentParams<TStruct>) => Component<TStruct>): FC<ComponentParams<TStruct>>;
4
+ export declare function getFC<TStruct extends ComponentStruct>(factory: (params: ComponentParams<TStruct>) => Component<TStruct>): React.FC<ComponentParams<TStruct>>;
5
5
  //# sourceMappingURL=react.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/componentModel/react.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAiD,EAAE,EAAW,MAAM,OAAO,CAAC;AAO1F,OAAO,EAEH,SAAS,EAET,YAAY,EAEZ,mBAAmB,EACnB,eAAe,EACf,eAAe,EAOlB,MAAM,aAAa,CAAC;AAmWrB,wBAAgB,YAAY,CACxB,OAAO,SAAS,eAAe,GAAG,eAAe,EACjD,WAAW,SAAS,mBAAmB,GAAG,mBAAmB,EAC/D,YAAY,EAAE,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,OAQnF;AAGD,wBAAgB,KAAK,CAAC,OAAO,SAAS,eAAe,EACjD,OAAO,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,OAAO,CAAC,GAClE,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAQ9B"}
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/componentModel/react.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsD,MAAM,OAAO,CAAC;AAO3E,OAAO,EAEH,SAAS,EAET,YAAY,EAEZ,mBAAmB,EACnB,eAAe,EAEf,eAAe,EAOlB,MAAM,aAAa,CAAC;AAkWrB,wBAAgB,YAAY,CACxB,OAAO,SAAS,eAAe,GAAG,eAAe,EACjD,WAAW,SAAS,mBAAmB,GAAG,mBAAmB,EAC/D,YAAY,EAAE,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,OASnF;AAGD,wBAAgB,KAAK,CAAC,OAAO,SAAS,eAAe,EACjD,OAAO,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,OAAO,CAAC,GAClE,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAQpC"}
@@ -1,10 +1,10 @@
1
- import d, { useLayoutEffect as w, useEffect as M, useMemo as G } from "react";
2
- import { observer as S } from "mobx-react-lite";
1
+ import y, { useLayoutEffect as H, useEffect as G, useMemo as S } from "react";
2
+ import { observer as F } from "mobx-react-lite";
3
3
  import { observable as P } from "mobx";
4
- import { useLazyRef as F } from "../reactHooks.es.js";
4
+ import { useLazyRef as L } from "../reactHooks.es.js";
5
5
  import { getGlobalFlags as h } from "../globals.es.js";
6
- import { useComponentContext as H, ReactComponentContext as L } from "./componentContext.es.js";
7
- import { $ON_CHANGE as z, $ON_CHANGING as A, $ON_GET as T } from "./contracts.es.js";
6
+ import { useComponentContext as w, ReactComponentContext as z } from "./componentContext.es.js";
7
+ import { $ON_CHANGE as x, $ON_CHANGING as A, $ON_GET as T } from "./contracts.es.js";
8
8
  import { lazy as U } from "@actdim/utico/utils";
9
9
  import { getComponentSourceByCaller as _, getComponentMsgBus as J, toHtmlId as V, registerMsgBroker as q, isBinding as K, createRecursiveProxy as Q, createEffect as W } from "./core.es.js";
10
10
  function C(e) {
@@ -13,11 +13,11 @@ function C(e) {
13
13
  function X(e) {
14
14
  return e.replace(/^[a-z][a-z0-9+.-]*:\/\/[^\/]+/, "");
15
15
  }
16
- function Y(e, i) {
16
+ function Y(e, u, i) {
17
17
  let t, l;
18
18
  e || (e = {});
19
- let u = e.regType;
20
- u || (u = _(6), u = X(u)), i || (i = {});
19
+ let d = e.regType;
20
+ d || (d = _(6), d = X(d)), i || (i = {});
21
21
  const $ = e.view;
22
22
  let v = e.msgBus;
23
23
  const b = /* @__PURE__ */ new Map(), B = U(() => J(v, (r) => {
@@ -27,19 +27,19 @@ function Y(e, i) {
27
27
  ...e.msgBroker
28
28
  };
29
29
  a.abortController || (a.abortController = new AbortController());
30
- const y = H(), N = S((r) => {
31
- const n = H(), g = n.currentId;
30
+ const N = F((r) => {
31
+ const n = w(), g = n.currentId;
32
32
  if (t.parentId = g, v || (v = n.msgBus), !t.id) {
33
33
  let o = i.$id;
34
34
  if (!o) {
35
35
  const f = i.$key;
36
- f ? o = `${V(u)}#${f}` : o = n.getNextId(u);
36
+ f ? o = `${V(d)}#${f}` : o = n.getNextId(d);
37
37
  }
38
38
  t.id = o;
39
39
  }
40
- w(() => {
40
+ H(() => {
41
41
  try {
42
- if (n.register(t.id, u, g), h().debug) {
42
+ if (n.register(t.id, d, g), h().debug) {
43
43
  const o = t.getHierarchyId();
44
44
  console.debug(`${o}>layout`);
45
45
  }
@@ -54,7 +54,7 @@ function Y(e, i) {
54
54
  }
55
55
  n.unregister(t.id), a.abortController?.abort(), e.events?.onLayoutDestroy?.(t), i.onLayoutDestroy?.(t);
56
56
  };
57
- }, [e, i, n]), M(() => {
57
+ }, [e, i, n]), G(() => {
58
58
  try {
59
59
  if (h().debug) {
60
60
  const o = t.getHierarchyId();
@@ -78,23 +78,23 @@ function Y(e, i) {
78
78
  const o = t.getHierarchyId();
79
79
  console.debug(`${o}>view`);
80
80
  }
81
- typeof $ == "function" ? s = $(r, t) : s = /* @__PURE__ */ d.createElement(d.Fragment, null, r.children);
81
+ typeof $ == "function" ? s = $(r, t) : s = /* @__PURE__ */ y.createElement(y.Fragment, null, r.children);
82
82
  } catch (o) {
83
83
  const f = JSON.stringify(o);
84
- s = /* @__PURE__ */ d.createElement(d.Fragment, null, f);
84
+ s = /* @__PURE__ */ y.createElement(y.Fragment, null, f);
85
85
  }
86
- const c = G(
86
+ const c = S(
87
87
  () => ({ ...n, currentId: t.id }),
88
88
  [e, i, n]
89
89
  );
90
- return /* @__PURE__ */ d.createElement(L.Provider, { value: c }, s);
90
+ return /* @__PURE__ */ y.createElement(z.Provider, { value: c }, s);
91
91
  }), I = {};
92
92
  if (l = {}, e.props && Object.assign(l, e.props), e.actions && Object.assign(l, e.actions), e.children)
93
93
  for (const [r, n] of Object.entries(e.children))
94
94
  if (typeof n == "function") {
95
95
  const g = n, s = (c) => {
96
96
  const o = g(c);
97
- return /* @__PURE__ */ d.createElement(o.View, null);
97
+ return /* @__PURE__ */ y.createElement(o.View, null);
98
98
  };
99
99
  Reflect.set(I, C(r), s);
100
100
  } else
@@ -114,15 +114,15 @@ function Y(e, i) {
114
114
  const n = `${T}${C(r)}`;
115
115
  return i[n] || e.events?.[n];
116
116
  }
117
- function x(r) {
117
+ function j(r) {
118
118
  const n = `${A}${C(r)}`;
119
119
  return ((g, s) => {
120
120
  let c = !0, o = i[n];
121
121
  return o && (c = o(g, s)), c && (o = e.events?.[n], o && (c = o(g, s))), c;
122
122
  });
123
123
  }
124
- function j(r) {
125
- const n = `${z}${C(r)}`;
124
+ function M(r) {
125
+ const n = `${x}${C(r)}`;
126
126
  return ((g) => {
127
127
  i[n]?.(g), e.events?.[n]?.(g);
128
128
  });
@@ -132,8 +132,8 @@ function Y(e, i) {
132
132
  for (const r of Object.keys(e.props))
133
133
  E[r] = {
134
134
  onGet: R(r),
135
- onChanging: x(r),
136
- onChange: j(r)
135
+ onChanging: j(r),
136
+ onChange: M(r)
137
137
  };
138
138
  for (const r of Object.keys(e.props))
139
139
  k[r] = P.deep;
@@ -148,14 +148,14 @@ function Y(e, i) {
148
148
  if (t = {
149
149
  id: i.$id,
150
150
  key: i.$key,
151
- regType: u,
151
+ regType: d,
152
152
  parentId: void 0,
153
- getHierarchyId: () => y.getHierarchyPath(t.id),
154
- getChainDown: () => y.getChainDown(t.id),
155
- getChainUp: () => y.getChainUp(t.id),
156
- getChildren: () => y.getChildren(t.id),
157
- getParent: () => y.getParent(t.id),
158
- getNodeMap: () => y.getNodeMap(),
153
+ getHierarchyId: () => u.getHierarchyPath(t.id),
154
+ getChainDown: () => u.getChainDown(t.id),
155
+ getChainUp: () => u.getChainUp(t.id),
156
+ getChildren: () => u.getChildren(t.id),
157
+ getParent: () => u.getParent(t.id),
158
+ getNodeMap: () => u.getNodeMap(),
159
159
  bindings: b,
160
160
  get msgBus() {
161
161
  return B();
@@ -175,16 +175,16 @@ function Y(e, i) {
175
175
  );
176
176
  return e.events?.onInit && e.events.onInit(t), i.onInit && i.onInit(t), t;
177
177
  }
178
- function oe(e, i) {
179
- const t = F(() => Y(e, i));
180
- return w(() => () => {
178
+ function oe(e, u) {
179
+ const i = w(), t = L(() => Y(e, i, u));
180
+ return H(() => () => {
181
181
  t.current = null;
182
182
  }, []), t.current;
183
183
  }
184
184
  function se(e) {
185
- return (t) => {
186
- const l = e(t);
187
- return /* @__PURE__ */ d.createElement(l.View, { ...t });
185
+ return (i) => {
186
+ const t = e(i);
187
+ return /* @__PURE__ */ y.createElement(t.View, { ...i });
188
188
  };
189
189
  }
190
190
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"react.es.js","sources":["../../src/componentModel/react.tsx"],"sourcesContent":["import React, { PropsWithChildren, useEffect, useLayoutEffect, FC, useMemo } from 'react';\r\nimport { Mutable } from '@actdim/utico/typeCore';\r\nimport { observer } from 'mobx-react-lite';\r\nimport { action, observable } from 'mobx';\r\nimport { useLazyRef } from '@/reactHooks';\r\nimport { getGlobalFlags } from '@/globals';\r\nimport { ReactComponentContext, useComponentContext } from './componentContext';\r\nimport {\r\n Binding,\r\n Component,\r\n ComponentChildren,\r\n ComponentDef,\r\n ComponentModel,\r\n ComponentMsgHeaders,\r\n ComponentParams,\r\n ComponentStruct,\r\n ComponentViewImplFn,\r\n ComponentViewProps,\r\n EffectController,\r\n EffectFn,\r\n ValueChangeHandler,\r\n ValueChangingHandler,\r\n} from './contracts';\r\nimport { $ON_CHANGE, $ON_CHANGING, $ON_GET, $isBinding, ComponentMsgFilter } from './contracts';\r\nimport { lazy } from '@actdim/utico/utils';\r\nimport {\r\n createEffect,\r\n createRecursiveProxy,\r\n getComponentSourceByCaller,\r\n getComponentMsgBus,\r\n isBinding,\r\n ProxyEventHandlers,\r\n registerMsgBroker,\r\n toHtmlId,\r\n} from './core';\r\n\r\nfunction capitalize(name: string) {\r\n return name.replace(/^./, name[0].toUpperCase());\r\n}\r\n\r\nfunction cleanSourceRef(sourceRef: string) {\r\n // remove origin\r\n return sourceRef.replace(/^[a-z][a-z0-9+.-]*:\\/\\/[^\\/]+/, '');\r\n}\r\n\r\nfunction createComponent<TStruct extends ComponentStruct = ComponentStruct>(\r\n componentDef: ComponentDef<TStruct>,\r\n params?: ComponentParams<TStruct>,\r\n): Component<TStruct> {\r\n // result\r\n let component: Mutable<Component<TStruct>>;\r\n let model: Mutable<ComponentModel<TStruct>>;\r\n\r\n if (!componentDef) {\r\n componentDef = {};\r\n }\r\n\r\n let regType = componentDef.regType;\r\n if (!regType) {\r\n regType = getComponentSourceByCaller(6);\r\n // type = getComponentNameByCaller(6);\r\n regType = cleanSourceRef(regType);\r\n // throw new Error('Valid component definition is required');\r\n }\r\n\r\n if (!params) {\r\n params = {};\r\n }\r\n\r\n const view = componentDef.view;\r\n let msgBus = componentDef.msgBus;\r\n\r\n const bindings = new Map<PropertyKey, Binding>();\r\n\r\n const componentMsgBus = lazy(() => {\r\n return getComponentMsgBus(msgBus, (headers) => {\r\n if (headers?.sourceId == undefined) {\r\n headers.sourceId = component.id;\r\n }\r\n }); // as ComponentModel<TStruct>['msgBus']\r\n });\r\n\r\n let msgBroker = {\r\n ...componentDef.msgBroker,\r\n };\r\n\r\n if (!msgBroker.abortController) {\r\n msgBroker.abortController = new AbortController();\r\n }\r\n\r\n const context = useComponentContext();\r\n\r\n const ViewFC = observer((props: ComponentViewProps) => {\r\n const context = useComponentContext();\r\n const parentId = context.currentId;\r\n\r\n component.parentId = parentId;\r\n\r\n if (!msgBus) {\r\n msgBus = context.msgBus;\r\n }\r\n\r\n if (!component.id) {\r\n let id = params.$id;\r\n if (!id) {\r\n const key = params.$key;\r\n if (key) {\r\n id = `${toHtmlId(regType)}#${key}`;\r\n } else {\r\n id = context.getNextId(regType);\r\n }\r\n }\r\n component.id = id;\r\n }\r\n\r\n useLayoutEffect(() => {\r\n try {\r\n context.register(component.id, regType, parentId);\r\n\r\n if (getGlobalFlags().debug) {\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>layout`);\r\n }\r\n\r\n registerMsgBroker(component);\r\n\r\n componentDef.events?.onLayout?.(component);\r\n params.onLayout?.(component);\r\n } catch (err) {\r\n componentDef.events?.onError?.(component, err);\r\n params.onError?.(component, err);\r\n }\r\n\r\n return () => {\r\n if (getGlobalFlags().debug) {\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>layout-destroy`);\r\n }\r\n context.unregister(component.id);\r\n\r\n msgBroker.abortController?.abort();\r\n\r\n componentDef.events?.onLayoutDestroy?.(component);\r\n params.onLayoutDestroy?.(component);\r\n };\r\n }, [componentDef, params, context]);\r\n\r\n useEffect(() => {\r\n try {\r\n if (getGlobalFlags().debug) {\r\n // mount\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>ready`);\r\n }\r\n componentDef.events?.onReady?.(component);\r\n params.onReady?.(component);\r\n } catch (err) {\r\n if (getGlobalFlags().debug) {\r\n // unmount\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>destroy`);\r\n }\r\n componentDef.events?.onError?.(component, err);\r\n params.onError?.(component, err);\r\n }\r\n return () => {\r\n componentDef.events?.onDestroy?.(component);\r\n params.onDestroy?.(component);\r\n };\r\n }, [componentDef, params, context]);\r\n\r\n let content: React.ReactNode;\r\n // let content: any;\r\n try {\r\n if (getGlobalFlags().debug) {\r\n // render\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>view`);\r\n }\r\n if (typeof view === 'function') {\r\n content = view(props, component);\r\n } else {\r\n // content = props.children;\r\n content = <>{props.children}</>;\r\n }\r\n } catch (err) {\r\n // throw err;\r\n const errDetails = JSON.stringify(err);\r\n // msgBus.send\r\n content = <>{errDetails}</>;\r\n }\r\n const scopeContext = useMemo(\r\n () => ({ ...context, currentId: component.id }),\r\n [componentDef, params, context],\r\n );\r\n return (\r\n <ReactComponentContext.Provider value={scopeContext}>\r\n {content}\r\n </ReactComponentContext.Provider>\r\n );\r\n });\r\n\r\n const children = {} as ComponentChildren<TStruct['children']>;\r\n\r\n model = {} as Mutable<ComponentModel<TStruct>>;\r\n\r\n if (componentDef.props) {\r\n Object.assign(model, componentDef.props);\r\n }\r\n\r\n if (componentDef.actions) {\r\n Object.assign(model, componentDef.actions);\r\n }\r\n\r\n if (componentDef.children) {\r\n for (const [key, value] of Object.entries(componentDef.children)) {\r\n if (typeof value == 'function') {\r\n const view = value as (params: any) => Component;\r\n const ChildViewFC: ComponentViewImplFn<TStruct> = (props) => {\r\n const c = view(props);\r\n return <c.View />;\r\n // if (typeof c.view === \"function\") {\r\n // return c.view(props);\r\n // }\r\n // return <>{props.children}</>;\r\n };\r\n Reflect.set(children, capitalize(key), ChildViewFC);\r\n } else {\r\n Reflect.set(children, key, value);\r\n }\r\n }\r\n }\r\n\r\n // Reflect.ownKeys/Object.keys\r\n for (const [key, value] of Object.entries(params)) {\r\n // model.hasOwnProperty(key)\r\n if (key in model) {\r\n if (isBinding(value)) {\r\n bindings.set(key, value);\r\n } else {\r\n Reflect.set(model, key, value);\r\n }\r\n }\r\n }\r\n\r\n const proxyEventHandlers: Pick<ProxyEventHandlers, 'onPropChanging' | 'onPropChange'> = {\r\n onPropChanging:\r\n params.onPropChanging || componentDef.events?.onPropChanging\r\n ? (prop, oldValue, newValue) => {\r\n let result = true;\r\n let handler = params.onPropChanging;\r\n if (handler) {\r\n result = handler(String(prop), oldValue, newValue);\r\n }\r\n if (result) {\r\n handler = componentDef.events?.onPropChanging;\r\n if (handler) {\r\n result = handler(String(prop), oldValue, newValue);\r\n }\r\n }\r\n return result;\r\n }\r\n : undefined,\r\n onPropChange:\r\n params.onPropChange || componentDef.events?.onPropChange\r\n ? (prop, value) => {\r\n params.onPropChange?.(String(prop), value);\r\n componentDef.events?.onPropChange?.(String(prop), value);\r\n }\r\n : undefined,\r\n };\r\n\r\n function resolveOnGetEventHandler(prop: string) {\r\n const key = `${$ON_GET}${capitalize(prop)}`;\r\n return params[key] || componentDef.events?.[key];\r\n }\r\n\r\n function resolveOnChangingEventHandler(prop: string) {\r\n const key = `${$ON_CHANGING}${capitalize(prop)}`;\r\n return ((oldValue: any, newValue: any) => {\r\n let result = true;\r\n let handler = params[key] as ValueChangingHandler<any>;\r\n if (handler) {\r\n result = handler(oldValue, newValue);\r\n }\r\n if (result) {\r\n handler = componentDef.events?.[key] as ValueChangingHandler<any>;\r\n if (handler) {\r\n result = handler(oldValue, newValue);\r\n }\r\n }\r\n return result;\r\n }) as ValueChangingHandler;\r\n }\r\n\r\n function resolveOnChangeEventHandler(prop: string) {\r\n const key = `${$ON_CHANGE}${capitalize(prop)}`;\r\n return ((value: any) => {\r\n (params[key] as ValueChangeHandler<any>)?.(value);\r\n (componentDef.events?.[key] as ValueChangeHandler<any>)?.(value);\r\n }) as ValueChangeHandler;\r\n }\r\n\r\n let annotationMap: Record<string, any> = {};\r\n\r\n if (componentDef.props) {\r\n for (const prop of Object.keys(componentDef.props)) {\r\n proxyEventHandlers[prop] = {\r\n onGet: resolveOnGetEventHandler(prop),\r\n onChanging: resolveOnChangingEventHandler(prop),\r\n onChange: resolveOnChangeEventHandler(prop),\r\n };\r\n }\r\n\r\n for (const key of Object.keys(componentDef.props)) {\r\n annotationMap[key] = observable.deep;\r\n }\r\n }\r\n\r\n if (componentDef.actions) {\r\n const annotationMap: Record<string, any> = {};\r\n for (const key of Object.keys(componentDef.actions)) {\r\n annotationMap[key] = action;\r\n }\r\n }\r\n\r\n model = observable(model, annotationMap, {\r\n deep: true,\r\n });\r\n\r\n model = createRecursiveProxy(model, bindings, proxyEventHandlers);\r\n\r\n let effects: Record<string, EffectController> = {};\r\n component = {\r\n id: params.$id,\r\n key: params.$key,\r\n regType: regType,\r\n parentId: undefined,\r\n getHierarchyId: () => context.getHierarchyPath(component.id),\r\n getChainDown: () => context.getChainDown(component.id),\r\n getChainUp: () => context.getChainUp(component.id),\r\n getChildren: () => context.getChildren(component.id),\r\n getParent: () => context.getParent(component.id),\r\n getNodeMap: () => context.getNodeMap(),\r\n bindings: bindings,\r\n get msgBus() {\r\n return componentMsgBus();\r\n },\r\n msgBroker: msgBroker,\r\n effects: effects,\r\n // view: componentDef.view,\r\n View: ViewFC,\r\n children: children,\r\n model: model,\r\n };\r\n\r\n if (componentDef.effects) {\r\n for (const [name, fn] of Object.entries(componentDef.effects)) {\r\n effects[name] = createEffect(\r\n component,\r\n name,\r\n fn as EffectFn<TStruct, ComponentMsgHeaders>,\r\n );\r\n }\r\n }\r\n\r\n if (componentDef.events?.onInit) {\r\n componentDef.events.onInit(component);\r\n }\r\n\r\n if (params.onInit) {\r\n params.onInit(component);\r\n }\r\n\r\n return component;\r\n}\r\n\r\nexport function useComponent<\r\n TStruct extends ComponentStruct = ComponentStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n>(componentDef: ComponentDef<TStruct, TMsgHeaders>, params: ComponentParams<TStruct>) {\r\n const ref = useLazyRef(() => createComponent(componentDef, params));\r\n useLayoutEffect(() => {\r\n return () => {\r\n ref.current = null;\r\n };\r\n }, []); // [params]?\r\n return ref.current;\r\n}\r\n\r\n// asFC/toFC\r\nexport function getFC<TStruct extends ComponentStruct>(\r\n factory: (params: ComponentParams<TStruct>) => Component<TStruct>,\r\n): FC<ComponentParams<TStruct>> {\r\n const result = (params: ComponentParams<TStruct> & PropsWithChildren) => {\r\n // componentHook\r\n const c = factory(params); // without useRef!\r\n // return c.view();\r\n return <c.View {...params} />;\r\n };\r\n return result;\r\n}\r\n\r\n// TODO:\r\n// do not observe props with \"_\", \"$\" prefixes\r\n"],"names":["capitalize","name","cleanSourceRef","sourceRef","createComponent","componentDef","params","component","model","regType","getComponentSourceByCaller","view","msgBus","bindings","componentMsgBus","lazy","getComponentMsgBus","headers","msgBroker","context","useComponentContext","ViewFC","observer","props","parentId","id","key","toHtmlId","useLayoutEffect","getGlobalFlags","hierarchyId","registerMsgBroker","err","useEffect","content","React","errDetails","scopeContext","useMemo","ReactComponentContext","children","value","ChildViewFC","c","isBinding","proxyEventHandlers","prop","oldValue","newValue","result","handler","resolveOnGetEventHandler","$ON_GET","resolveOnChangingEventHandler","$ON_CHANGING","resolveOnChangeEventHandler","$ON_CHANGE","annotationMap","observable","createRecursiveProxy","effects","fn","createEffect","useComponent","ref","useLazyRef","getFC","factory"],"mappings":"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"}
1
+ {"version":3,"file":"react.es.js","sources":["../../src/componentModel/react.tsx"],"sourcesContent":["import React, { useEffect, useLayoutEffect, useMemo, useRef } from 'react';\r\nimport { Mutable } from '@actdim/utico/typeCore';\r\nimport { observer } from 'mobx-react-lite';\r\nimport { action, observable } from 'mobx';\r\nimport { useLazyRef } from '@/reactHooks';\r\nimport { getGlobalFlags } from '@/globals';\r\nimport { ReactComponentContext, useComponentContext } from './componentContext';\r\nimport {\r\n Binding,\r\n Component,\r\n ComponentChildren,\r\n ComponentDef,\r\n ComponentModel,\r\n ComponentMsgHeaders,\r\n ComponentParams,\r\n ComponentRegistryContext,\r\n ComponentStruct,\r\n ComponentViewImplFn,\r\n ComponentViewProps,\r\n EffectController,\r\n EffectFn,\r\n ValueChangeHandler,\r\n ValueChangingHandler,\r\n} from './contracts';\r\nimport { $ON_CHANGE, $ON_CHANGING, $ON_GET, $isBinding, ComponentMsgFilter } from './contracts';\r\nimport { lazy } from '@actdim/utico/utils';\r\nimport {\r\n createEffect,\r\n createRecursiveProxy,\r\n getComponentSourceByCaller,\r\n getComponentMsgBus,\r\n isBinding,\r\n ProxyEventHandlers,\r\n registerMsgBroker,\r\n toHtmlId,\r\n} from './core';\r\n\r\nfunction capitalize(name: string) {\r\n return name.replace(/^./, name[0].toUpperCase());\r\n}\r\n\r\nfunction cleanSourceRef(sourceRef: string) {\r\n // remove origin\r\n return sourceRef.replace(/^[a-z][a-z0-9+.-]*:\\/\\/[^\\/]+/, '');\r\n}\r\n\r\nfunction createComponent<TStruct extends ComponentStruct = ComponentStruct>(\r\n componentDef: ComponentDef<TStruct>,\r\n context: ComponentRegistryContext,\r\n params?: ComponentParams<TStruct>,\r\n): Component<TStruct> {\r\n // result\r\n let component: Mutable<Component<TStruct>>;\r\n let model: Mutable<ComponentModel<TStruct>>;\r\n\r\n if (!componentDef) {\r\n componentDef = {};\r\n }\r\n\r\n let regType = componentDef.regType;\r\n if (!regType) {\r\n regType = getComponentSourceByCaller(6);\r\n // type = getComponentNameByCaller(6);\r\n regType = cleanSourceRef(regType);\r\n // throw new Error('Valid component definition is required');\r\n }\r\n\r\n if (!params) {\r\n params = {};\r\n }\r\n\r\n const view = componentDef.view;\r\n let msgBus = componentDef.msgBus;\r\n\r\n const bindings = new Map<PropertyKey, Binding>();\r\n\r\n const componentMsgBus = lazy(() => {\r\n return getComponentMsgBus(msgBus, (headers) => {\r\n if (headers?.sourceId == undefined) {\r\n headers.sourceId = component.id;\r\n }\r\n }); // as ComponentModel<TStruct>['msgBus']\r\n });\r\n\r\n let msgBroker = {\r\n ...componentDef.msgBroker,\r\n };\r\n\r\n if (!msgBroker.abortController) {\r\n msgBroker.abortController = new AbortController();\r\n }\r\n\r\n const ViewFC = observer((props: ComponentViewProps) => {\r\n const context = useComponentContext();\r\n const parentId = context.currentId;\r\n\r\n component.parentId = parentId;\r\n\r\n if (!msgBus) {\r\n msgBus = context.msgBus;\r\n }\r\n\r\n if (!component.id) {\r\n let id = params.$id;\r\n if (!id) {\r\n const key = params.$key;\r\n if (key) {\r\n id = `${toHtmlId(regType)}#${key}`;\r\n } else {\r\n id = context.getNextId(regType);\r\n }\r\n }\r\n component.id = id;\r\n }\r\n\r\n useLayoutEffect(() => {\r\n try {\r\n context.register(component.id, regType, parentId);\r\n\r\n if (getGlobalFlags().debug) {\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>layout`);\r\n }\r\n\r\n registerMsgBroker(component);\r\n\r\n componentDef.events?.onLayout?.(component);\r\n params.onLayout?.(component);\r\n } catch (err) {\r\n componentDef.events?.onError?.(component, err);\r\n params.onError?.(component, err);\r\n }\r\n\r\n return () => {\r\n if (getGlobalFlags().debug) {\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>layout-destroy`);\r\n }\r\n context.unregister(component.id);\r\n\r\n msgBroker.abortController?.abort();\r\n\r\n componentDef.events?.onLayoutDestroy?.(component);\r\n params.onLayoutDestroy?.(component);\r\n };\r\n }, [componentDef, params, context]);\r\n\r\n useEffect(() => {\r\n try {\r\n if (getGlobalFlags().debug) {\r\n // mount\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>ready`);\r\n }\r\n componentDef.events?.onReady?.(component);\r\n params.onReady?.(component);\r\n } catch (err) {\r\n if (getGlobalFlags().debug) {\r\n // unmount\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>destroy`);\r\n }\r\n componentDef.events?.onError?.(component, err);\r\n params.onError?.(component, err);\r\n }\r\n return () => {\r\n componentDef.events?.onDestroy?.(component);\r\n params.onDestroy?.(component);\r\n };\r\n }, [componentDef, params, context]);\r\n\r\n let content: React.ReactNode;\r\n // let content: any;\r\n try {\r\n if (getGlobalFlags().debug) {\r\n // render\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>view`);\r\n }\r\n if (typeof view === 'function') {\r\n content = view(props, component);\r\n } else {\r\n // content = props.children;\r\n content = <>{props.children}</>;\r\n }\r\n } catch (err) {\r\n // throw err;\r\n const errDetails = JSON.stringify(err);\r\n // msgBus.send\r\n content = <>{errDetails}</>;\r\n }\r\n const scopeContext = useMemo(\r\n () => ({ ...context, currentId: component.id }),\r\n [componentDef, params, context],\r\n );\r\n return (\r\n <ReactComponentContext.Provider value={scopeContext}>\r\n {content}\r\n </ReactComponentContext.Provider>\r\n );\r\n });\r\n\r\n const children = {} as ComponentChildren<TStruct['children']>;\r\n\r\n model = {} as Mutable<ComponentModel<TStruct>>;\r\n\r\n if (componentDef.props) {\r\n Object.assign(model, componentDef.props);\r\n }\r\n\r\n if (componentDef.actions) {\r\n Object.assign(model, componentDef.actions);\r\n }\r\n\r\n if (componentDef.children) {\r\n for (const [key, value] of Object.entries(componentDef.children)) {\r\n if (typeof value == 'function') {\r\n const view = value as (params: any) => Component;\r\n const ChildViewFC: ComponentViewImplFn<TStruct> = (props) => {\r\n const c = view(props);\r\n return <c.View />;\r\n // if (typeof c.view === \"function\") {\r\n // return c.view(props);\r\n // }\r\n // return <>{props.children}</>;\r\n };\r\n Reflect.set(children, capitalize(key), ChildViewFC);\r\n } else {\r\n Reflect.set(children, key, value);\r\n }\r\n }\r\n }\r\n\r\n // Reflect.ownKeys/Object.keys\r\n for (const [key, value] of Object.entries(params)) {\r\n // model.hasOwnProperty(key)\r\n if (key in model) {\r\n if (isBinding(value)) {\r\n bindings.set(key, value);\r\n } else {\r\n Reflect.set(model, key, value);\r\n }\r\n }\r\n }\r\n\r\n const proxyEventHandlers: Pick<ProxyEventHandlers, 'onPropChanging' | 'onPropChange'> = {\r\n onPropChanging:\r\n params.onPropChanging || componentDef.events?.onPropChanging\r\n ? (prop, oldValue, newValue) => {\r\n let result = true;\r\n let handler = params.onPropChanging;\r\n if (handler) {\r\n result = handler(String(prop), oldValue, newValue);\r\n }\r\n if (result) {\r\n handler = componentDef.events?.onPropChanging;\r\n if (handler) {\r\n result = handler(String(prop), oldValue, newValue);\r\n }\r\n }\r\n return result;\r\n }\r\n : undefined,\r\n onPropChange:\r\n params.onPropChange || componentDef.events?.onPropChange\r\n ? (prop, value) => {\r\n params.onPropChange?.(String(prop), value);\r\n componentDef.events?.onPropChange?.(String(prop), value);\r\n }\r\n : undefined,\r\n };\r\n\r\n function resolveOnGetEventHandler(prop: string) {\r\n const key = `${$ON_GET}${capitalize(prop)}`;\r\n return params[key] || componentDef.events?.[key];\r\n }\r\n\r\n function resolveOnChangingEventHandler(prop: string) {\r\n const key = `${$ON_CHANGING}${capitalize(prop)}`;\r\n return ((oldValue: any, newValue: any) => {\r\n let result = true;\r\n let handler = params[key] as ValueChangingHandler<any>;\r\n if (handler) {\r\n result = handler(oldValue, newValue);\r\n }\r\n if (result) {\r\n handler = componentDef.events?.[key] as ValueChangingHandler<any>;\r\n if (handler) {\r\n result = handler(oldValue, newValue);\r\n }\r\n }\r\n return result;\r\n }) as ValueChangingHandler;\r\n }\r\n\r\n function resolveOnChangeEventHandler(prop: string) {\r\n const key = `${$ON_CHANGE}${capitalize(prop)}`;\r\n return ((value: any) => {\r\n (params[key] as ValueChangeHandler<any>)?.(value);\r\n (componentDef.events?.[key] as ValueChangeHandler<any>)?.(value);\r\n }) as ValueChangeHandler;\r\n }\r\n\r\n let annotationMap: Record<string, any> = {};\r\n\r\n if (componentDef.props) {\r\n for (const prop of Object.keys(componentDef.props)) {\r\n proxyEventHandlers[prop] = {\r\n onGet: resolveOnGetEventHandler(prop),\r\n onChanging: resolveOnChangingEventHandler(prop),\r\n onChange: resolveOnChangeEventHandler(prop),\r\n };\r\n }\r\n\r\n for (const key of Object.keys(componentDef.props)) {\r\n annotationMap[key] = observable.deep;\r\n }\r\n }\r\n\r\n if (componentDef.actions) {\r\n const annotationMap: Record<string, any> = {};\r\n for (const key of Object.keys(componentDef.actions)) {\r\n annotationMap[key] = action;\r\n }\r\n }\r\n\r\n model = observable(model, annotationMap, {\r\n deep: true,\r\n });\r\n\r\n model = createRecursiveProxy(model, bindings, proxyEventHandlers);\r\n\r\n let effects: Record<string, EffectController> = {};\r\n component = {\r\n id: params.$id,\r\n key: params.$key,\r\n regType: regType,\r\n parentId: undefined,\r\n getHierarchyId: () => context.getHierarchyPath(component.id),\r\n getChainDown: () => context.getChainDown(component.id),\r\n getChainUp: () => context.getChainUp(component.id),\r\n getChildren: () => context.getChildren(component.id),\r\n getParent: () => context.getParent(component.id),\r\n getNodeMap: () => context.getNodeMap(),\r\n bindings: bindings,\r\n get msgBus() {\r\n return componentMsgBus();\r\n },\r\n msgBroker: msgBroker,\r\n effects: effects,\r\n // view: componentDef.view,\r\n View: ViewFC,\r\n children: children,\r\n model: model,\r\n };\r\n\r\n if (componentDef.effects) {\r\n for (const [name, fn] of Object.entries(componentDef.effects)) {\r\n effects[name] = createEffect(\r\n component,\r\n name,\r\n fn as EffectFn<TStruct, ComponentMsgHeaders>,\r\n );\r\n }\r\n }\r\n\r\n if (componentDef.events?.onInit) {\r\n componentDef.events.onInit(component);\r\n }\r\n\r\n if (params.onInit) {\r\n params.onInit(component);\r\n }\r\n\r\n return component;\r\n}\r\n\r\nexport function useComponent<\r\n TStruct extends ComponentStruct = ComponentStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n>(componentDef: ComponentDef<TStruct, TMsgHeaders>, params: ComponentParams<TStruct>) {\r\n const context = useComponentContext();\r\n const ref = useLazyRef(() => createComponent(componentDef, context, params));\r\n useLayoutEffect(() => {\r\n return () => {\r\n ref.current = null;\r\n };\r\n }, []); // [params]?\r\n return ref.current;\r\n}\r\n\r\n// asFC/toFC\r\nexport function getFC<TStruct extends ComponentStruct>(\r\n factory: (params: ComponentParams<TStruct>) => Component<TStruct>,\r\n): React.FC<ComponentParams<TStruct>> {\r\n const result = (params: ComponentParams<TStruct> & React.PropsWithChildren) => {\r\n // componentHook\r\n const c = factory(params);\r\n // return c.view();\r\n return <c.View {...params} />;\r\n };\r\n return result;\r\n}\r\n\r\n// TODO:\r\n// do not observe props with \"_\", \"$\" prefixes\r\n"],"names":["capitalize","name","cleanSourceRef","sourceRef","createComponent","componentDef","context","params","component","model","regType","getComponentSourceByCaller","view","msgBus","bindings","componentMsgBus","lazy","getComponentMsgBus","headers","msgBroker","ViewFC","observer","props","useComponentContext","parentId","id","key","toHtmlId","useLayoutEffect","getGlobalFlags","hierarchyId","registerMsgBroker","err","useEffect","content","React","errDetails","scopeContext","useMemo","ReactComponentContext","children","value","ChildViewFC","c","isBinding","proxyEventHandlers","prop","oldValue","newValue","result","handler","resolveOnGetEventHandler","$ON_GET","resolveOnChangingEventHandler","$ON_CHANGING","resolveOnChangeEventHandler","$ON_CHANGE","annotationMap","observable","createRecursiveProxy","effects","fn","createEffect","useComponent","ref","useLazyRef","getFC","factory"],"mappings":"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"}
@@ -12,6 +12,6 @@ type Struct = ComponentStruct<BaseAppMsgStruct, {
12
12
  }>;
13
13
  export declare const useNavService: (params: ComponentParams<Struct>) => Component<Struct>;
14
14
  export type NavServiceStruct = Struct;
15
- export declare const NavService: FC<ComponentParams<TStruct>>;
15
+ export declare const NavService: React.FC<ComponentParams<Struct>>;
16
16
  export {};
17
17
  //# sourceMappingURL=NavService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NavService.d.ts","sourceRoot":"","sources":["../../../src/services/react/NavService.tsx"],"names":[],"mappings":"AAQA,OAAO,EACH,kBAAkB,EAClB,gBAAgB,EAChB,UAAU,EACV,SAAS,EACZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EACR,SAAS,EAGT,eAAe,EACf,eAAe,EAClB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAE1C,KAAK,MAAM,GAAG,eAAe,CACzB,gBAAgB,EAChB;IACI,KAAK,EAAE,iBAAiB,GAAG;QACvB,OAAO,EAAE,UAAU,EAAE,CAAC;QACtB,MAAM,EAAE,SAAS,CAAC;KACrB,CAAC;IACF,QAAQ,EAAE;QACN,OAAO,EAAE,kBAAkB,CACrB,cAAc,GACd,qBAAqB,GACrB,sBAAsB,GACtB,yBAAyB,CAC9B,CAAC;KACL,CAAC;CACL,CACJ,CAAC;AAIF,eAAO,MAAM,aAAa,GAAI,QAAQ,eAAe,CAAC,MAAM,CAAC,sBA+E5D,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC;AACtC,eAAO,MAAM,UAAU,8BAAuB,CAAC"}
1
+ {"version":3,"file":"NavService.d.ts","sourceRoot":"","sources":["../../../src/services/react/NavService.tsx"],"names":[],"mappings":"AAQA,OAAO,EACH,kBAAkB,EAClB,gBAAgB,EAChB,UAAU,EACV,SAAS,EACZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EACR,SAAS,EAGT,eAAe,EACf,eAAe,EAClB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAE1C,KAAK,MAAM,GAAG,eAAe,CACzB,gBAAgB,EAChB;IACI,KAAK,EAAE,iBAAiB,GAAG;QACvB,OAAO,EAAE,UAAU,EAAE,CAAC;QACtB,MAAM,EAAE,SAAS,CAAC;KACrB,CAAC;IACF,QAAQ,EAAE;QACN,OAAO,EAAE,kBAAkB,CACrB,cAAc,GACd,qBAAqB,GACrB,sBAAsB,GACtB,yBAAyB,CAC9B,CAAC;KACL,CAAC;CACL,CACJ,CAAC;AAIF,eAAO,MAAM,aAAa,GAAI,QAAQ,eAAe,CAAC,MAAM,CAAC,sBA+E5D,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC;AACtC,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAwB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"NavService.es.js","sources":["../../../src/services/react/NavService.tsx"],"sourcesContent":["import {\r\n To,\r\n useLocation,\r\n useNavigate,\r\n useNavigationType,\r\n useParams,\r\n useSearchParams,\r\n} from 'react-router-dom';\r\nimport {\r\n BaseAppMsgChannels,\r\n BaseAppMsgStruct,\r\n NavContext,\r\n NavRoutes,\r\n} from '@/appDomain/appContracts';\r\nimport type {\r\n Component,\r\n ComponentDef,\r\n ComponentModel,\r\n ComponentParams,\r\n ComponentStruct,\r\n} from '@/componentModel/contracts';\r\nimport { getFC, useComponent } from '@/componentModel/react';\r\nimport { PropsWithChildren } from 'react';\r\n\r\ntype Struct = ComponentStruct<\r\n BaseAppMsgStruct,\r\n {\r\n props: PropsWithChildren & {\r\n history: NavContext[];\r\n routes: NavRoutes;\r\n };\r\n msgScope: {\r\n provide: BaseAppMsgChannels<\r\n | 'APP.NAV.GOTO'\r\n | 'APP.NAV.CONTEXT.GET'\r\n | 'APP.NAV.HISTORY.READ'\r\n | 'APP.NAV.CONTEXT.CHANGED'\r\n >;\r\n };\r\n }\r\n>;\r\n\r\n// const store = new PersistentStore('history');\r\n\r\nexport const useNavService = (params: ComponentParams<Struct>) => {\r\n let c: Component<Struct>;\r\n let m: ComponentModel<Struct>;\r\n\r\n const navigate = useNavigate();\r\n\r\n const location = useLocation();\r\n const navType = useNavigationType();\r\n const nvaParams = useParams();\r\n const [searchParams] = useSearchParams();\r\n\r\n const def: ComponentDef<Struct> = {\r\n props: {\r\n history: [],\r\n routes: undefined,\r\n },\r\n msgBroker: {\r\n provide: {\r\n 'APP.NAV.GOTO': {\r\n in: {\r\n callback: async (msg) => {\r\n navigate(msg.payload as To);\r\n },\r\n },\r\n ex: {\r\n callback: async (msg) => {\r\n const route = msg.payload.route;\r\n navigate(m.routes[route].path(msg.payload.params));\r\n },\r\n },\r\n },\r\n 'APP.NAV.CONTEXT.GET': {\r\n in: {\r\n callback: (msg) => {\r\n return m.history[m.history.length - 1];\r\n },\r\n },\r\n },\r\n 'APP.NAV.HISTORY.READ': {\r\n in: {\r\n callback: (msg) => {\r\n return m.history[m.history.length - 1];\r\n },\r\n },\r\n },\r\n 'APP.NAV.CONTEXT.CHANGED': {},\r\n },\r\n },\r\n events: {\r\n onLayout: (c) => {\r\n const history = m.history;\r\n if (history) {\r\n const ctx = {\r\n location: location,\r\n searchParams: searchParams,\r\n params: nvaParams,\r\n navType: navType,\r\n };\r\n history.push(ctx);\r\n c.msgBus.send({\r\n channel: 'APP.NAV.CONTEXT.CHANGED',\r\n group: 'in',\r\n payload: ctx,\r\n });\r\n }\r\n },\r\n },\r\n view: () => {\r\n return null;\r\n },\r\n };\r\n\r\n c = useComponent(def, params);\r\n m = c.model;\r\n\r\n // deps\r\n // location, navType, params, searchParams\r\n\r\n return c;\r\n};\r\n\r\nexport type NavServiceStruct = Struct;\r\nexport const NavService = getFC(useNavService);\r\n"],"names":["useNavService","params","c","m","navigate","useNavigate","location","useLocation","navType","useNavigationType","nvaParams","useParams","searchParams","useSearchParams","useComponent","msg","route","history","ctx","NavService","getFC"],"mappings":";;AA4CO,MAAMA,IAAgB,CAACC,MAAoC;AAC9D,MAAIC,GACAC;AAEJ,QAAMC,IAAWC,EAAA,GAEXC,IAAWC,EAAA,GACXC,IAAUC,EAAA,GACVC,IAAYC,EAAA,GACZ,CAACC,CAAY,IAAIC,EAAA;AA+DvB,SAAAX,IAAIY,EA7D8B;AAAA,IAC9B,OAAO;AAAA,MACH,SAAS,CAAA;AAAA,MACT,QAAQ;AAAA,IAAA;AAAA,IAEZ,WAAW;AAAA,MACP,SAAS;AAAA,QACL,gBAAgB;AAAA,UACZ,IAAI;AAAA,YACA,UAAU,OAAOC,MAAQ;AACrB,cAAAX,EAASW,EAAI,OAAa;AAAA,YAC9B;AAAA,UAAA;AAAA,UAEJ,IAAI;AAAA,YACA,UAAU,OAAOA,MAAQ;AACrB,oBAAMC,IAAQD,EAAI,QAAQ;AAC1B,cAAAX,EAASD,EAAE,OAAOa,CAAK,EAAE,KAAKD,EAAI,QAAQ,MAAM,CAAC;AAAA,YACrD;AAAA,UAAA;AAAA,QACJ;AAAA,QAEJ,uBAAuB;AAAA,UACnB,IAAI;AAAA,YACA,UAAU,CAACA,MACAZ,EAAE,QAAQA,EAAE,QAAQ,SAAS,CAAC;AAAA,UACzC;AAAA,QACJ;AAAA,QAEJ,wBAAwB;AAAA,UACpB,IAAI;AAAA,YACA,UAAU,CAACY,MACAZ,EAAE,QAAQA,EAAE,QAAQ,SAAS,CAAC;AAAA,UACzC;AAAA,QACJ;AAAA,QAEJ,2BAA2B,CAAA;AAAA,MAAC;AAAA,IAChC;AAAA,IAEJ,QAAQ;AAAA,MACJ,UAAU,CAACD,MAAM;AACb,cAAMe,IAAUd,EAAE;AAClB,YAAIc,GAAS;AACT,gBAAMC,IAAM;AAAA,YACR,UAAAZ;AAAA,YACA,cAAAM;AAAA,YACA,QAAQF;AAAA,YACR,SAAAF;AAAA,UAAA;AAEJ,UAAAS,EAAQ,KAAKC,CAAG,GAChBhB,EAAE,OAAO,KAAK;AAAA,YACV,SAAS;AAAA,YACT,OAAO;AAAA,YACP,SAASgB;AAAA,UAAA,CACZ;AAAA,QACL;AAAA,MACJ;AAAA,IAAA;AAAA,IAEJ,MAAM,MACK;AAAA,EACX,GAGkBjB,CAAM,GAC5BE,IAAID,EAAE,OAKCA;AACX,GAGaiB,IAAaC,EAAMpB,CAAa;"}
1
+ {"version":3,"file":"NavService.es.js","sources":["../../../src/services/react/NavService.tsx"],"sourcesContent":["import {\r\n To,\r\n useLocation,\r\n useNavigate,\r\n useNavigationType,\r\n useParams,\r\n useSearchParams,\r\n} from 'react-router-dom';\r\nimport {\r\n BaseAppMsgChannels,\r\n BaseAppMsgStruct,\r\n NavContext,\r\n NavRoutes,\r\n} from '@/appDomain/appContracts';\r\nimport type {\r\n Component,\r\n ComponentDef,\r\n ComponentModel,\r\n ComponentParams,\r\n ComponentStruct,\r\n} from '@/componentModel/contracts';\r\nimport { getFC, useComponent } from '@/componentModel/react';\r\nimport { PropsWithChildren } from 'react';\r\n\r\ntype Struct = ComponentStruct<\r\n BaseAppMsgStruct,\r\n {\r\n props: PropsWithChildren & {\r\n history: NavContext[];\r\n routes: NavRoutes;\r\n };\r\n msgScope: {\r\n provide: BaseAppMsgChannels<\r\n | 'APP.NAV.GOTO'\r\n | 'APP.NAV.CONTEXT.GET'\r\n | 'APP.NAV.HISTORY.READ'\r\n | 'APP.NAV.CONTEXT.CHANGED'\r\n >;\r\n };\r\n }\r\n>;\r\n\r\n// const store = new PersistentStore('history');\r\n\r\nexport const useNavService = (params: ComponentParams<Struct>) => {\r\n let c: Component<Struct>;\r\n let m: ComponentModel<Struct>;\r\n\r\n const navigate = useNavigate();\r\n\r\n const location = useLocation();\r\n const navType = useNavigationType();\r\n const nvaParams = useParams();\r\n const [searchParams] = useSearchParams();\r\n\r\n const def: ComponentDef<Struct> = {\r\n props: {\r\n history: [],\r\n routes: undefined,\r\n },\r\n msgBroker: {\r\n provide: {\r\n 'APP.NAV.GOTO': {\r\n in: {\r\n callback: async (msg) => {\r\n navigate(msg.payload as To);\r\n },\r\n },\r\n ex: {\r\n callback: async (msg) => {\r\n const route = msg.payload.route;\r\n navigate(m.routes[route].path(msg.payload.params));\r\n },\r\n },\r\n },\r\n 'APP.NAV.CONTEXT.GET': {\r\n in: {\r\n callback: (msg) => {\r\n return m.history[m.history.length - 1];\r\n },\r\n },\r\n },\r\n 'APP.NAV.HISTORY.READ': {\r\n in: {\r\n callback: (msg) => {\r\n return m.history[m.history.length - 1];\r\n },\r\n },\r\n },\r\n 'APP.NAV.CONTEXT.CHANGED': {},\r\n },\r\n },\r\n events: {\r\n onLayout: (c) => {\r\n const history = m.history;\r\n if (history) {\r\n const ctx = {\r\n location: location,\r\n searchParams: searchParams,\r\n params: nvaParams,\r\n navType: navType,\r\n };\r\n history.push(ctx);\r\n c.msgBus.send({\r\n channel: 'APP.NAV.CONTEXT.CHANGED',\r\n group: 'in',\r\n payload: ctx,\r\n });\r\n }\r\n },\r\n },\r\n view: () => {\r\n return null;\r\n },\r\n };\r\n\r\n c = useComponent(def, params);\r\n m = c.model;\r\n\r\n // deps\r\n // location, navType, params, searchParams\r\n\r\n return c;\r\n};\r\n\r\nexport type NavServiceStruct = Struct;\r\nexport const NavService: React.FC<ComponentParams<Struct>> = getFC(useNavService);\r\n"],"names":["useNavService","params","c","m","navigate","useNavigate","location","useLocation","navType","useNavigationType","nvaParams","useParams","searchParams","useSearchParams","useComponent","msg","route","history","ctx","NavService","getFC"],"mappings":";;AA4CO,MAAMA,IAAgB,CAACC,MAAoC;AAC9D,MAAIC,GACAC;AAEJ,QAAMC,IAAWC,EAAA,GAEXC,IAAWC,EAAA,GACXC,IAAUC,EAAA,GACVC,IAAYC,EAAA,GACZ,CAACC,CAAY,IAAIC,EAAA;AA+DvB,SAAAX,IAAIY,EA7D8B;AAAA,IAC9B,OAAO;AAAA,MACH,SAAS,CAAA;AAAA,MACT,QAAQ;AAAA,IAAA;AAAA,IAEZ,WAAW;AAAA,MACP,SAAS;AAAA,QACL,gBAAgB;AAAA,UACZ,IAAI;AAAA,YACA,UAAU,OAAOC,MAAQ;AACrB,cAAAX,EAASW,EAAI,OAAa;AAAA,YAC9B;AAAA,UAAA;AAAA,UAEJ,IAAI;AAAA,YACA,UAAU,OAAOA,MAAQ;AACrB,oBAAMC,IAAQD,EAAI,QAAQ;AAC1B,cAAAX,EAASD,EAAE,OAAOa,CAAK,EAAE,KAAKD,EAAI,QAAQ,MAAM,CAAC;AAAA,YACrD;AAAA,UAAA;AAAA,QACJ;AAAA,QAEJ,uBAAuB;AAAA,UACnB,IAAI;AAAA,YACA,UAAU,CAACA,MACAZ,EAAE,QAAQA,EAAE,QAAQ,SAAS,CAAC;AAAA,UACzC;AAAA,QACJ;AAAA,QAEJ,wBAAwB;AAAA,UACpB,IAAI;AAAA,YACA,UAAU,CAACY,MACAZ,EAAE,QAAQA,EAAE,QAAQ,SAAS,CAAC;AAAA,UACzC;AAAA,QACJ;AAAA,QAEJ,2BAA2B,CAAA;AAAA,MAAC;AAAA,IAChC;AAAA,IAEJ,QAAQ;AAAA,MACJ,UAAU,CAACD,MAAM;AACb,cAAMe,IAAUd,EAAE;AAClB,YAAIc,GAAS;AACT,gBAAMC,IAAM;AAAA,YACR,UAAAZ;AAAA,YACA,cAAAM;AAAA,YACA,QAAQF;AAAA,YACR,SAAAF;AAAA,UAAA;AAEJ,UAAAS,EAAQ,KAAKC,CAAG,GAChBhB,EAAE,OAAO,KAAK;AAAA,YACV,SAAS;AAAA,YACT,OAAO;AAAA,YACP,SAASgB;AAAA,UAAA,CACZ;AAAA,QACL;AAAA,MACJ;AAAA,IAAA;AAAA,IAEJ,MAAM,MACK;AAAA,EACX,GAGkBjB,CAAM,GAC5BE,IAAID,EAAE,OAKCA;AACX,GAGaiB,IAAgDC,EAAMpB,CAAa;"}
@@ -11,6 +11,6 @@ type Struct = ComponentStruct<BaseAppMsgStruct, {
11
11
  }>;
12
12
  export declare const useStorageService: (params: ComponentParams<Struct>) => Component<Struct>;
13
13
  export type StorageServiceStruct = Struct;
14
- export declare const StorageService: FC<ComponentParams<TStruct>>;
14
+ export declare const StorageService: React.FC<ComponentParams<Struct>>;
15
15
  export {};
16
16
  //# sourceMappingURL=StorageService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StorageService.d.ts","sourceRoot":"","sources":["../../../src/services/react/StorageService.tsx"],"names":[],"mappings":"AAAA,OAAO,EACH,eAAe,EACf,eAAe,EACf,SAAS,EAGZ,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAE1C,KAAK,MAAM,GAAG,eAAe,CACzB,gBAAgB,EAChB;IACI,KAAK,EAAE,iBAAiB,GAAG;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,QAAQ,EAAE;QACN,OAAO,EAAE,kBAAkB,CAAC,eAAe,GAAG,eAAe,GAAG,kBAAkB,CAAC,CAAC;KACvF,CAAC;CACL,CACJ,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,eAAe,CAAC,MAAM,CAAC,sBA+DhE,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAC1C,eAAO,MAAM,cAAc,8BAA2B,CAAC"}
1
+ {"version":3,"file":"StorageService.d.ts","sourceRoot":"","sources":["../../../src/services/react/StorageService.tsx"],"names":[],"mappings":"AAAA,OAAO,EACH,eAAe,EACf,eAAe,EACf,SAAS,EAGZ,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAE1C,KAAK,MAAM,GAAG,eAAe,CACzB,gBAAgB,EAChB;IACI,KAAK,EAAE,iBAAiB,GAAG;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,QAAQ,EAAE;QACN,OAAO,EAAE,kBAAkB,CAAC,eAAe,GAAG,eAAe,GAAG,kBAAkB,CAAC,CAAC;KACvF,CAAC;CACL,CACJ,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,eAAe,CAAC,MAAM,CAAC,sBA+DhE,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAC1C,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAA4B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"StorageService.es.js","sources":["../../../src/services/react/StorageService.tsx"],"sourcesContent":["import {\r\n ComponentParams,\r\n ComponentStruct,\r\n Component,\r\n ComponentModel,\r\n ComponentDef,\r\n} from '@/componentModel/contracts';\r\nimport { getFC, useComponent } from '@/componentModel/react';\r\nimport { PersistentStore } from '@actdim/utico/store/persistentStore';\r\nimport { BaseAppMsgChannels, BaseAppMsgStruct } from '@/appDomain/appContracts';\r\nimport { PropsWithChildren } from 'react';\r\n\r\ntype Struct = ComponentStruct<\r\n BaseAppMsgStruct,\r\n {\r\n props: PropsWithChildren & {\r\n storeName?: string;\r\n };\r\n msgScope: {\r\n provide: BaseAppMsgChannels<'APP.STORE.GET' | 'APP.STORE.SET' | 'APP.STORE.REMOVE'>;\r\n };\r\n }\r\n>;\r\n\r\nexport const useStorageService = (params: ComponentParams<Struct>) => {\r\n let c: Component<Struct>;\r\n let m: ComponentModel<Struct>;\r\n\r\n async function _updateStoreAsync() {\r\n store = await PersistentStore.open(m.storeName);\r\n }\r\n\r\n let store: PersistentStore;\r\n let ready: () => void;\r\n const init = new Promise<void>((res) => {\r\n ready = res;\r\n });\r\n\r\n const def: ComponentDef<Struct> = {\r\n props: {\r\n storeName: '',\r\n },\r\n msgBroker: {\r\n provide: {\r\n 'APP.STORE.GET': {\r\n in: {\r\n callback: async (msg) => {\r\n await init;\r\n const item = await store.get(msg.payload.key);\r\n return item?.data.value;\r\n },\r\n },\r\n },\r\n 'APP.STORE.SET': {\r\n in: {\r\n callback: async (msg) => {\r\n await init;\r\n await store.set(\r\n {\r\n key: msg.payload.key,\r\n },\r\n msg.payload.value,\r\n );\r\n },\r\n },\r\n },\r\n 'APP.STORE.REMOVE': {\r\n in: {\r\n callback: async (msg) => {\r\n await init;\r\n await store.delete(msg.payload.key);\r\n },\r\n },\r\n },\r\n },\r\n },\r\n events: {\r\n onChangeStoreName: () => {\r\n _updateStoreAsync();\r\n },\r\n },\r\n };\r\n\r\n c = useComponent(def, params);\r\n m = c.model;\r\n _updateStoreAsync().then(() => ready());\r\n return c;\r\n};\r\n\r\nexport type StorageServiceStruct = Struct;\r\nexport const StorageService = getFC(useStorageService);\r\n"],"names":["useStorageService","params","c","m","_updateStoreAsync","store","PersistentStore","ready","init","res","useComponent","msg","StorageService","getFC"],"mappings":";;AAwBO,MAAMA,IAAoB,CAACC,MAAoC;AAClE,MAAIC,GACAC;AAEJ,iBAAeC,IAAoB;AAC/B,IAAAC,IAAQ,MAAMC,EAAgB,KAAKH,EAAE,SAAS;AAAA,EAClD;AAEA,MAAIE,GACAE;AACJ,QAAMC,IAAO,IAAI,QAAc,CAACC,MAAQ;AACpC,IAAAF,IAAQE;AAAA,EACZ,CAAC;AA+CD,SAAAP,IAAIQ,EA7C8B;AAAA,IAC9B,OAAO;AAAA,MACH,WAAW;AAAA,IAAA;AAAA,IAEf,WAAW;AAAA,MACP,SAAS;AAAA,QACL,iBAAiB;AAAA,UACb,IAAI;AAAA,YACA,UAAU,OAAOC,OACb,MAAMH,IACO,MAAMH,EAAM,IAAIM,EAAI,QAAQ,GAAG,IAC/B,KAAK;AAAA,UACtB;AAAA,QACJ;AAAA,QAEJ,iBAAiB;AAAA,UACb,IAAI;AAAA,YACA,UAAU,OAAOA,MAAQ;AACrB,oBAAMH,GACN,MAAMH,EAAM;AAAA,gBACR;AAAA,kBACI,KAAKM,EAAI,QAAQ;AAAA,gBAAA;AAAA,gBAErBA,EAAI,QAAQ;AAAA,cAAA;AAAA,YAEpB;AAAA,UAAA;AAAA,QACJ;AAAA,QAEJ,oBAAoB;AAAA,UAChB,IAAI;AAAA,YACA,UAAU,OAAOA,MAAQ;AACrB,oBAAMH,GACN,MAAMH,EAAM,OAAOM,EAAI,QAAQ,GAAG;AAAA,YACtC;AAAA,UAAA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,IAEJ,QAAQ;AAAA,MACJ,mBAAmB,MAAM;AACrB,QAAAP,EAAA;AAAA,MACJ;AAAA,IAAA;AAAA,EACJ,GAGkBH,CAAM,GAC5BE,IAAID,EAAE,OACNE,IAAoB,KAAK,MAAMG,GAAO,GAC/BL;AACX,GAGaU,IAAiBC,EAAMb,CAAiB;"}
1
+ {"version":3,"file":"StorageService.es.js","sources":["../../../src/services/react/StorageService.tsx"],"sourcesContent":["import {\r\n ComponentParams,\r\n ComponentStruct,\r\n Component,\r\n ComponentModel,\r\n ComponentDef,\r\n} from '@/componentModel/contracts';\r\nimport { getFC, useComponent } from '@/componentModel/react';\r\nimport { PersistentStore } from '@actdim/utico/store/persistentStore';\r\nimport { BaseAppMsgChannels, BaseAppMsgStruct } from '@/appDomain/appContracts';\r\nimport { PropsWithChildren } from 'react';\r\n\r\ntype Struct = ComponentStruct<\r\n BaseAppMsgStruct,\r\n {\r\n props: PropsWithChildren & {\r\n storeName?: string;\r\n };\r\n msgScope: {\r\n provide: BaseAppMsgChannels<'APP.STORE.GET' | 'APP.STORE.SET' | 'APP.STORE.REMOVE'>;\r\n };\r\n }\r\n>;\r\n\r\nexport const useStorageService = (params: ComponentParams<Struct>) => {\r\n let c: Component<Struct>;\r\n let m: ComponentModel<Struct>;\r\n\r\n async function _updateStoreAsync() {\r\n store = await PersistentStore.open(m.storeName);\r\n }\r\n\r\n let store: PersistentStore;\r\n let ready: () => void;\r\n const init = new Promise<void>((res) => {\r\n ready = res;\r\n });\r\n\r\n const def: ComponentDef<Struct> = {\r\n props: {\r\n storeName: '',\r\n },\r\n msgBroker: {\r\n provide: {\r\n 'APP.STORE.GET': {\r\n in: {\r\n callback: async (msg) => {\r\n await init;\r\n const item = await store.get(msg.payload.key);\r\n return item?.data.value;\r\n },\r\n },\r\n },\r\n 'APP.STORE.SET': {\r\n in: {\r\n callback: async (msg) => {\r\n await init;\r\n await store.set(\r\n {\r\n key: msg.payload.key,\r\n },\r\n msg.payload.value,\r\n );\r\n },\r\n },\r\n },\r\n 'APP.STORE.REMOVE': {\r\n in: {\r\n callback: async (msg) => {\r\n await init;\r\n await store.delete(msg.payload.key);\r\n },\r\n },\r\n },\r\n },\r\n },\r\n events: {\r\n onChangeStoreName: () => {\r\n _updateStoreAsync();\r\n },\r\n },\r\n };\r\n\r\n c = useComponent(def, params);\r\n m = c.model;\r\n _updateStoreAsync().then(() => ready());\r\n return c;\r\n};\r\n\r\nexport type StorageServiceStruct = Struct;\r\nexport const StorageService: React.FC<ComponentParams<Struct>> = getFC(useStorageService);\r\n"],"names":["useStorageService","params","c","m","_updateStoreAsync","store","PersistentStore","ready","init","res","useComponent","msg","StorageService","getFC"],"mappings":";;AAwBO,MAAMA,IAAoB,CAACC,MAAoC;AAClE,MAAIC,GACAC;AAEJ,iBAAeC,IAAoB;AAC/B,IAAAC,IAAQ,MAAMC,EAAgB,KAAKH,EAAE,SAAS;AAAA,EAClD;AAEA,MAAIE,GACAE;AACJ,QAAMC,IAAO,IAAI,QAAc,CAACC,MAAQ;AACpC,IAAAF,IAAQE;AAAA,EACZ,CAAC;AA+CD,SAAAP,IAAIQ,EA7C8B;AAAA,IAC9B,OAAO;AAAA,MACH,WAAW;AAAA,IAAA;AAAA,IAEf,WAAW;AAAA,MACP,SAAS;AAAA,QACL,iBAAiB;AAAA,UACb,IAAI;AAAA,YACA,UAAU,OAAOC,OACb,MAAMH,IACO,MAAMH,EAAM,IAAIM,EAAI,QAAQ,GAAG,IAC/B,KAAK;AAAA,UACtB;AAAA,QACJ;AAAA,QAEJ,iBAAiB;AAAA,UACb,IAAI;AAAA,YACA,UAAU,OAAOA,MAAQ;AACrB,oBAAMH,GACN,MAAMH,EAAM;AAAA,gBACR;AAAA,kBACI,KAAKM,EAAI,QAAQ;AAAA,gBAAA;AAAA,gBAErBA,EAAI,QAAQ;AAAA,cAAA;AAAA,YAEpB;AAAA,UAAA;AAAA,QACJ;AAAA,QAEJ,oBAAoB;AAAA,UAChB,IAAI;AAAA,YACA,UAAU,OAAOA,MAAQ;AACrB,oBAAMH,GACN,MAAMH,EAAM,OAAOM,EAAI,QAAQ,GAAG;AAAA,YACtC;AAAA,UAAA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,IAEJ,QAAQ;AAAA,MACJ,mBAAmB,MAAM;AACrB,QAAAP,EAAA;AAAA,MACJ;AAAA,IAAA;AAAA,EACJ,GAGkBH,CAAM,GAC5BE,IAAID,EAAE,OACNE,IAAoB,KAAK,MAAMG,GAAO,GAC/BL;AACX,GAGaU,IAAoDC,EAAMb,CAAiB;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actdim/dynstruct",
3
- "version": "1.1.8",
3
+ "version": "1.2.2",
4
4
  "description": "A type-safe component system for large-scale apps: explicit dependencies, message bus communication, and structure-first, declarative design",
5
5
  "author": "Pavel Borodaev",
6
6
  "license": "Proprietary",