@actdim/dynstruct 1.0.5 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/appDomain/appContracts.d.ts +1 -1
  2. package/dist/appDomain/appContracts.es.js.map +1 -1
  3. package/dist/componentModel/DynamicContent.d.ts +2 -5
  4. package/dist/componentModel/DynamicContent.d.ts.map +1 -1
  5. package/dist/componentModel/DynamicContent.es.js +7 -6
  6. package/dist/componentModel/DynamicContent.es.js.map +1 -1
  7. package/dist/componentModel/adapters.d.ts +13 -0
  8. package/dist/componentModel/adapters.d.ts.map +1 -0
  9. package/dist/componentModel/adapters.es.js +30 -0
  10. package/dist/componentModel/adapters.es.js.map +1 -0
  11. package/dist/componentModel/componentContext.es.js +1 -1
  12. package/dist/componentModel/componentModel.d.ts +55 -43
  13. package/dist/componentModel/componentModel.d.ts.map +1 -1
  14. package/dist/componentModel/componentModel.es.js +257 -225
  15. package/dist/componentModel/componentModel.es.js.map +1 -1
  16. package/dist/componentModel/scope.d.ts +3 -6
  17. package/dist/componentModel/scope.d.ts.map +1 -1
  18. package/dist/componentModel/scope.es.js +2 -2
  19. package/dist/componentModel/scope.es.js.map +1 -1
  20. package/dist/net/request.d.ts +2 -2
  21. package/dist/net/request.d.ts.map +1 -1
  22. package/dist/net/request.es.js.map +1 -1
  23. package/dist/services/NavService.d.ts +4 -5
  24. package/dist/services/NavService.d.ts.map +1 -1
  25. package/dist/services/NavService.es.js +26 -27
  26. package/dist/services/NavService.es.js.map +1 -1
  27. package/dist/services/ServiceProvider.d.ts +6 -0
  28. package/dist/services/ServiceProvider.d.ts.map +1 -0
  29. package/dist/services/ServiceProvider.es.js +17 -0
  30. package/dist/services/ServiceProvider.es.js.map +1 -0
  31. package/dist/services/StorageService.d.ts +4 -4
  32. package/dist/services/StorageService.d.ts.map +1 -1
  33. package/dist/services/StorageService.es.js +13 -12
  34. package/dist/services/StorageService.es.js.map +1 -1
  35. package/package.json +3 -3
  36. package/dist/appDomain/adapters.d.ts +0 -10
  37. package/dist/appDomain/adapters.d.ts.map +0 -1
  38. package/dist/appDomain/adapters.es.js +0 -25
  39. package/dist/appDomain/adapters.es.js.map +0 -1
  40. package/dist/appDomain/reactHooks.d.ts +0 -6
  41. package/dist/appDomain/reactHooks.d.ts.map +0 -1
  42. package/dist/appDomain/reactHooks.es.js +0 -12
  43. package/dist/appDomain/reactHooks.es.js.map +0 -1
  44. package/dist/dist/componentModel/componentContext.es.es.js +0 -15
  45. package/dist/dist/componentModel/componentContext.es.es.js.map +0 -1
  46. package/dist/dist/componentModel/componentModel.es.es.js +0 -260
  47. package/dist/dist/componentModel/componentModel.es.es.js.map +0 -1
  48. package/dist/dist/globals.es.es.js +0 -10
  49. package/dist/dist/globals.es.es.js.map +0 -1
  50. package/dist/dist/reactHooks.es.es.js +0 -9
  51. package/dist/dist/reactHooks.es.es.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"componentModel.es.js","sources":["../../src/componentModel/componentModel.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\r\nimport { PropsWithChildren, useEffect, useLayoutEffect, FC, ReactNode } from 'react';\r\nimport {\r\n $CG_IN,\r\n $CG_OUT,\r\n $TypeArgHeaders,\r\n $TypeArgStruct,\r\n Msg,\r\n MsgBus,\r\n MsgProviderParams,\r\n MsgStruct,\r\n MsgSubscriberParams,\r\n OutStruct,\r\n} from '@actdim/msgmesh/msgBusCore';\r\nimport { MaybePromise, SafeKey, Skip } from '@actdim/utico/typeCore';\r\nimport { observer } from 'mobx-react-lite';\r\nimport { observable, runInAction } from 'mobx';\r\nimport { useLazyRef } from '@/reactHooks';\r\nimport { getGlobalFlags } from '@/globals';\r\nimport { ReactComponentContext, useComponentContext } from './componentContext';\r\nimport { ComponentMsgHeaders, TreeNode } from './contracts';\r\nimport { lazy } from '@actdim/utico/utils';\r\n\r\nexport enum ComponentMsgFilter {\r\n None = 0,\r\n // AcceptFrom...\r\n FromAncestors = 1 << 0,\r\n FromDescendants = 1 << 1,\r\n}\r\n\r\nexport type MsgChannelGroupProviderParams<\r\n TStruct extends MsgStruct = MsgStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN, // keyof TStruct[TChannel]\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n TScope = any,\r\n> = Skip<\r\n MsgProviderParams<TStruct, TChannel, TGroup>,\r\n 'channel' | 'group' | 'callback' | 'filter'\r\n> & {\r\n // resolve\r\n callback?: (\r\n msgIn: Msg<TStruct, TChannel, TGroup, TMsgHeaders>,\r\n headers: TMsgHeaders,\r\n scope: TScope,\r\n ) => MaybePromise<OutStruct<TStruct, TChannel>>;\r\n filter?: (msg: Msg<TStruct, TChannel, TGroup, TMsgHeaders>, scope: TScope) => boolean;\r\n componentFilter?: ComponentMsgFilter;\r\n};\r\n\r\nexport type MsgChannelGroupSubscriberParams<\r\n TStruct extends MsgStruct = MsgStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN, // keyof TStruct[TChannel]\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n TScope = any,\r\n> = Skip<\r\n MsgSubscriberParams<TStruct, TChannel, TGroup>,\r\n 'channel' | 'group' | 'callback' | 'filter'\r\n> & {\r\n callback?: (msg: Msg<TStruct, TChannel, TGroup, TMsgHeaders>, scope: TScope) => void;\r\n filter?: (msg: Msg<TStruct, TChannel, TGroup, TMsgHeaders>, scope: TScope) => boolean;\r\n componentFilter?: ComponentMsgFilter;\r\n};\r\n\r\n// MsgScope\r\nexport type MsgBrokerScope<\r\n TStruct extends MsgStruct /*= MsgStruct*/,\r\n TKeysToProvide extends keyof TStruct = keyof TStruct,\r\n TKeysToSubscribe extends keyof TStruct = keyof TStruct,\r\n TKeysToPublish extends keyof TStruct = keyof TStruct,\r\n> = {\r\n provide?: TKeysToProvide;\r\n // consume\r\n subscribe?: TKeysToSubscribe;\r\n // produce\r\n publish?: TKeysToPublish;\r\n};\r\n\r\nexport type ComponentPropStruct = Record<string, any>;\r\n// export type ComponentPropStruct = {\r\n// [prop: string]: any;\r\n// };\r\n\r\nexport type ComponentMethodStruct = Record<string, Function>;\r\n// export type ComponentMethodStruct = {\r\n// [action: string]: Function;\r\n// };\r\n\r\n// export type ComponentRefStruct = Record<string, ComponentStruct<TMsgStruct, T>>;\r\nexport type ComponentRefStruct = {\r\n [name: string]: ComponentStruct | ((params: any) => ComponentStruct);\r\n};\r\n\r\nexport type ComponentStructBase<\r\n TMsgStruct extends MsgStruct = MsgStruct,\r\n TPropStruct extends ComponentPropStruct = ComponentPropStruct,\r\n TMsgScope extends MsgBrokerScope<TMsgStruct> = MsgBrokerScope<TMsgStruct>,\r\n> = {\r\n props?: TPropStruct;\r\n methods?: ComponentMethodStruct;\r\n children?: ComponentRefStruct;\r\n msgScope?: TMsgScope;\r\n};\r\n\r\n// ComponentShape\r\nexport type ComponentStruct<\r\n TMsgStruct extends MsgStruct = MsgStruct,\r\n T extends ComponentStructBase<TMsgStruct> = ComponentStructBase<TMsgStruct>,\r\n // TMsgBus extends MsgBus<MsgStruct> = MsgBus<MsgStruct>,\r\n // T extends ComponentStructBase<TMsgBus[typeof $TypeArgStruct]> = ComponentStructBase<\r\n // TMsgBus[typeof $TypeArgStruct]\r\n // >,\r\n> = T & {\r\n msgBus: TMsgStruct;\r\n // msgBus: TMsgBus;\r\n};\r\n\r\nexport type MsgBroker<\r\n TStructToProvide extends MsgStruct = MsgStruct,\r\n TStructToSubscribe extends MsgStruct = MsgStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n TScope = any,\r\n> = {\r\n // providers\r\n provide?: {\r\n [TChannel in keyof TStructToProvide]: {\r\n [TGroup in keyof Skip<\r\n TStructToProvide[TChannel],\r\n typeof $CG_OUT\r\n >]?: MsgChannelGroupProviderParams<\r\n TStructToProvide,\r\n TChannel,\r\n TGroup,\r\n TMsgHeaders,\r\n TScope\r\n >;\r\n };\r\n };\r\n // subscribers\r\n subscribe?: {\r\n [TChannel in keyof TStructToSubscribe]: {\r\n [TGroup in keyof TStructToSubscribe[TChannel]]?: MsgChannelGroupSubscriberParams<\r\n TStructToSubscribe,\r\n TChannel,\r\n TGroup,\r\n TMsgHeaders,\r\n TScope\r\n >;\r\n };\r\n };\r\n abortController?: AbortController;\r\n};\r\n\r\ntype ValueConverter<TTo, TFrom> = {\r\n // ConvertFrom\r\n convert(value: TFrom): TTo;\r\n // ConvertTo\r\n convertBack(value: TTo): TFrom;\r\n};\r\n\r\ntype ValidationResult = {\r\n valid: boolean;\r\n message: string;\r\n};\r\n\r\ntype Validator<T> = {\r\n options: {\r\n blur: boolean;\r\n };\r\n validate: (value: T) => MaybePromise<ValidationResult>;\r\n};\r\n\r\nconst $isBinding = Symbol('$isBinding'); // brand\r\n\r\nclass Binding<T = any, TFrom = any> {\r\n // getter\r\n readonly get: () => T;\r\n // setter\r\n readonly set: (value: T) => void;\r\n readonly converter: ValueConverter<T, TFrom>;\r\n readonly validator: Validator<T>;\r\n readonly readOnly: boolean;\r\n constructor(\r\n get: () => T,\r\n set?: (value: T) => void,\r\n converter?: ValueConverter<T, TFrom>,\r\n validator?: Validator<T>,\r\n ) {\r\n this.get = get;\r\n this.set = set;\r\n this.converter = converter;\r\n this.validator = validator;\r\n this.readOnly = !!set;\r\n this[$isBinding] = true;\r\n }\r\n [$isBinding]: boolean;\r\n}\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) {\r\n return new Binding(get, set, converter, validator);\r\n}\r\n\r\nexport function bindProp<T extends object, P extends keyof T>(target: () => T, prop: P) {\r\n return new Binding(\r\n () => target()[prop],\r\n (value: T[P]) => {\r\n target()[prop] = value;\r\n },\r\n );\r\n}\r\n\r\nexport type ComponentPropSource<T> = T | Binding<T>;\r\n\r\nexport type ComponentPropParams<TPropStruct extends ComponentPropStruct> = {\r\n [P in keyof TPropStruct]?: ComponentPropSource<TPropStruct[P]>;\r\n};\r\n\r\n// const $ON_PROP_CHANGING = \"onPropChanging\";\r\n// const $ON_PROP_CHANGE = \"onPropChange\";\r\n\r\nconst $ON_GET = 'onGet';\r\n// const $ON_BEFORE_SET = \"onBeforeSet\";\r\nconst $ON_CHANGING = 'onChanging';\r\nconst $ON_CHANGE = 'onChange';\r\n// const $ON_SET = \"onSet\";\r\n\r\ntype PropValueChangingHandler<TProp = PropKey> = (\r\n prop: TProp,\r\n oldValue: any,\r\n newValue: any,\r\n) => boolean;\r\ntype PropValueChangeHandler<TProp = PropKey> = (prop: TProp, value: any) => void;\r\n\r\n// BeforeValueSetHandler\r\ntype ValueChangingHandler<T = any> = (oldValue: T, newValue: T) => boolean;\r\n// ValueSetHandler\r\ntype ValueChangeHandler<T = any> = (value: T) => void;\r\n\r\ntype ComponentEvents<TStruct extends ComponentStruct = ComponentStruct> = {\r\n onPropChanging?: PropValueChangingHandler<keyof TStruct['props']>;\r\n onPropChange?: PropValueChangeHandler<keyof TStruct['props']>;\r\n onInit?: (model: ComponentModel<TStruct>) => void;\r\n onLayout?: (model: ComponentModel<TStruct>) => void;\r\n onReady?: (model: ComponentModel<TStruct>) => void;\r\n onLayoutDestroy?: (model: ComponentModel<TStruct>) => void; // onLayoutCleanup\r\n onDestroy?: (model: ComponentModel<TStruct>) => void; // onDispose/onCleanup\r\n onError?: (model: ComponentModel<TStruct>, error: any) => void;\r\n} & {\r\n [P in keyof TStruct['props'] as `${typeof $ON_GET}${Capitalize<P & string>}`]?: () => TStruct['props'][P];\r\n} & {\r\n [P in keyof TStruct['props'] as `${typeof $ON_CHANGING}${Capitalize<P & string>}`]?: ValueChangingHandler<\r\n TStruct['props']\r\n >;\r\n} & {\r\n [P in keyof TStruct['props'] as `${typeof $ON_CHANGE}${Capitalize<P & string>}`]?: ValueChangeHandler<\r\n TStruct['props']\r\n >;\r\n};\r\n\r\n// AllHTMLAttributes<JSX.Element>\r\n\r\ntype ComponentViewProps = {\r\n render?: boolean;\r\n} & PropsWithChildren;\r\n\r\n// ComponentRenderImplFn\r\ntype ComponentViewImplFn<\r\n TStruct extends ComponentStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n> = (props: ComponentViewProps, model?: ComponentModel<TStruct, TMsgHeaders>) => ReactNode; // JSX.Element\r\n\r\n// ComponentRenderFn\r\ntype ComponentViewFn = (props: ComponentViewProps) => ReactNode; // JSX.Element\r\n\r\ntype PublicKeys<T> = {\r\n [K in keyof T]: K extends `_${string}` ? never : K;\r\n}[keyof T];\r\n\r\nexport type ComponentMsgBroker<\r\n TStruct extends ComponentStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n> = MsgBroker<\r\n Pick<TStruct['msgBus'], SafeKey<TStruct['msgBus'], TStruct['msgScope']['provide']>>,\r\n Pick<TStruct['msgBus'], SafeKey<TStruct['msgBus'], TStruct['msgScope']['subscribe']>>,\r\n // Pick<\r\n // TStruct['msgBus'][typeof $TypeArgStruct],\r\n // SafeKey<TStruct['msgBus'][typeof $TypeArgStruct], TStruct['msgScope']['provide']>\r\n // >,\r\n // Pick<\r\n // TStruct['msgBus'][typeof $TypeArgStruct],\r\n // SafeKey<TStruct['msgBus'][typeof $TypeArgStruct], TStruct['msgScope']['subscribe']>\r\n // >,\r\n // TStruct['msgBus'][typeof $TypeArgHeaders],\r\n TMsgHeaders,\r\n // ComponentModel<TStruct, TStruct['msgBus'][typeof $TypeArgHeaders]>\r\n ComponentModel<TStruct, TMsgHeaders>\r\n>;\r\n\r\nexport type Component<\r\n TStruct extends ComponentStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n> = {\r\n name?: string;\r\n props?: TStruct['props'];\r\n methods?: TStruct['methods'];\r\n children?: ComponentChildren<TStruct['children']>;\r\n events?: ComponentEvents<TStruct>;\r\n // msgs?\r\n msgBroker?: ComponentMsgBroker<TStruct, TMsgHeaders>;\r\n msgBus?: MsgBus<TStruct['msgBus'], TMsgHeaders>;\r\n // msgBus?: TStruct['msgBus'];\r\n view?: ComponentViewImplFn<TStruct, TMsgHeaders>;\r\n};\r\n\r\ntype ComponentChildren<TRefStruct extends ComponentRefStruct> = {\r\n [P in keyof TRefStruct]: TRefStruct[P] extends (params: infer TParams) => infer T\r\n ? T extends ComponentStruct\r\n ? (params: TParams) => ComponentModel<T>\r\n : never\r\n : TRefStruct[P] extends ComponentStruct\r\n ? ComponentModel<TRefStruct[P]>\r\n : never;\r\n};\r\n\r\ntype ComponentModelChildren<TRefStruct extends ComponentRefStruct> = {\r\n [P in keyof TRefStruct as TRefStruct[P] extends Function\r\n ? `${Capitalize<P & string>}`\r\n : P]: TRefStruct[P] extends (params: infer TParams) => infer T\r\n ? T extends ComponentStruct\r\n ? FC<ComponentParams<T> & TParams>\r\n : never\r\n : TRefStruct[P] extends ComponentStruct\r\n ? ComponentModel<TRefStruct[P]>\r\n : never;\r\n};\r\n\r\nexport type ComponentModelContext = {\r\n bindings?: Map<PropKey, Binding>;\r\n id: string;\r\n parentId: string;\r\n // getHierarchyPath?\r\n getHierarchyId(): string;\r\n getParent: () => string | undefined;\r\n getChildren: () => string[];\r\n getChainUp: () => string[];\r\n getChainDown: () => string[];\r\n getNodeMap: () => Map<string, TreeNode>;\r\n};\r\n\r\nexport type ComponentMsgStruct<TStruct extends ComponentStruct = ComponentStruct> = Pick<\r\n TStruct['msgBus'],\r\n | SafeKey<TStruct['msgBus'], TStruct['msgScope']['provide']>\r\n | SafeKey<TStruct['msgBus'], TStruct['msgScope']['subscribe']>\r\n | SafeKey<TStruct['msgBus'], TStruct['msgScope']['publish']>\r\n // TStruct['msgBus'][typeof $TypeArgStruct],\r\n // | SafeKey<TStruct['msgBus'][typeof $TypeArgStruct], TStruct['msgScope']['provide']>\r\n // | SafeKey<TStruct['msgBus'][typeof $TypeArgStruct], TStruct['msgScope']['subscribe']>\r\n // | SafeKey<TStruct['msgBus'][typeof $TypeArgStruct], TStruct['msgScope']['publish']>\r\n>;\r\n\r\nexport type ComponentModelBase<\r\n TStruct extends ComponentStruct = ComponentStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n> = {\r\n msgBus: MsgBus<\r\n // TStruct[\"msgBus\"]\r\n // TStruct[\"msgBus\"][typeof $TypeArgStruct],\r\n ComponentMsgStruct<TStruct>,\r\n // TStruct['msgBus'][typeof $TypeArgHeaders]\r\n TMsgHeaders\r\n >;\r\n msgBroker: ComponentMsgBroker<TStruct>;\r\n View: ComponentViewFn;\r\n $: Readonly<ComponentModelContext>;\r\n};\r\n\r\nexport type ComponentModel<\r\n TStruct extends ComponentStruct = ComponentStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n> = TStruct['props'] &\r\n Readonly<TStruct['methods']> &\r\n Readonly<ComponentModelChildren<TStruct['children']>> &\r\n Readonly<ComponentModelBase<TStruct, TMsgHeaders>>;\r\n\r\n// style: CSSProperties;\r\n\r\ntype PropEventHandlers = {\r\n onGet?: () => any;\r\n onChanging?: (oldValue: any, newValue: any) => boolean;\r\n onChange?: (value: any) => void;\r\n};\r\n\r\ntype PropKey = string | symbol;\r\ntype ProxyEventHandlers = {\r\n onPropChanging?: PropValueChangingHandler<PropKey>;\r\n onPropChange?: PropValueChangeHandler<PropKey>;\r\n} & Record<PropKey, PropEventHandlers>;\r\n\r\n// ComponentConfig\r\nexport type ComponentParams<TStruct extends ComponentStruct = ComponentStruct> =\r\n ComponentPropParams<TStruct['props']> & ComponentEvents<TStruct>; // & PropsWithChildren\r\n\r\nconst blankView = () => null;\r\n\r\nfunction createProxy(\r\n state: any,\r\n bindings: Map<PropKey, Binding>,\r\n proxyEventHandlers: ProxyEventHandlers,\r\n) {\r\n const onPropChanging = proxyEventHandlers.onPropChanging;\r\n const onPropChange = proxyEventHandlers.onPropChange;\r\n return new Proxy(state, {\r\n get(obj, prop, receiver) {\r\n const onGet = proxyEventHandlers[prop]?.onGet;\r\n if (onGet) {\r\n return onGet();\r\n }\r\n\r\n const binding = bindings.get(String(prop));\r\n if (binding) {\r\n let value: any = undefined;\r\n value = binding.get();\r\n return value;\r\n }\r\n return Reflect.get(obj, prop, receiver);\r\n },\r\n set(obj, prop, value, receiver) {\r\n const oldValue = obj[prop];\r\n\r\n const onChanging = proxyEventHandlers[prop]?.onChanging;\r\n if (onChanging) {\r\n const shouldChange = onChanging(oldValue, value);\r\n if (!shouldChange) {\r\n return true;\r\n }\r\n }\r\n\r\n if (onPropChanging) {\r\n const shouldChange = onPropChanging(prop, oldValue, value);\r\n if (!shouldChange) {\r\n return true;\r\n }\r\n }\r\n\r\n const result = runInAction(() => {\r\n return Reflect.set(obj, prop, value, receiver);\r\n });\r\n\r\n const binding = bindings.get(prop);\r\n if (binding?.set) {\r\n binding.set(value);\r\n }\r\n\r\n const onChange = proxyEventHandlers[prop]?.onChange;\r\n if (onChange) {\r\n onChange(value);\r\n }\r\n\r\n if (onPropChange) {\r\n onPropChange(prop, value);\r\n }\r\n\r\n return result;\r\n },\r\n });\r\n}\r\n\r\nfunction capitalize(name: string) {\r\n return name.replace(/^./, name[0].toUpperCase());\r\n}\r\n\r\nfunction 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\r\ntype ComponentSourceInfo = {\r\n // classId\r\n structId: string;\r\n count: 0;\r\n};\r\n\r\nconst componentData = {\r\n sources: new Map<string, ComponentSourceInfo>(),\r\n count: 0,\r\n};\r\n\r\nexport function toHtmlId(url: string, segmentsCount: number = 1): string {\r\n const clean = url.split(/[?#]/)[0];\r\n const parts = clean\r\n .split('/')\r\n .filter(Boolean)\r\n .map((segment) => decodeURIComponent(segment));\r\n\r\n const last = parts.slice(-segmentsCount);\r\n const raw = last.join('-');\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(/[+#]$/, '-');\r\n return id;\r\n}\r\n\r\nfunction getCallerFileName(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) return null;\r\n\r\n const match = stack[depth].match(/\\((.*):\\d+:\\d+\\)/);\r\n if (match) {\r\n return match[1];\r\n }\r\n return null;\r\n}\r\n\r\nfunction registerMsgBroker<TStruct extends ComponentStruct = ComponentStruct>(\r\n model: ComponentModel<TStruct>,\r\n) {\r\n const providers = model?.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, model);\r\n };\r\n }\r\n const filter = provider.filter;\r\n const componentFilter = provider.componentFilter || ComponentMsgFilter.None;\r\n const msgFilter = (msg) => {\r\n let result = true;\r\n if (componentFilter & ComponentMsgFilter.FromAncestors) {\r\n const ancestorIds = model.$.getChainUp();\r\n result = ancestorIds.indexOf(msg.headers?.sourceId) >= 0;\r\n }\r\n if (result && componentFilter & ComponentMsgFilter.FromDescendants) {\r\n const ancestorIds = model.$.getChainDown();\r\n result = ancestorIds.indexOf(msg.headers?.sourceId) >= 0;\r\n }\r\n if (result && filter) {\r\n result = filter(msg, model);\r\n }\r\n return result;\r\n };\r\n provider.filter = msgFilter;\r\n\r\n model.msgBus.provide({\r\n ...p,\r\n channel: channel,\r\n group: g,\r\n config: {\r\n abortSignal: model.msgBroker.abortController.signal,\r\n },\r\n });\r\n }\r\n }\r\n }\r\n const subscribers = model?.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, model);\r\n };\r\n }\r\n const filter = subscriber.filter;\r\n const componentFilter = subscriber.componentFilter || ComponentMsgFilter.None;\r\n const msgFilter = (msg) => {\r\n let result = true;\r\n if (componentFilter & ComponentMsgFilter.FromAncestors) {\r\n const ancestorIds = model.$.getChainUp();\r\n result = ancestorIds.indexOf(msg.headers?.sourceId) >= 0;\r\n }\r\n if (result && componentFilter & ComponentMsgFilter.FromDescendants) {\r\n const ancestorIds = model.$.getChainDown();\r\n result = ancestorIds.indexOf(msg.headers?.sourceId) >= 0;\r\n }\r\n if (result && filter) {\r\n result = filter(msg, model);\r\n }\r\n return result;\r\n };\r\n subscriber.filter = msgFilter;\r\n\r\n model.msgBus.on({\r\n ...s,\r\n channel: channel,\r\n group: g,\r\n config: {\r\n abortSignal: model.msgBroker.abortController.signal,\r\n },\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction getComponentMsgBus<TStruct extends ComponentStruct = ComponentStruct>(\r\n msgBus: MsgBus<TStruct['msgBus']>,\r\n modelContext: ComponentModelContext,\r\n) {\r\n // ComponentModel<TStruct>['msgBus']\r\n const updateParams = (params: { headers?: ComponentMsgHeaders }) => {\r\n if (!params.headers) {\r\n params.headers = {};\r\n }\r\n if (params.headers.sourceId == undefined) {\r\n params.headers.sourceId = modelContext.id;\r\n }\r\n };\r\n return {\r\n config: msgBus.config,\r\n on: (params) => {\r\n return msgBus.on(params);\r\n },\r\n onceAsync: (params) => {\r\n return msgBus.onceAsync(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 dispatch: (params) => {\r\n updateParams(params);\r\n return msgBus.dispatch(params);\r\n },\r\n dispatchAsync: (params) => {\r\n updateParams(params);\r\n return msgBus.dispatchAsync(params);\r\n },\r\n } as MsgBus<TStruct['msgBus']>;\r\n}\r\n\r\nfunction createModel<TStruct extends ComponentStruct = ComponentStruct>(\r\n component: Component<TStruct>,\r\n params: ComponentParams<TStruct>,\r\n): ComponentModel<TStruct> {\r\n const bindings = new Map<PropKey, Binding>();\r\n const view = component.view;\r\n\r\n let model: ComponentModel<TStruct>;\r\n\r\n let modelContext: ComponentModelContext;\r\n\r\n let msgBus = component.msgBus;\r\n\r\n const componentMsgBus = lazy(() => {\r\n return getComponentMsgBus(msgBus, modelContext) as ComponentModel<TStruct>['msgBus'];\r\n });\r\n\r\n let msgBroker = {\r\n ...component.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 id = modelContext.id;\r\n const context = useComponentContext();\r\n const parentId = context.currentId;\r\n\r\n modelContext.parentId = parentId;\r\n\r\n if (!msgBus) {\r\n msgBus = context.msgBus;\r\n }\r\n\r\n const scopeContext = useMemo(\r\n () => ({ ...context, currentId: id }),\r\n [component, params, context],\r\n );\r\n\r\n useLayoutEffect(() => {\r\n try {\r\n if (getGlobalFlags().debug) {\r\n const hierarchyId = modelContext.getHierarchyId;\r\n console.debug(`${hierarchyId}>layout`);\r\n }\r\n\r\n context.register(id, parentId);\r\n\r\n modelContext.getHierarchyId = () => context.getHierarchyPath(id);\r\n\r\n modelContext.getChainDown = () => context.getChainDown(id);\r\n modelContext.getChainUp = () => context.getChainUp(id);\r\n modelContext.getChildren = () => context.getChildren(id);\r\n modelContext.getParent = () => context.getParent(id);\r\n modelContext.getNodeMap = () => context.getNodeMap();\r\n\r\n registerMsgBroker(model);\r\n\r\n component.events?.onLayout?.(model);\r\n params?.onLayout?.(model);\r\n } catch (err) {\r\n component.events?.onError?.(model, err);\r\n params?.onError?.(model, err);\r\n }\r\n\r\n return () => {\r\n if (getGlobalFlags().debug) {\r\n const hierarchyId = modelContext.getHierarchyId;\r\n console.debug(`${hierarchyId}>layout-destroy`);\r\n }\r\n context.unregister(id);\r\n\r\n msgBroker.abortController.abort();\r\n\r\n component.events?.onLayoutDestroy?.(model);\r\n params?.onLayoutDestroy?.(model);\r\n };\r\n }, [component, params, context]);\r\n\r\n useEffect(() => {\r\n try {\r\n if (getGlobalFlags().debug) {\r\n // mount\r\n const hierarchyId = modelContext.getHierarchyId;\r\n console.debug(`${hierarchyId}>ready`);\r\n }\r\n component.events?.onReady?.(model);\r\n params?.onReady?.(model);\r\n } catch (err) {\r\n if (getGlobalFlags().debug) {\r\n // unmount\r\n const hierarchyId = modelContext.getHierarchyId;\r\n console.debug(`${hierarchyId}>destroy`);\r\n }\r\n component.events?.onError?.(model, err);\r\n params?.onError?.(model, err);\r\n }\r\n return () => {\r\n component.events?.onDestroy?.(model);\r\n params?.onDestroy?.(model);\r\n };\r\n }, [component, 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 = modelContext.getHierarchyId;\r\n console.debug(`${hierarchyId}>view`);\r\n }\r\n if (typeof view === 'function') {\r\n content = view(props, model);\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.dispatch\r\n content = <>{errDetails}</>;\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 let srcInfo: ComponentSourceInfo;\r\n const sources = componentData.sources;\r\n\r\n const fileName = getCallerFileName(6);\r\n const srcName = toHtmlId(fileName, 2);\r\n\r\n if (sources.has(fileName)) {\r\n srcInfo = sources.get(fileName);\r\n srcInfo.count++;\r\n } else {\r\n const structId = component.name || srcName || `Component_${componentData.count}`;\r\n srcInfo = {\r\n structId: structId,\r\n count: 0,\r\n };\r\n sources.set(fileName, srcInfo);\r\n componentData.count++;\r\n }\r\n\r\n const id = `${srcInfo.structId}#${srcInfo.count}`;\r\n modelContext = {\r\n bindings: bindings,\r\n id: id,\r\n parentId: undefined,\r\n getHierarchyId: () => undefined,\r\n getChainDown: () => undefined,\r\n getChainUp: () => undefined,\r\n getChildren: () => undefined,\r\n getParent: () => undefined,\r\n getNodeMap: () => undefined,\r\n };\r\n\r\n model = {\r\n ...component.props,\r\n ...component.methods,\r\n // view: component.view,\r\n View: ViewFC,\r\n get msgBus() {\r\n return componentMsgBus();\r\n },\r\n msgBroker: msgBroker,\r\n $: modelContext,\r\n };\r\n\r\n if (component.children) {\r\n for (const [key, value] of Object.entries(component.children)) {\r\n if (typeof value == 'function') {\r\n const view = value as (params: any) => ComponentModel;\r\n // observer\r\n const ChildViewFC: ComponentViewImplFn<TStruct> = (props) => {\r\n const model = view(props);\r\n return <model.View />;\r\n // if (typeof model.view === \"function\") {\r\n // return model.view(props);\r\n // }\r\n // return <>{props.children}</>;\r\n };\r\n Reflect.set(model, capitalize(key), ChildViewFC);\r\n } else {\r\n Reflect.set(model, key, value);\r\n }\r\n }\r\n }\r\n\r\n // Reflect.ownKeys\r\n for (const [key, value] of Object.entries(params)) {\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 // decorators\r\n const annotationMap: Record<string, any> = {};\r\n\r\n if (component.props) {\r\n for (const key of Object.keys(component.props)) {\r\n annotationMap[key] = observable.ref;\r\n }\r\n }\r\n if (component.methods) {\r\n for (const key of Object.keys(component.methods)) {\r\n annotationMap[key] = false;\r\n }\r\n }\r\n if (component.children) {\r\n for (const key of Object.keys(component.children)) {\r\n annotationMap[key] = false;\r\n }\r\n }\r\n\r\n // annotationMap[\"view\" satisfies keyof Component<TStruct>] = false;\r\n annotationMap['View' satisfies keyof ComponentModelBase<TStruct>] = false;\r\n annotationMap['msgBus' satisfies keyof ComponentModelBase<TStruct>] = false;\r\n annotationMap['$' satisfies keyof ComponentModelBase<TStruct>] = false;\r\n\r\n const proxyEventHandlers: Pick<ProxyEventHandlers, 'onPropChanging' | 'onPropChange'> = {\r\n onPropChanging:\r\n params?.onPropChanging || component.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 = component.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 || component.events?.onPropChange\r\n ? (prop, value) => {\r\n params.onPropChange?.(String(prop), value);\r\n component.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] || component.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 = component.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 (component.events[key] as ValueChangeHandler<any>)?.(value);\r\n }) as ValueChangeHandler;\r\n }\r\n\r\n if (component.props) {\r\n for (const prop of Object.keys(component.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\r\n model = observable(model, annotationMap, {\r\n deep: true,\r\n });\r\n // model = useLocalObservable(() => model, annotationMap);\r\n\r\n model = createProxy(model, bindings, proxyEventHandlers);\r\n\r\n if (component.events?.onInit) {\r\n component.events.onInit(model);\r\n }\r\n\r\n if (params?.onInit) {\r\n params.onInit(model);\r\n }\r\n\r\n return model;\r\n}\r\n\r\nexport function useComponent<\r\n TStruct extends ComponentStruct = ComponentStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n>(component: Component<TStruct, TMsgHeaders>, params: ComponentParams<TStruct>) {\r\n const ref = useLazyRef(() => createModel(component, params));\r\n useLayoutEffect(() => {\r\n return () => {\r\n ref.current = null;\r\n };\r\n }, [component, 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>) => ComponentModel<TStruct>,\r\n): FC<ComponentParams<TStruct>> {\r\n // observer\r\n const fc = (params: ComponentParams<TStruct> & PropsWithChildren) => {\r\n // modelHook\r\n const model = factory(params); // without useRef!\r\n // return model.view();\r\n return <model.View {...params} />;\r\n // return <ViewerFC {...params} view={model.view} />;\r\n };\r\n return fc;\r\n}\r\n"],"names":["ComponentMsgFilter","$isBinding","Binding","get","set","converter","validator","isBinding","obj","bind","bindProp","target","prop","value","$ON_GET","$ON_CHANGING","$ON_CHANGE","createProxy","state","bindings","proxyEventHandlers","onPropChanging","onPropChange","receiver","onGet","binding","oldValue","onChanging","result","runInAction","onChange","capitalize","name","componentData","toHtmlId","url","segmentsCount","segment","getCallerFileName","depth","stack","match","registerMsgBroker","model","providers","channel","providerGroups","g","p","provider","callback","msg","headers","filter","componentFilter","msgFilter","subscribers","subscriberGroups","s","subscriber","getComponentMsgBus","msgBus","modelContext","updateParams","params","createModel","component","view","componentMsgBus","lazy","msgBroker","ViewFC","observer","props","id","context","useComponentContext","parentId","scopeContext","useMemo","useLayoutEffect","getGlobalFlags","hierarchyId","err","useEffect","content","React","errDetails","ReactComponentContext","srcInfo","sources","fileName","srcName","key","ChildViewFC","annotationMap","observable","newValue","handler","resolveOnGetEventHandler","resolveOnChangingEventHandler","resolveOnChangeEventHandler","useComponent","ref","useLazyRef","getFC","factory"],"mappings":"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"}
1
+ {"version":3,"file":"componentModel.es.js","sources":["../../src/componentModel/componentModel.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\r\nimport { PropsWithChildren, useEffect, useLayoutEffect, FC, ReactNode } from 'react';\r\nimport {\r\n $CG_IN,\r\n $CG_OUT,\r\n $TypeArgHeaders,\r\n $TypeArgStruct,\r\n Msg,\r\n MsgBus,\r\n MsgProviderParams,\r\n MsgStruct,\r\n MsgSubscriberParams,\r\n OutStruct,\r\n} from '@actdim/msgmesh/msgBusCore';\r\nimport {\r\n Extends,\r\n HasKeys,\r\n IF,\r\n IsEmpty,\r\n MaybeKeyOf,\r\n MaybePromise,\r\n Mutable,\r\n Require,\r\n Skip,\r\n} from '@actdim/utico/typeCore';\r\nimport { observer } from 'mobx-react-lite';\r\nimport {\r\n action,\r\n isObservable,\r\n observable,\r\n runInAction,\r\n toJS,\r\n autorun,\r\n IReactionDisposer,\r\n} from 'mobx';\r\nimport { useLazyRef } from '@/reactHooks';\r\nimport { getGlobalFlags } from '@/globals';\r\nimport { ReactComponentContext, useComponentContext } from './componentContext';\r\nimport { ComponentMsgHeaders, TreeNode } from './contracts';\r\nimport { lazy } from '@actdim/utico/utils';\r\nimport { isPlainObject } from 'mobx/dist/internal';\r\n\r\nexport enum ComponentMsgFilter {\r\n None = 0,\r\n // AcceptFrom...\r\n FromAncestors = 1 << 0,\r\n FromDescendants = 1 << 1,\r\n}\r\n\r\nexport type MsgChannelGroupProviderParams<\r\n TStruct extends MsgStruct = MsgStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN, // keyof TStruct[TChannel]\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n TScope = any,\r\n> = Skip<\r\n MsgProviderParams<TStruct, TChannel, TGroup>,\r\n 'channel' | 'group' | 'callback' | 'filter'\r\n> & {\r\n // resolve\r\n callback?: (\r\n msgIn: Msg<TStruct, TChannel, TGroup, TMsgHeaders>,\r\n headers: TMsgHeaders,\r\n scope: TScope,\r\n ) => MaybePromise<OutStruct<TStruct, TChannel>>;\r\n filter?: (msg: Msg<TStruct, TChannel, TGroup, TMsgHeaders>, scope: TScope) => boolean;\r\n componentFilter?: ComponentMsgFilter;\r\n};\r\n\r\nexport type MsgChannelGroupSubscriberParams<\r\n TStruct extends MsgStruct = MsgStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN, // keyof TStruct[TChannel]\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n TScope = any,\r\n> = Skip<\r\n MsgSubscriberParams<TStruct, TChannel, TGroup>,\r\n 'channel' | 'group' | 'callback' | 'filter'\r\n> & {\r\n callback?: (msg: Msg<TStruct, TChannel, TGroup, TMsgHeaders>, scope: TScope) => void;\r\n filter?: (msg: Msg<TStruct, TChannel, TGroup, TMsgHeaders>, scope: TScope) => boolean;\r\n componentFilter?: ComponentMsgFilter;\r\n};\r\n\r\n// MsgScope\r\nexport type MsgBrokerScope<\r\n TStruct extends MsgStruct /*= MsgStruct*/,\r\n TKeysToProvide extends keyof TStruct = keyof TStruct,\r\n TKeysToSubscribe extends keyof TStruct = keyof TStruct,\r\n TKeysToPublish extends keyof TStruct = keyof TStruct,\r\n> = {\r\n provide?: TKeysToProvide;\r\n // consume\r\n subscribe?: TKeysToSubscribe;\r\n // produce\r\n publish?: TKeysToPublish;\r\n};\r\n\r\nexport type ComponentPropStruct = Record<string, any>;\r\n// export type ComponentPropStruct = {\r\n// [prop: string]: any;\r\n// };\r\n\r\nexport type ComponentMethodStruct = Record<string, Function>;\r\n// export type ComponentMethodStruct = {\r\n// [action: string]: Function;\r\n// };\r\n\r\n// export type ComponentRefStruct = Record<string, ComponentStruct<TMsgStruct, T>>;\r\nexport type ComponentRefStruct = {\r\n [name: string]: ComponentStruct | ((params: any) => ComponentStruct);\r\n};\r\n\r\nexport type ComponentStructBase<\r\n TMsgStruct extends MsgStruct = MsgStruct,\r\n TPropStruct extends ComponentPropStruct = ComponentPropStruct,\r\n TMsgScope extends MsgBrokerScope<TMsgStruct> = MsgBrokerScope<TMsgStruct>,\r\n> = {\r\n props?: TPropStruct;\r\n actions?: ComponentMethodStruct;\r\n effects?: string[] | string | undefined;\r\n children?: ComponentRefStruct;\r\n // msgs?\r\n msgScope?: TMsgScope;\r\n};\r\n\r\n// ComponentShape\r\nexport type ComponentStruct<\r\n TMsgStruct extends MsgStruct = MsgStruct,\r\n T extends ComponentStructBase<TMsgStruct> = ComponentStructBase<TMsgStruct>,\r\n> = T & {\r\n msg: TMsgStruct;\r\n};\r\n\r\nexport type MsgBroker<\r\n TStructToProvide extends MsgStruct = MsgStruct,\r\n TStructToSubscribe extends MsgStruct = MsgStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n TScope = any,\r\n> = Require<\r\n {\r\n // providers\r\n provide?: Require<\r\n {\r\n [TChannel in keyof TStructToProvide]: {\r\n [TGroup in keyof Skip<\r\n TStructToProvide[TChannel],\r\n typeof $CG_OUT\r\n >]?: MsgChannelGroupProviderParams<\r\n TStructToProvide,\r\n TChannel,\r\n TGroup,\r\n TMsgHeaders,\r\n TScope\r\n >;\r\n };\r\n },\r\n HasKeys<TStructToProvide>\r\n >;\r\n // subscribers\r\n subscribe?: Require<\r\n {\r\n [TChannel in keyof TStructToSubscribe]: {\r\n [TGroup in keyof TStructToSubscribe[TChannel]]?: MsgChannelGroupSubscriberParams<\r\n TStructToSubscribe,\r\n TChannel,\r\n TGroup,\r\n TMsgHeaders,\r\n TScope\r\n >;\r\n };\r\n },\r\n HasKeys<TStructToSubscribe>\r\n >;\r\n abortController?: AbortController;\r\n },\r\n HasKeys<TStructToProvide & TStructToSubscribe>\r\n>;\r\n\r\ntype ValueConverter<TTo, TFrom> = {\r\n // ConvertFrom\r\n convert(value: TFrom): TTo;\r\n // ConvertTo\r\n convertBack(value: TTo): TFrom;\r\n};\r\n\r\ntype ValidationResult = {\r\n valid: boolean;\r\n message: string;\r\n};\r\n\r\ntype Validator<T> = {\r\n options: {\r\n blur: boolean;\r\n };\r\n validate: (value: T) => MaybePromise<ValidationResult>;\r\n};\r\n\r\nconst $isBinding = Symbol('$isBinding'); // brand\r\n\r\nclass Binding<T = any, TFrom = any> {\r\n // getter\r\n readonly get: () => T;\r\n // setter\r\n readonly set: (value: T) => void;\r\n readonly converter: ValueConverter<T, TFrom>;\r\n readonly validator: Validator<T>;\r\n readonly readOnly: boolean;\r\n constructor(\r\n get: () => T,\r\n set?: (value: T) => void,\r\n converter?: ValueConverter<T, TFrom>,\r\n validator?: Validator<T>,\r\n ) {\r\n this.get = get;\r\n this.set = set;\r\n this.converter = converter;\r\n this.validator = validator;\r\n this.readOnly = !!set;\r\n this[$isBinding] = true;\r\n }\r\n [$isBinding]: boolean;\r\n}\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) {\r\n return new Binding(get, set, converter, validator);\r\n}\r\n\r\nexport function bindProp<T extends object, P extends keyof T>(target: () => T, prop: P) {\r\n return new Binding(\r\n () => target()[prop],\r\n (value: T[P]) => {\r\n target()[prop] = value;\r\n },\r\n );\r\n}\r\n\r\nexport type ComponentPropSource<T> = T | Binding<T>;\r\n\r\nexport type ComponentPropParams<TPropStruct extends ComponentPropStruct> = {\r\n [P in keyof TPropStruct]?: ComponentPropSource<TPropStruct[P]>;\r\n};\r\n\r\n// const $ON_PROP_CHANGING = \"onPropChanging\";\r\n// const $ON_PROP_CHANGE = \"onPropChange\";\r\n\r\nconst $ON_GET = 'onGet';\r\n// const $ON_BEFORE_SET = \"onBeforeSet\";\r\nconst $ON_CHANGING = 'onChanging';\r\nconst $ON_CHANGE = 'onChange';\r\n// const $ON_SET = \"onSet\";\r\n\r\ntype PropValueChangingHandler<TProp = PropertyKey> = (\r\n prop: TProp,\r\n oldValue: any,\r\n newValue: any,\r\n) => boolean;\r\ntype PropValueChangeHandler<TProp = PropertyKey> = (prop: TProp, value: any) => void;\r\n\r\n// BeforeValueSetHandler\r\ntype ValueChangingHandler<T = any> = (oldValue: T, newValue: T) => boolean;\r\n// ValueSetHandler\r\ntype ValueChangeHandler<T = any> = (value: T) => void;\r\n\r\ntype ComponentEvents<TStruct extends ComponentStruct = ComponentStruct> = {\r\n onPropChanging?: PropValueChangingHandler<keyof TStruct['props']>;\r\n onPropChange?: PropValueChangeHandler<keyof TStruct['props']>;\r\n onInit?: (component: Component<TStruct>) => void;\r\n onLayout?: (component: Component<TStruct>) => void;\r\n onReady?: (component: Component<TStruct>) => void;\r\n onLayoutDestroy?: (component: Component<TStruct>) => void; // onLayoutCleanup\r\n onDestroy?: (component: Component<TStruct>) => void; // onDispose/onCleanup\r\n onError?: (component: Component<TStruct>, error: any) => void;\r\n} & {\r\n [P in keyof TStruct['props'] as `${typeof $ON_GET}${Capitalize<P & string>}`]?: () => TStruct['props'][P];\r\n} & {\r\n [P in keyof TStruct['props'] as `${typeof $ON_CHANGING}${Capitalize<P & string>}`]?: ValueChangingHandler<\r\n TStruct['props']\r\n >;\r\n} & {\r\n [P in keyof TStruct['props'] as `${typeof $ON_CHANGE}${Capitalize<P & string>}`]?: ValueChangeHandler<\r\n TStruct['props']\r\n >;\r\n};\r\n\r\n// AllHTMLAttributes<JSX.Element>\r\n\r\ntype ComponentViewProps = {\r\n render?: boolean;\r\n} & PropsWithChildren;\r\n\r\n// ComponentRenderImplFn\r\ntype ComponentViewImplFn<\r\n TStruct extends ComponentStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n> = (props: ComponentViewProps, component?: Component<TStruct, TMsgHeaders>) => ReactNode; // JSX.Element\r\n\r\n// ComponentRenderFn\r\ntype ComponentViewFn = (props: ComponentViewProps) => ReactNode; // JSX.Element\r\n\r\ntype PublicKeys<T> = {\r\n [K in keyof T]: K extends `_${string}` ? never : K;\r\n}[keyof T];\r\n\r\nexport type ComponentMsgBroker<\r\n TStruct extends ComponentStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n> = MsgBroker<\r\n // Pick<TStruct['msg'], MaybeKeyOf<TStruct['msg'], TStruct['msgScope']['provide']>>,\r\n Pick<TStruct['msg'], TStruct['msgScope']['provide']>,\r\n // Pick<TStruct['msg'], MaybeKeyOf<TStruct['msg'], TStruct['msgScope']['subscribe']>>,\r\n Pick<TStruct['msg'], TStruct['msgScope']['subscribe']>,\r\n TMsgHeaders,\r\n Component<TStruct, TMsgHeaders>\r\n>;\r\n\r\nexport type EffectFn<\r\n TStruct extends ComponentStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n> = (component: Component<TStruct, TMsgHeaders>) => void | (() => void);\r\n\r\nexport type ComponentDef<\r\n TStruct extends ComponentStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n> = {\r\n name?: string;\r\n props?: Require<TStruct['props'], HasKeys<TStruct['props']>>;\r\n actions?: Require<TStruct['actions'], HasKeys<TStruct['actions']>>;\r\n effects?: keyof TStruct['effects'] extends never\r\n ? never\r\n : Record<\r\n TStruct['effects'] extends string ? TStruct['effects'] : TStruct['effects'][number],\r\n EffectFn<TStruct, TMsgHeaders>\r\n >;\r\n children?: ComponentDefChildren<TStruct['children']>;\r\n events?: ComponentEvents<TStruct>;\r\n // msgs?\r\n msgBroker?: ComponentMsgBroker<TStruct, TMsgHeaders>;\r\n msgBus?: MsgBus<TStruct['msg'], TMsgHeaders>;\r\n view?: ComponentViewImplFn<TStruct, TMsgHeaders>;\r\n};\r\n\r\ntype ComponentDefChildren<TRefStruct extends ComponentRefStruct> = Require<\r\n {\r\n [P in keyof TRefStruct]: TRefStruct[P] extends (params: infer TParams) => infer T\r\n ? T extends ComponentStruct\r\n ? (params: TParams) => Component<T>\r\n : never\r\n : TRefStruct[P] extends ComponentStruct\r\n ? Component<TRefStruct[P]>\r\n : never;\r\n },\r\n HasKeys<TRefStruct>\r\n>;\r\n\r\ntype ComponentChildren<TRefStruct extends ComponentRefStruct> = {\r\n [P in keyof TRefStruct as TRefStruct[P] extends Function\r\n ? `${Capitalize<P & string>}`\r\n : P]: TRefStruct[P] extends (params: infer TParams) => infer T\r\n ? T extends ComponentStruct\r\n ? FC<ComponentParams<T> & TParams>\r\n : never\r\n : TRefStruct[P] extends ComponentStruct\r\n ? Component<TRefStruct[P]>\r\n : never;\r\n};\r\n\r\nexport type ComponentMsgStruct<TStruct extends ComponentStruct = ComponentStruct> = Pick<\r\n TStruct['msg'],\r\n | MaybeKeyOf<TStruct['msg'], TStruct['msgScope']['provide']>\r\n | MaybeKeyOf<TStruct['msg'], TStruct['msgScope']['subscribe']>\r\n | MaybeKeyOf<TStruct['msg'], TStruct['msgScope']['publish']>\r\n>;\r\n\r\nexport type ComponentBase<\r\n TStruct extends ComponentStruct = ComponentStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n> = {\r\n id: string;\r\n parentId: string;\r\n // getHierarchyPath?\r\n getHierarchyId(): string;\r\n getParent(): string | undefined;\r\n getChildren(): string[];\r\n getChainUp(): string[];\r\n getChainDown(): string[];\r\n getNodeMap(): Map<string, TreeNode>;\r\n bindings: Map<PropertyKey, Binding>;\r\n msgBus: MsgBus<ComponentMsgStruct<TStruct>, TMsgHeaders>;\r\n msgBroker: ComponentMsgBroker<TStruct>;\r\n effects: Record<string, EffectController>;\r\n View: ComponentViewFn;\r\n};\r\n\r\nexport type ComponentModel<TStruct extends ComponentStruct = ComponentStruct> = TStruct['props'] &\r\n Readonly<TStruct['actions']>;\r\n\r\nexport type Component<\r\n TStruct extends ComponentStruct = ComponentStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n> = {\r\n readonly model: ComponentModel<TStruct>;\r\n readonly children: Readonly<ComponentChildren<TStruct['children']>>;\r\n} & Readonly<ComponentBase<TStruct, TMsgHeaders>>;\r\n\r\n// style: CSSProperties;\r\n\r\ntype PropEventHandlers = {\r\n onGet?: () => any;\r\n onChanging?: (oldValue: any, newValue: any) => boolean;\r\n onChange?: (value: any) => void;\r\n};\r\n\r\ntype ProxyEventHandlers = {\r\n onPropChanging?: PropValueChangingHandler<PropertyKey>;\r\n onPropChange?: PropValueChangeHandler<PropertyKey>;\r\n} & Record<PropertyKey, PropEventHandlers>;\r\n\r\n// ComponentConfig\r\nexport type ComponentParams<TStruct extends ComponentStruct = ComponentStruct> =\r\n ComponentPropParams<TStruct['props']> & ComponentEvents<TStruct>; // & PropsWithChildren\r\n\r\nconst blankView = () => null;\r\n\r\nconst proxyCache = new WeakMap<object, any>();\r\nfunction 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\nfunction capitalize(name: string) {\r\n return name.replace(/^./, name[0].toUpperCase());\r\n}\r\n\r\nfunction 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\r\ntype ComponentSourceInfo = {\r\n // classId\r\n structId: string;\r\n count: 0;\r\n};\r\n\r\nconst componentData = {\r\n sources: new Map<string, ComponentSourceInfo>(),\r\n count: 0,\r\n};\r\n\r\nexport function toHtmlId(url: string, segmentsCount: number = 1): string {\r\n const clean = url.split(/[?#]/)[0];\r\n const parts = clean\r\n .split('/')\r\n .filter(Boolean)\r\n .map((segment) => decodeURIComponent(segment));\r\n\r\n const last = parts.slice(-segmentsCount);\r\n const raw = last.join('-');\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(/[+#]$/, '-');\r\n return id;\r\n}\r\n\r\nfunction getCallerFileName(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) return null;\r\n\r\n const match = stack[depth].match(/\\((.*):\\d+:\\d+\\)/);\r\n if (match) {\r\n return match[1];\r\n }\r\n return null;\r\n}\r\n\r\nfunction 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 const msgFilter = (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 ancestorIds = component.getChainDown();\r\n result = ancestorIds.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 provider.filter = msgFilter;\r\n\r\n component.msgBus.provide({\r\n ...p,\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 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 const msgFilter = (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 ancestorIds = component.getChainDown();\r\n result = ancestorIds.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 subscriber.filter = msgFilter;\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\nfunction 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 onceAsync: (params) => {\r\n return msgBus.onceAsync(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 dispatch: (params) => {\r\n updateParams(params);\r\n return msgBus.dispatch(params);\r\n },\r\n dispatchAsync: (params) => {\r\n updateParams(params);\r\n return msgBus.dispatchAsync(params);\r\n },\r\n } as MsgBus<TStruct['msg']>;\r\n}\r\n\r\nexport type EffectController = {\r\n start: () => void;\r\n pause: () => void;\r\n resume: () => void;\r\n stop: () => void;\r\n restart: () => void;\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\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 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 id = component.id;\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 const scopeContext = useMemo(\r\n () => ({ ...context, currentId: id }),\r\n [componentDef, params, context],\r\n );\r\n\r\n useLayoutEffect(() => {\r\n try {\r\n if (getGlobalFlags().debug) {\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>layout`);\r\n }\r\n\r\n context.register(id, parentId);\r\n\r\n component.getHierarchyId = () => context.getHierarchyPath(id);\r\n component.getChainDown = () => context.getChainDown(id);\r\n component.getChainUp = () => context.getChainUp(id);\r\n component.getChildren = () => context.getChildren(id);\r\n component.getParent = () => context.getParent(id);\r\n component.getNodeMap = () => context.getNodeMap();\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(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.dispatch\r\n content = <>{errDetails}</>;\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 let srcInfo: ComponentSourceInfo;\r\n const sources = componentData.sources;\r\n\r\n const fileName = getCallerFileName(6);\r\n const srcName = toHtmlId(fileName, 2);\r\n\r\n if (sources.has(fileName)) {\r\n srcInfo = sources.get(fileName);\r\n srcInfo.count++;\r\n } else {\r\n const structId = componentDef.name || srcName || `Component_${componentData.count}`;\r\n srcInfo = {\r\n structId: structId,\r\n count: 0,\r\n };\r\n sources.set(fileName, srcInfo);\r\n componentData.count++;\r\n }\r\n\r\n const id = `${srcInfo.structId}#${srcInfo.count}`;\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 // observer\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: id,\r\n parentId: undefined,\r\n getHierarchyId: () => undefined,\r\n getChainDown: () => undefined,\r\n getChainUp: () => undefined,\r\n getChildren: () => undefined,\r\n getParent: () => undefined,\r\n getNodeMap: () => undefined,\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 }, [componentDef, 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 // observer\r\n const fc = (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 fc;\r\n}\r\n"],"names":["ComponentMsgFilter","$isBinding","Binding","get","set","converter","validator","isBinding","obj","bind","bindProp","target","prop","value","$ON_GET","$ON_CHANGING","$ON_CHANGE","proxyCache","createRecursiveProxy","bindings","handlers","isObservable","proxy","receiver","onGet","binding","oldValue","onChanging","result","runInAction","capitalize","name","componentData","toHtmlId","url","segmentsCount","segment","getCallerFileName","depth","stack","match","registerMsgBroker","component","providers","channel","providerGroups","g","p","provider","callback","msg","headers","filter","componentFilter","msgFilter","subscribers","subscriberGroups","s","subscriber","getComponentMsgBus","msgBus","headerSetter","updateParams","params","toJS","createEffect","fn","disposer","paused","effectCleanup","start","autorun","cleanup","stop","pause","resume","restart","createComponent","componentDef","model","view","componentMsgBus","lazy","msgBroker","ViewFC","observer","props","id","context","useComponentContext","parentId","scopeContext","useMemo","useLayoutEffect","getGlobalFlags","hierarchyId","err","useEffect","content","React","errDetails","ReactComponentContext","srcInfo","sources","fileName","srcName","children","key","ChildViewFC","c","proxyEventHandlers","newValue","handler","resolveOnGetEventHandler","resolveOnChangingEventHandler","resolveOnChangeEventHandler","annotationMap","observable","effects","useComponent","ref","useLazyRef","getFC","factory"],"mappings":"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"}
@@ -4,10 +4,7 @@ export type IObjectChange<T> = IObjectDidChange & {
4
4
  name: keyof T;
5
5
  object: T;
6
6
  };
7
- export interface IDisposable {
8
- dispose: () => void;
9
- }
10
- export declare class DisposableComponent implements IDisposable {
7
+ export declare class DisposableComponent implements Disposable {
11
8
  protected readonly finalizers: IDisposer[];
12
9
  protected isDisposed: boolean;
13
10
  handlers: Set<Promise<any>>;
@@ -23,7 +20,7 @@ export declare class DisposableComponent implements IDisposable {
23
20
  protected multiReaction<T>(expressions: ((r: IReactionPublic) => T)[], effect: (arg: T, prev: T, r: IReactionPublic) => void, opts?: IReactionOptions<T, boolean>, registerDisposer?: (d: () => void) => void): IReactionDisposer[];
24
21
  protected registerFinalizers(...actions: (() => void)[]): void;
25
22
  protected registerFinalizer(action: () => void): () => void;
26
- protected registerDisposable(disposable: IDisposable): () => void;
27
- dispose(): void;
23
+ protected registerDisposable(disposable: Disposable): () => void;
24
+ [Symbol.dispose](): void;
28
25
  }
29
26
  //# sourceMappingURL=scope.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/componentModel/scope.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/componentModel/scope.ts"],"names":[],"mappings":"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"}
@@ -71,9 +71,9 @@ class z {
71
71
  return this.registerFinalizers(e), e;
72
72
  }
73
73
  registerDisposable(e) {
74
- return this.registerFinalizer(e.dispose.bind(e));
74
+ return this.registerFinalizer(e[Symbol.dispose].bind(e));
75
75
  }
76
- dispose() {
76
+ [Symbol.dispose]() {
77
77
  if (this === void 0 && console.error('undefined "this"'), !this.isDisposed) {
78
78
  for (const e of this.finalizers)
79
79
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"scope.es.js","sources":["../../src/componentModel/scope.ts"],"sourcesContent":["// import { createViewModel } from \"@/componentModel\";\r\nimport {\r\n reaction,\r\n observe,\r\n Lambda,\r\n IReactionPublic,\r\n IReactionOptions,\r\n IReactionDisposer,\r\n IObjectDidChange,\r\n // IArrayChange,\r\n IArraySplice,\r\n IMapDidChange,\r\n autorun,\r\n IAutorunOptions\r\n} from \"mobx\";\r\nimport { deepObserve, IDisposer } from \"mobx-utils\";\r\nimport { observable, transaction } from \"mobx\";\r\n\r\nexport type IObjectChange<T> = IObjectDidChange & {\r\n name: keyof T;\r\n object: T;\r\n};\r\n\r\nexport interface IDisposable {\r\n dispose: () => void;\r\n}\r\n\r\nexport class DisposableComponent implements IDisposable {\r\n // finalizers\r\n protected readonly finalizers: IDisposer[];\r\n\r\n protected isDisposed: boolean;\r\n\r\n public handlers: Set<Promise<any>>;\r\n\r\n constructor() {\r\n this.isDisposed = false;\r\n this.finalizers = [];\r\n this.handlers = new Set<Promise<any>>();\r\n }\r\n\r\n protected deepObserve<T = any>(\r\n target: T,\r\n // | IArrayChange\r\n listener: (change: IObjectDidChange | IArraySplice | IMapDidChange, path: string, root: T) => void\r\n ): IDisposer {\r\n const releaser = deepObserve(target, listener);\r\n this.registerFinalizers(releaser);\r\n return releaser;\r\n }\r\n\r\n protected autorun(view: (r: IReactionPublic) => any, opts?: IAutorunOptions): IReactionDisposer {\r\n const releaser = autorun(view, opts);\r\n this.registerFinalizers(releaser);\r\n return releaser;\r\n }\r\n\r\n protected observe<T = Object>(object: T, listener: (change: IObjectChange<T>) => void, registerDisposer = true): Lambda {\r\n const releaser = observe(object, listener);\r\n if (registerDisposer) {\r\n this.registerFinalizers(releaser);\r\n }\r\n return releaser;\r\n }\r\n\r\n public async allHandlersAsync(): Promise<void> {\r\n await Promise.all(this.handlers);\r\n }\r\n\r\n protected validateState() {\r\n if (this.isDisposed) {\r\n throw new Error(\"Cannot access a disposed object\");\r\n }\r\n }\r\n \r\n protected observeAsync<T = Object>(\r\n object: T,\r\n listener: (change: IObjectChange<T>) => Promise<any>,\r\n registerDisposer = true,\r\n handlers = this.handlers\r\n ): Lambda {\r\n this.validateState(); \r\n const releaser = observe(object, (change) => {\r\n let task: Promise<any> = null;\r\n task = (async () => {\r\n await listener(change as IObjectChange<T>);\r\n handlers.delete(task);\r\n })();\r\n handlers.add(task);\r\n });\r\n if (registerDisposer) {\r\n this.registerFinalizers(releaser);\r\n }\r\n return releaser;\r\n }\r\n\r\n protected multiObserve(\r\n objects: Object[],\r\n listener: (change: IObjectDidChange) => void,\r\n fireImmediately?: boolean,\r\n registerDisposer = (d: () => void) => {\r\n this.registerFinalizer(d);\r\n }\r\n ): Lambda[] {\r\n const releasers: Lambda[] = [];\r\n for (const object of objects) {\r\n const releaser = observe(object, listener, fireImmediately);\r\n releasers.push(releaser);\r\n if (registerDisposer) {\r\n registerDisposer(releaser);\r\n }\r\n }\r\n return releasers;\r\n }\r\n\r\n protected reaction<T>(\r\n expression: (r: IReactionPublic) => T,\r\n effect: (arg: T, prev: T, r: IReactionPublic) => void,\r\n opts?: IReactionOptions<T, boolean>\r\n ): IReactionDisposer {\r\n const releaser = reaction(expression, effect, opts);\r\n this.registerFinalizers(releaser);\r\n return releaser;\r\n }\r\n\r\n protected multiReaction<T>(\r\n expressions: ((r: IReactionPublic) => T)[],\r\n effect: (arg: T, prev: T, r: IReactionPublic) => void,\r\n opts: IReactionOptions<T, boolean> = undefined,\r\n registerDisposer = (d: () => void) => {\r\n this.registerFinalizer(d);\r\n }\r\n ): IReactionDisposer[] {\r\n const releasers: IReactionDisposer[] = [];\r\n if (!opts) {\r\n opts = undefined;\r\n }\r\n for (const expression of expressions) {\r\n const releaser = reaction(expression, effect, opts);\r\n releasers.push(releaser);\r\n if (registerDisposer) {\r\n registerDisposer(releaser);\r\n }\r\n }\r\n\r\n return releasers;\r\n }\r\n\r\n // registerDisposers\r\n protected registerFinalizers(...actions: (() => void)[]) {\r\n this.finalizers.push(...actions);\r\n }\r\n\r\n // registerDisposer\r\n protected registerFinalizer(action: () => void) {\r\n this.registerFinalizers(action);\r\n return action;\r\n }\r\n\r\n protected registerDisposable(disposable: IDisposable) {\r\n return this.registerFinalizer(disposable.dispose.bind(disposable));\r\n }\r\n\r\n public dispose() {\r\n if (this === undefined) {\r\n console.error('undefined \"this\"');\r\n }\r\n if (!this.isDisposed) {\r\n for (const d of this.finalizers) {\r\n try {\r\n d && d();\r\n } catch (err) {\r\n throw err; // for debug\r\n }\r\n }\r\n this.finalizers.length = 0;\r\n // while (this.finalizers.length) {\r\n // const d = this.finalizers.pop();\r\n // d && d();\r\n // }\r\n this.isDisposed = true;\r\n }\r\n }\r\n}\r\n\r\n// export class Model extends DisposableComponent {\r\n \r\n// public isBusy: boolean = true; // isLoading\r\n\r\n// protected async withBusyAsync<T>(asyncAction: () => Promise<T>) {\r\n// transaction(() => {\r\n// this.isBusy = true;\r\n// });\r\n// try {\r\n// return await asyncAction();\r\n// } finally {\r\n// transaction(() => {\r\n// this.isBusy = false;\r\n// });\r\n// }\r\n// }\r\n\r\n// protected withBusy<T>(action: () => T) {\r\n// transaction(() => {\r\n// this.isBusy = true;\r\n// });\r\n// try {\r\n// return action();\r\n// } finally {\r\n// transaction(() => {\r\n// this.isBusy = false;\r\n// });\r\n// }\r\n// }\r\n// }\r\n"],"names":["DisposableComponent","target","listener","releaser","deepObserve","view","opts","autorun","object","registerDisposer","observe","handlers","change","task","objects","fireImmediately","d","releasers","expression","effect","reaction","expressions","actions","action","disposable","err"],"mappings":"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"}
1
+ {"version":3,"file":"scope.es.js","sources":["../../src/componentModel/scope.ts"],"sourcesContent":["// import { createViewModel } from \"@/componentModel\";\r\nimport {\r\n reaction,\r\n observe,\r\n Lambda,\r\n IReactionPublic,\r\n IReactionOptions,\r\n IReactionDisposer,\r\n IObjectDidChange,\r\n // IArrayChange,\r\n IArraySplice,\r\n IMapDidChange,\r\n autorun,\r\n IAutorunOptions\r\n} from \"mobx\";\r\nimport { deepObserve, IDisposer } from \"mobx-utils\";\r\n\r\nexport type IObjectChange<T> = IObjectDidChange & {\r\n name: keyof T;\r\n object: T;\r\n};\r\nexport class DisposableComponent implements Disposable {\r\n // finalizers\r\n protected readonly finalizers: IDisposer[];\r\n\r\n protected isDisposed: boolean;\r\n\r\n public handlers: Set<Promise<any>>;\r\n\r\n constructor() {\r\n this.isDisposed = false;\r\n this.finalizers = [];\r\n this.handlers = new Set<Promise<any>>();\r\n }\r\n\r\n protected deepObserve<T = any>(\r\n target: T,\r\n // | IArrayChange\r\n listener: (change: IObjectDidChange | IArraySplice | IMapDidChange, path: string, root: T) => void\r\n ): IDisposer {\r\n const releaser = deepObserve(target, listener);\r\n this.registerFinalizers(releaser);\r\n return releaser;\r\n }\r\n\r\n protected autorun(view: (r: IReactionPublic) => any, opts?: IAutorunOptions): IReactionDisposer {\r\n const releaser = autorun(view, opts);\r\n this.registerFinalizers(releaser);\r\n return releaser;\r\n }\r\n\r\n protected observe<T = Object>(object: T, listener: (change: IObjectChange<T>) => void, registerDisposer = true): Lambda {\r\n const releaser = observe(object, listener);\r\n if (registerDisposer) {\r\n this.registerFinalizers(releaser);\r\n }\r\n return releaser;\r\n }\r\n\r\n public async allHandlersAsync(): Promise<void> {\r\n await Promise.all(this.handlers);\r\n }\r\n\r\n protected validateState() {\r\n if (this.isDisposed) {\r\n throw new Error(\"Cannot access a disposed object\");\r\n }\r\n }\r\n \r\n protected observeAsync<T = Object>(\r\n object: T,\r\n listener: (change: IObjectChange<T>) => Promise<any>,\r\n registerDisposer = true,\r\n handlers = this.handlers\r\n ): Lambda {\r\n this.validateState(); \r\n const releaser = observe(object, (change) => {\r\n let task: Promise<any> = null;\r\n task = (async () => {\r\n await listener(change as IObjectChange<T>);\r\n handlers.delete(task);\r\n })();\r\n handlers.add(task);\r\n });\r\n if (registerDisposer) {\r\n this.registerFinalizers(releaser);\r\n }\r\n return releaser;\r\n }\r\n\r\n protected multiObserve(\r\n objects: Object[],\r\n listener: (change: IObjectDidChange) => void,\r\n fireImmediately?: boolean,\r\n registerDisposer = (d: () => void) => {\r\n this.registerFinalizer(d);\r\n }\r\n ): Lambda[] {\r\n const releasers: Lambda[] = [];\r\n for (const object of objects) {\r\n const releaser = observe(object, listener, fireImmediately);\r\n releasers.push(releaser);\r\n if (registerDisposer) {\r\n registerDisposer(releaser);\r\n }\r\n }\r\n return releasers;\r\n }\r\n\r\n protected reaction<T>(\r\n expression: (r: IReactionPublic) => T,\r\n effect: (arg: T, prev: T, r: IReactionPublic) => void,\r\n opts?: IReactionOptions<T, boolean>\r\n ): IReactionDisposer {\r\n const releaser = reaction(expression, effect, opts);\r\n this.registerFinalizers(releaser);\r\n return releaser;\r\n }\r\n\r\n protected multiReaction<T>(\r\n expressions: ((r: IReactionPublic) => T)[],\r\n effect: (arg: T, prev: T, r: IReactionPublic) => void,\r\n opts: IReactionOptions<T, boolean> = undefined,\r\n registerDisposer = (d: () => void) => {\r\n this.registerFinalizer(d);\r\n }\r\n ): IReactionDisposer[] {\r\n const releasers: IReactionDisposer[] = [];\r\n if (!opts) {\r\n opts = undefined;\r\n }\r\n for (const expression of expressions) {\r\n const releaser = reaction(expression, effect, opts);\r\n releasers.push(releaser);\r\n if (registerDisposer) {\r\n registerDisposer(releaser);\r\n }\r\n }\r\n\r\n return releasers;\r\n }\r\n\r\n // registerDisposers\r\n protected registerFinalizers(...actions: (() => void)[]) {\r\n this.finalizers.push(...actions);\r\n }\r\n\r\n // registerDisposer\r\n protected registerFinalizer(action: () => void) {\r\n this.registerFinalizers(action);\r\n return action;\r\n }\r\n\r\n protected registerDisposable(disposable: Disposable) {\r\n return this.registerFinalizer(disposable[Symbol.dispose].bind(disposable));\r\n }\r\n\r\n [Symbol.dispose]() {\r\n if (this === undefined) {\r\n console.error('undefined \"this\"');\r\n }\r\n if (!this.isDisposed) {\r\n for (const d of this.finalizers) {\r\n try {\r\n d && d();\r\n } catch (err) {\r\n throw err; // for debug\r\n }\r\n }\r\n this.finalizers.length = 0;\r\n // while (this.finalizers.length) {\r\n // const d = this.finalizers.pop();\r\n // d && d();\r\n // }\r\n this.isDisposed = true;\r\n }\r\n }\r\n}\r\n\r\n// export class Model extends DisposableComponent {\r\n \r\n// public isBusy: boolean = true; // isLoading\r\n\r\n// protected async withBusyAsync<T>(asyncAction: () => Promise<T>) {\r\n// transaction(() => {\r\n// this.isBusy = true;\r\n// });\r\n// try {\r\n// return await asyncAction();\r\n// } finally {\r\n// transaction(() => {\r\n// this.isBusy = false;\r\n// });\r\n// }\r\n// }\r\n\r\n// protected withBusy<T>(action: () => T) {\r\n// transaction(() => {\r\n// this.isBusy = true;\r\n// });\r\n// try {\r\n// return action();\r\n// } finally {\r\n// transaction(() => {\r\n// this.isBusy = false;\r\n// });\r\n// }\r\n// }\r\n// }\r\n"],"names":["DisposableComponent","target","listener","releaser","deepObserve","view","opts","autorun","object","registerDisposer","observe","handlers","change","task","objects","fireImmediately","d","releasers","expression","effect","reaction","expressions","actions","action","disposable","err"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { AsyncFunc, AwaitedReturnType, MaybeExtends } from '@actdim/utico/typeCore';
1
+ import { AwaitedReturnType, Func } from '@actdim/utico/typeCore';
2
2
  export type IFetcher = {
3
3
  fetch(url: RequestInfo | URL, init?: RequestInit): Promise<Response>;
4
4
  };
5
5
  export type IResolvedBody = {
6
- [K in keyof Body as Body[K] extends AsyncFunc ? K : never]?: AwaitedReturnType<MaybeExtends<Body[K], AsyncFunc>>;
6
+ [K in keyof Body]?: Body[K] extends Func ? AwaitedReturnType<Body[K]> : Body[K];
7
7
  };
8
8
  export type MimeType = "application/atom+xml" | "application/json" | "application/javascript" | "application/octet-stream" | "application/pdf" | "application/postscript" | "application/soap+xml" | "application/font-woff" | "application/xhtml+xml" | "application/zip" | "application/gzip" | "application/x-tex" | "application/xml" | "application/msword" | "text/cmd" | "text/css" | "text/csv" | "text/html" | "text/plain" | "text/xml" | "text/markdown" | "image/png" | "image/jpeg" | "image/tiff";
9
9
  export type RequestStatus = "" | "queued" | "executing" | "succeeded" | "failed" | "canceled";
@@ -1 +1 @@
1
- {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/net/request.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAQ,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAG1F,MAAM,MAAM,QAAQ,GAAG;IACnB,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACxE,CAAC;AAGF,MAAM,MAAM,aAAa,GAAG;KACvB,CAAC,IAAI,MAAM,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;CACnH,CAAC;AAGF,MAAM,MAAM,QAAQ,GAEd,sBAAsB,GACtB,kBAAkB,GAClB,wBAAwB,GACxB,0BAA0B,GAC1B,iBAAiB,GACjB,wBAAwB,GACxB,sBAAsB,GACtB,uBAAuB,GACvB,uBAAuB,GACvB,iBAAiB,GACjB,kBAAkB,GAClB,mBAAmB,GACnB,iBAAiB,GACjB,oBAAoB,GAEpB,UAAU,GACV,UAAU,GACV,UAAU,GACV,WAAW,GAEX,YAAY,GACZ,UAAU,GACV,eAAe,GAEf,WAAW,GACX,YAAY,GACZ,YAAY,CAAC;AAGnB,MAAM,MAAM,aAAa,GAEnB,EAAE,GAEF,QAAQ,GAER,WAAW,GAGX,WAAW,GAEX,QAAQ,GAER,UAAU,CAAC;AAEjB,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG;IAEpC,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG;IACzC,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,GAAG,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,UAAU,QAAQ,kBAAoB,CAAC;AAEvE,eAAO,MAAM,eAAe,GAAI,UAAU,QAAQ,iBAAoB,CAAC;AAEvE,eAAO,MAAM,eAAe,GAAI,UAAU,QAAQ,oBAAoB,CAAC;AAEvE,eAAO,MAAM,sBAAsB,GAAI,UAAU,QAAQ,yBAA2B,CAAC;AAGrF,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAmDtG;AAED,MAAM,WAAW,iBAAiB,CAAC,OAAO,GAAG,GAAG;IAE5C,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE;QAC1B,OAAO,EAAE,cAAc,CAAC;QAExB,MAAM,EAAE,OAAO,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,OAAO,CAAC;KACpB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtF;AAGD,MAAM,WAAW,cAAc,CAAC,OAAO,GAAG,GAAG,CAAE,SAAQ,WAAW;IAE9D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IAEZ,OAAO,CAAC,EAAE,OAAO,CAAC;IAKlB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,SAAS,CAAC,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;CAC1C"}
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/net/request.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,iBAAiB,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAG5E,MAAM,MAAM,QAAQ,GAAG;IACnB,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACxE,CAAC;AAGF,MAAM,MAAM,aAAa,GAAG;KACvB,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;CAClF,CAAC;AAGF,MAAM,MAAM,QAAQ,GAEd,sBAAsB,GACtB,kBAAkB,GAClB,wBAAwB,GACxB,0BAA0B,GAC1B,iBAAiB,GACjB,wBAAwB,GACxB,sBAAsB,GACtB,uBAAuB,GACvB,uBAAuB,GACvB,iBAAiB,GACjB,kBAAkB,GAClB,mBAAmB,GACnB,iBAAiB,GACjB,oBAAoB,GAEpB,UAAU,GACV,UAAU,GACV,UAAU,GACV,WAAW,GAEX,YAAY,GACZ,UAAU,GACV,eAAe,GAEf,WAAW,GACX,YAAY,GACZ,YAAY,CAAC;AAGnB,MAAM,MAAM,aAAa,GAEnB,EAAE,GAEF,QAAQ,GAER,WAAW,GAGX,WAAW,GAEX,QAAQ,GAER,UAAU,CAAC;AAEjB,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG;IAEpC,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG;IACzC,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,GAAG,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,UAAU,QAAQ,kBAAoB,CAAC;AAEvE,eAAO,MAAM,eAAe,GAAI,UAAU,QAAQ,iBAAoB,CAAC;AAEvE,eAAO,MAAM,eAAe,GAAI,UAAU,QAAQ,oBAAoB,CAAC;AAEvE,eAAO,MAAM,sBAAsB,GAAI,UAAU,QAAQ,yBAA2B,CAAC;AAGrF,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAmDtG;AAED,MAAM,WAAW,iBAAiB,CAAC,OAAO,GAAG,GAAG;IAE5C,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE;QAC1B,OAAO,EAAE,cAAc,CAAC;QAExB,MAAM,EAAE,OAAO,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,OAAO,CAAC;KACpB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtF;AAGD,MAAM,WAAW,cAAc,CAAC,OAAO,GAAG,GAAG,CAAE,SAAQ,WAAW;IAE9D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IAEZ,OAAO,CAAC,EAAE,OAAO,CAAC;IAKlB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,SAAS,CAAC,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;CAC1C"}
@@ -1 +1 @@
1
- {"version":3,"file":"request.es.js","sources":["../../src/net/request.ts"],"sourcesContent":["// Transport\r\n\r\nimport httpStatus from \"http-status\";\r\nimport { AsyncFunc, AwaitedReturnType, Func, MaybeExtends } from \"@actdim/utico/typeCore\";\r\nimport { ApiError } from \"./apiError\";\r\n\r\nexport type IFetcher = {\r\n fetch(url: RequestInfo | URL, init?: RequestInit): Promise<Response>;\r\n};\r\n\r\n// IParsedBody\r\nexport type IResolvedBody = {\r\n [K in keyof Body as Body[K] extends AsyncFunc ? K : never]?: AwaitedReturnType<MaybeExtends<Body[K], AsyncFunc>>;\r\n};\r\n\r\n// https://www.iana.org/assignments/media-types/media-types.xhtml\r\nexport type MimeType =\r\n // application\r\n | \"application/atom+xml\"\r\n | \"application/json\"\r\n | \"application/javascript\"\r\n | \"application/octet-stream\"\r\n | \"application/pdf\"\r\n | \"application/postscript\"\r\n | \"application/soap+xml\"\r\n | \"application/font-woff\"\r\n | \"application/xhtml+xml\"\r\n | \"application/zip\"\r\n | \"application/gzip\"\r\n | \"application/x-tex\"\r\n | \"application/xml\"\r\n | \"application/msword\"\r\n // text\r\n | \"text/cmd\"\r\n | \"text/css\"\r\n | \"text/csv\"\r\n | \"text/html\"\r\n // \"text/javascript\" |\r\n | \"text/plain\"\r\n | \"text/xml\"\r\n | \"text/markdown\"\r\n // image\r\n | \"image/png\"\r\n | \"image/jpeg\"\r\n | \"image/tiff\";\r\n\r\n// RequestExecutionStatus\r\nexport type RequestStatus =\r\n // Created\r\n | \"\" // none/created/new/unsent\r\n // Queued\r\n | \"queued\" // scheduled\r\n // Executing\r\n | \"executing\" // sent/pending/processing/in-progress\r\n // \"suspended\" | // on-hold\r\n // Successful\r\n | \"succeeded\" // successful/resolved/done/completed/finished/fulfilled/complete\r\n // Unsuccessful\r\n | \"failed\" // unsuccessful/rejected\r\n // Aborted\r\n | \"canceled\"; // aborted/terminated\r\n\r\nexport type IResponseState = Response & {\r\n // parsed?\r\n resolved?: IResolvedBody;\r\n};\r\n\r\nexport type IRequestState = IRequestParams & {\r\n status: RequestStatus;\r\n result?: any;\r\n};\r\n\r\nexport const getResponseBlob = (response: Response) => response.blob();\r\n\r\nexport const getResponseJson = (response: Response) => response.json();\r\n\r\nexport const getResponseText = (response: Response) => response.text();\r\n\r\nexport const getResponseArrayBuffer = (response: Response) => response.arrayBuffer();\r\n\r\n// https://stackoverflow.com/questions/64781995/how-to-get-mime-type-of-an-array-buffer-object\r\nexport async function getResponseResult(response: IResponseState, request: IRequestState): Promise<any> {\r\n // const headers: { [key: string]: string } = {};\r\n let contentType =\r\n request.contentType ||\r\n (request.headers && request.headers instanceof Headers ? request.headers.get(\"content-type\") : request.headers[\"Content-Type\"]);\r\n if (response.headers) {\r\n // for (const k in response.headers.keys()) {\r\n // headers[k] = response.headers.get[k];\r\n // }\r\n // if (response.headers.forEach) {\r\n // response.headers.forEach((v, k) => headers[k] = v);\r\n // }\r\n contentType = response.headers instanceof Headers ? response.headers.get(\"content-type\") : response.headers[\"content-type\"];\r\n }\r\n let result: any = undefined;\r\n if (!response.resolved) {\r\n response.resolved = {};\r\n }\r\n const resolved = response.resolved;\r\n contentType = (contentType || \"\").toLowerCase();\r\n if (contentType.startsWith(\"text/\")) {\r\n result = await response.text();\r\n } else if (contentType.startsWith(\"image/\")) {\r\n result = await response.blob();\r\n } else {\r\n if (contentType.startsWith(\"application/json\")) {\r\n result = await response.json();\r\n resolved.json = result;\r\n } else if (contentType.startsWith(\"octet-stream\")) {\r\n result = await response.blob();\r\n resolved.blob = result;\r\n } else {\r\n try {\r\n resolved.json = await response.clone().json();\r\n } catch {\r\n try {\r\n resolved.text = await response.text();\r\n } catch {\r\n }\r\n }\r\n // unexpected response\r\n // throw new Error(`Unsupported content type: ${contentType}`);\r\n }\r\n }\r\n if (!(response.status === httpStatus.OK || response.status === httpStatus.NO_CONTENT)) {\r\n // JSON.stringify(resolved)\r\n throw ApiError.create(response, request);\r\n }\r\n\r\n request.result = result;\r\n return result;\r\n}\r\n\r\nexport interface IRequestCallbacks<TResult = any> {\r\n // onBeforeExecuteRequest\r\n onBeforeSendRequest?: (event: {\r\n request: IRequestParams;\r\n // interrupt\r\n cancel: boolean;\r\n handled: boolean;\r\n result?: TResult;\r\n }) => Promise<void>;\r\n onResponseRead?: (event: { response: Response; result: TResult }) => Promise<void>;\r\n}\r\n\r\n// IRequestOptions\r\nexport interface IRequestParams<TResult = any> extends RequestInit {\r\n // TODO: support WebSocket transport\r\n id?: string;\r\n tag?: string;\r\n url: string;\r\n // authType?: ...;\r\n useAuth?: boolean;\r\n // authToken?: string; // bearerToken\r\n // TODO: support\r\n // accepts: string[]; // https://developer.mozilla.org/ru/docs/Web/HTTP/Headers/Accept\r\n // TODO: support\r\n crossDomain?: boolean;\r\n contentType?: MimeType; // dataType\r\n httpOnly?: boolean;\r\n // transportType: ...;\r\n callbacks?: IRequestCallbacks<TResult>;\r\n}\r\n"],"names":["getResponseBlob","response","getResponseJson","getResponseText","getResponseArrayBuffer","getResponseResult","request","contentType","result","resolved","httpStatus","ApiError"],"mappings":";;AAwEO,MAAMA,IAAkB,CAACC,MAAuBA,EAAS,KAAA,GAEnDC,IAAkB,CAACD,MAAuBA,EAAS,KAAA,GAEnDE,IAAkB,CAACF,MAAuBA,EAAS,KAAA,GAEnDG,IAAyB,CAACH,MAAuBA,EAAS,YAAA;AAGvE,eAAsBI,EAAkBJ,GAA0BK,GAAsC;AAEpG,MAAIC,IACAD,EAAQ,gBACPA,EAAQ,WAAWA,EAAQ,mBAAmB,UAAUA,EAAQ,QAAQ,IAAI,cAAc,IAAIA,EAAQ,QAAQ,cAAc;AACjI,EAAIL,EAAS,YAOTM,IAAcN,EAAS,mBAAmB,UAAUA,EAAS,QAAQ,IAAI,cAAc,IAAIA,EAAS,QAAQ,cAAc;AAE9H,MAAIO;AACJ,EAAKP,EAAS,aACVA,EAAS,WAAW,CAAA;AAExB,QAAMQ,IAAWR,EAAS;AAE1B,MADAM,KAAeA,KAAe,IAAI,YAAA,GAC9BA,EAAY,WAAW,OAAO;AAC9B,IAAAC,IAAS,MAAMP,EAAS,KAAA;AAAA,WACjBM,EAAY,WAAW,QAAQ;AACtC,IAAAC,IAAS,MAAMP,EAAS,KAAA;AAAA,WAEpBM,EAAY,WAAW,kBAAkB;AACzC,IAAAC,IAAS,MAAMP,EAAS,KAAA,GACxBQ,EAAS,OAAOD;AAAA,WACTD,EAAY,WAAW,cAAc;AAC5C,IAAAC,IAAS,MAAMP,EAAS,KAAA,GACxBQ,EAAS,OAAOD;AAAA;AAEhB,QAAI;AACA,MAAAC,EAAS,OAAO,MAAMR,EAAS,MAAA,EAAQ,KAAA;AAAA,IAC3C,QAAQ;AACJ,UAAI;AACA,QAAAQ,EAAS,OAAO,MAAMR,EAAS,KAAA;AAAA,MACnC,QAAQ;AAAA,MACR;AAAA,IACJ;AAKR,MAAI,EAAEA,EAAS,WAAWS,EAAW,MAAMT,EAAS,WAAWS,EAAW;AAEtE,UAAMC,EAAS,OAAOV,GAAUK,CAAO;AAG3C,SAAAA,EAAQ,SAASE,GACVA;AACX;"}
1
+ {"version":3,"file":"request.es.js","sources":["../../src/net/request.ts"],"sourcesContent":["// Transport\r\n\r\nimport httpStatus from \"http-status\";\r\nimport { AsyncFunc, AwaitedReturnType, Func } from \"@actdim/utico/typeCore\";\r\nimport { ApiError } from \"./apiError\";\r\n\r\nexport type IFetcher = {\r\n fetch(url: RequestInfo | URL, init?: RequestInit): Promise<Response>;\r\n};\r\n\r\n// IParsedBody\r\nexport type IResolvedBody = {\r\n [K in keyof Body]?: Body[K] extends Func ? AwaitedReturnType<Body[K]> : Body[K];\r\n};\r\n\r\n// https://www.iana.org/assignments/media-types/media-types.xhtml\r\nexport type MimeType =\r\n // application\r\n | \"application/atom+xml\"\r\n | \"application/json\"\r\n | \"application/javascript\"\r\n | \"application/octet-stream\"\r\n | \"application/pdf\"\r\n | \"application/postscript\"\r\n | \"application/soap+xml\"\r\n | \"application/font-woff\"\r\n | \"application/xhtml+xml\"\r\n | \"application/zip\"\r\n | \"application/gzip\"\r\n | \"application/x-tex\"\r\n | \"application/xml\"\r\n | \"application/msword\"\r\n // text\r\n | \"text/cmd\"\r\n | \"text/css\"\r\n | \"text/csv\"\r\n | \"text/html\"\r\n // \"text/javascript\" |\r\n | \"text/plain\"\r\n | \"text/xml\"\r\n | \"text/markdown\"\r\n // image\r\n | \"image/png\"\r\n | \"image/jpeg\"\r\n | \"image/tiff\";\r\n\r\n// RequestExecutionStatus\r\nexport type RequestStatus =\r\n // Created\r\n | \"\" // none/created/new/unsent\r\n // Queued\r\n | \"queued\" // scheduled\r\n // Executing\r\n | \"executing\" // sent/pending/processing/in-progress\r\n // \"suspended\" | // on-hold\r\n // Successful\r\n | \"succeeded\" // successful/resolved/done/completed/finished/fulfilled/complete\r\n // Unsuccessful\r\n | \"failed\" // unsuccessful/rejected\r\n // Aborted\r\n | \"canceled\"; // aborted/terminated\r\n\r\nexport type IResponseState = Response & {\r\n // parsed?\r\n resolved?: IResolvedBody;\r\n};\r\n\r\nexport type IRequestState = IRequestParams & {\r\n status: RequestStatus;\r\n result?: any;\r\n};\r\n\r\nexport const getResponseBlob = (response: Response) => response.blob();\r\n\r\nexport const getResponseJson = (response: Response) => response.json();\r\n\r\nexport const getResponseText = (response: Response) => response.text();\r\n\r\nexport const getResponseArrayBuffer = (response: Response) => response.arrayBuffer();\r\n\r\n// https://stackoverflow.com/questions/64781995/how-to-get-mime-type-of-an-array-buffer-object\r\nexport async function getResponseResult(response: IResponseState, request: IRequestState): Promise<any> {\r\n // const headers: { [key: string]: string } = {};\r\n let contentType =\r\n request.contentType ||\r\n (request.headers && request.headers instanceof Headers ? request.headers.get(\"content-type\") : request.headers[\"Content-Type\"]);\r\n if (response.headers) {\r\n // for (const k in response.headers.keys()) {\r\n // headers[k] = response.headers.get[k];\r\n // }\r\n // if (response.headers.forEach) {\r\n // response.headers.forEach((v, k) => headers[k] = v);\r\n // }\r\n contentType = response.headers instanceof Headers ? response.headers.get(\"content-type\") : response.headers[\"content-type\"];\r\n }\r\n let result: any = undefined;\r\n if (!response.resolved) {\r\n response.resolved = {};\r\n }\r\n const resolved = response.resolved;\r\n contentType = (contentType || \"\").toLowerCase();\r\n if (contentType.startsWith(\"text/\")) {\r\n result = await response.text();\r\n } else if (contentType.startsWith(\"image/\")) {\r\n result = await response.blob();\r\n } else {\r\n if (contentType.startsWith(\"application/json\")) {\r\n result = await response.json();\r\n resolved.json = result;\r\n } else if (contentType.startsWith(\"octet-stream\")) {\r\n result = await response.blob();\r\n resolved.blob = result;\r\n } else {\r\n try {\r\n resolved.json = await response.clone().json();\r\n } catch {\r\n try {\r\n resolved.text = await response.text();\r\n } catch {\r\n }\r\n }\r\n // unexpected response\r\n // throw new Error(`Unsupported content type: ${contentType}`);\r\n }\r\n }\r\n if (!(response.status === httpStatus.OK || response.status === httpStatus.NO_CONTENT)) {\r\n // JSON.stringify(resolved)\r\n throw ApiError.create(response, request);\r\n }\r\n\r\n request.result = result;\r\n return result;\r\n}\r\n\r\nexport interface IRequestCallbacks<TResult = any> {\r\n // onBeforeExecuteRequest\r\n onBeforeSendRequest?: (event: {\r\n request: IRequestParams;\r\n // interrupt\r\n cancel: boolean;\r\n handled: boolean;\r\n result?: TResult;\r\n }) => Promise<void>;\r\n onResponseRead?: (event: { response: Response; result: TResult }) => Promise<void>;\r\n}\r\n\r\n// IRequestOptions\r\nexport interface IRequestParams<TResult = any> extends RequestInit {\r\n // TODO: support WebSocket transport\r\n id?: string;\r\n tag?: string;\r\n url: string;\r\n // authType?: ...;\r\n useAuth?: boolean;\r\n // authToken?: string; // bearerToken\r\n // TODO: support\r\n // accepts: string[]; // https://developer.mozilla.org/ru/docs/Web/HTTP/Headers/Accept\r\n // TODO: support\r\n crossDomain?: boolean;\r\n contentType?: MimeType; // dataType\r\n httpOnly?: boolean;\r\n // transportType: ...;\r\n callbacks?: IRequestCallbacks<TResult>;\r\n}\r\n"],"names":["getResponseBlob","response","getResponseJson","getResponseText","getResponseArrayBuffer","getResponseResult","request","contentType","result","resolved","httpStatus","ApiError"],"mappings":";;AAwEO,MAAMA,IAAkB,CAACC,MAAuBA,EAAS,KAAA,GAEnDC,IAAkB,CAACD,MAAuBA,EAAS,KAAA,GAEnDE,IAAkB,CAACF,MAAuBA,EAAS,KAAA,GAEnDG,IAAyB,CAACH,MAAuBA,EAAS,YAAA;AAGvE,eAAsBI,EAAkBJ,GAA0BK,GAAsC;AAEpG,MAAIC,IACAD,EAAQ,gBACPA,EAAQ,WAAWA,EAAQ,mBAAmB,UAAUA,EAAQ,QAAQ,IAAI,cAAc,IAAIA,EAAQ,QAAQ,cAAc;AACjI,EAAIL,EAAS,YAOTM,IAAcN,EAAS,mBAAmB,UAAUA,EAAS,QAAQ,IAAI,cAAc,IAAIA,EAAS,QAAQ,cAAc;AAE9H,MAAIO;AACJ,EAAKP,EAAS,aACVA,EAAS,WAAW,CAAA;AAExB,QAAMQ,IAAWR,EAAS;AAE1B,MADAM,KAAeA,KAAe,IAAI,YAAA,GAC9BA,EAAY,WAAW,OAAO;AAC9B,IAAAC,IAAS,MAAMP,EAAS,KAAA;AAAA,WACjBM,EAAY,WAAW,QAAQ;AACtC,IAAAC,IAAS,MAAMP,EAAS,KAAA;AAAA,WAEpBM,EAAY,WAAW,kBAAkB;AACzC,IAAAC,IAAS,MAAMP,EAAS,KAAA,GACxBQ,EAAS,OAAOD;AAAA,WACTD,EAAY,WAAW,cAAc;AAC5C,IAAAC,IAAS,MAAMP,EAAS,KAAA,GACxBQ,EAAS,OAAOD;AAAA;AAEhB,QAAI;AACA,MAAAC,EAAS,OAAO,MAAMR,EAAS,MAAA,EAAQ,KAAA;AAAA,IAC3C,QAAQ;AACJ,UAAI;AACA,QAAAQ,EAAS,OAAO,MAAMR,EAAS,KAAA;AAAA,MACnC,QAAQ;AAAA,MACR;AAAA,IACJ;AAKR,MAAI,EAAEA,EAAS,WAAWS,EAAW,MAAMT,EAAS,WAAWS,EAAW;AAEtE,UAAMC,EAAS,OAAOV,GAAUK,CAAO;AAG3C,SAAAA,EAAQ,SAASE,GACVA;AACX;"}
@@ -1,16 +1,15 @@
1
- import { ComponentParams, ComponentStruct } from '@actdim/dynstruct/componentModel/componentModel';
2
- import { NavContext } from '@actdim/dynstruct/appDomain/appContracts';
3
- import { BaseAppBusChannels, BaseAppMsgStruct, NavRoutes } from '../appDomain/appContracts';
1
+ import { BaseAppMsgChannels, BaseAppMsgStruct, NavContext, NavRoutes } from '../appDomain/appContracts';
2
+ import { Component, ComponentParams, ComponentStruct } from '../componentModel/componentModel';
4
3
  type Struct = ComponentStruct<BaseAppMsgStruct, {
5
4
  props: {
6
5
  history: NavContext[];
7
6
  routes: NavRoutes;
8
7
  };
9
8
  msgScope: {
10
- provide: BaseAppBusChannels<'APP-NAV-GOTO' | 'APP-NAV-GET-CONTEXT' | 'APP-NAV-READ-HISTORY' | 'APP-NAV-CONTEXT-CHANGED'>;
9
+ provide: BaseAppMsgChannels<'APP-NAV-GOTO' | 'APP-NAV-GET-CONTEXT' | 'APP-NAV-READ-HISTORY' | 'APP-NAV-CONTEXT-CHANGED'>;
11
10
  };
12
11
  }>;
13
- export declare const useNavService: (params: ComponentParams<Struct>) => any;
12
+ export declare const useNavService: (params: ComponentParams<Struct>) => Component<Struct>;
14
13
  export type NavServiceStruct = Struct;
15
14
  export declare const NavServiceFC: FC<ComponentParams<TStruct>>;
16
15
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"NavService.d.ts","sourceRoot":"","sources":["../../src/services/NavService.tsx"],"names":[],"mappings":"AAAA,OAAO,EACH,eAAe,EACf,eAAe,EAIlB,MAAM,iDAAiD,CAAC;AASzD,OAAO,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAEtE,OAAO,EACH,kBAAkB,EAClB,gBAAgB,EAChB,SAAS,EACZ,MAAM,0BAA0B,CAAC;AAElC,KAAK,MAAM,GAAG,eAAe,CACzB,gBAAgB,EAChB;IACI,KAAK,EAAE;QACH,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,QA6E5D,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC;AACtC,eAAO,MAAM,YAAY,8BAAuB,CAAC"}
1
+ {"version":3,"file":"NavService.d.ts","sourceRoot":"","sources":["../../src/services/NavService.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACvG,OAAO,EAAuB,KAAK,SAAS,EAA0C,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAE1K,KAAK,MAAM,GAAG,eAAe,CACzB,gBAAgB,EAChB;IACI,KAAK,EAAE;QACH,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,YAAY,8BAAuB,CAAC"}
@@ -1,9 +1,9 @@
1
- import { getFC as u, useComponent as l } from "../dist/componentModel/componentModel.es.es.js";
2
- import { useNavigate as m, useLocation as y, useNavigationType as h, useParams as P, useSearchParams as N } from "react-router-dom";
3
- import { PersistentStore as v } from "@actdim/utico/store/persistentStore";
4
- new v("history");
5
- const A = (r) => {
6
- const s = m(), n = y(), c = h(), i = P(), [p] = N(), t = l({
1
+ import { useNavigate as p, useLocation as m, useNavigationType as y, useParams as h, useSearchParams as N } from "react-router-dom";
2
+ import { getFC as P, useComponent as v } from "../componentModel/componentModel.es.js";
3
+ const A = (n) => {
4
+ let s, o;
5
+ const e = p(), c = m(), i = y(), l = h(), [u] = N();
6
+ return s = v({
7
7
  props: {
8
8
  history: [],
9
9
  routes: void 0
@@ -12,54 +12,53 @@ const A = (r) => {
12
12
  provide: {
13
13
  "APP-NAV-GOTO": {
14
14
  in: {
15
- callback: async (o) => {
16
- s(o.payload);
15
+ callback: async (a) => {
16
+ e(a.payload);
17
17
  }
18
18
  },
19
19
  ex: {
20
- callback: async (o) => {
21
- const a = o.payload.route;
22
- s(t.routes[a].path(o.payload.params));
20
+ callback: async (a) => {
21
+ const t = a.payload.route;
22
+ e(o.routes[t].path(a.payload.params));
23
23
  }
24
24
  }
25
25
  },
26
26
  "APP-NAV-GET-CONTEXT": {
27
27
  in: {
28
- callback: (o) => t.history[t.history.length - 1]
28
+ callback: (a) => o.history[o.history.length - 1]
29
29
  }
30
30
  },
31
31
  "APP-NAV-READ-HISTORY": {
32
32
  in: {
33
- callback: (o) => t.history[t.history.length - 1]
33
+ callback: (a) => o.history[o.history.length - 1]
34
34
  }
35
35
  },
36
36
  "APP-NAV-CONTEXT-CHANGED": {}
37
37
  }
38
38
  },
39
39
  events: {
40
- onLayout: (o) => {
41
- const a = o.history;
42
- if (a) {
43
- const e = {
44
- location: n,
45
- searchParams: p,
46
- params: i,
47
- navType: c
40
+ onLayout: (a) => {
41
+ const t = o.history;
42
+ if (t) {
43
+ const r = {
44
+ location: c,
45
+ searchParams: u,
46
+ params: l,
47
+ navType: i
48
48
  };
49
- a.push(e), o.msgBus.dispatch({
49
+ t.push(r), a.msgBus.dispatch({
50
50
  channel: "APP-NAV-CONTEXT-CHANGED",
51
51
  group: "in",
52
- payload: e
52
+ payload: r
53
53
  });
54
54
  }
55
55
  }
56
56
  },
57
57
  view: () => null
58
- }, r);
59
- return t;
60
- }, E = u(A);
58
+ }, n), o = s.model, s;
59
+ }, C = P(A);
61
60
  export {
62
- E as NavServiceFC,
61
+ C as NavServiceFC,
63
62
  A as useNavService
64
63
  };
65
64
  //# sourceMappingURL=NavService.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NavService.es.js","sources":["../../src/services/NavService.tsx"],"sourcesContent":["import {\r\n ComponentParams,\r\n ComponentStruct,\r\n getFC,\r\n useComponent,\r\n Component,\r\n} from '@actdim/dynstruct/componentModel/componentModel';\r\nimport {\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 { NavContext } from '@actdim/dynstruct/appDomain/appContracts';\r\nimport { PersistentStore } from '@actdim/utico/store/persistentStore';\r\nimport {\r\n BaseAppBusChannels,\r\n BaseAppMsgStruct,\r\n NavRoutes, \r\n} from '@/appDomain/appContracts';\r\n\r\ntype Struct = ComponentStruct<\r\n BaseAppMsgStruct,\r\n {\r\n props: {\r\n history: NavContext[];\r\n routes: NavRoutes;\r\n };\r\n msgScope: {\r\n provide: BaseAppBusChannels<\r\n | 'APP-NAV-GOTO'\r\n | 'APP-NAV-GET-CONTEXT'\r\n | 'APP-NAV-READ-HISTORY'\r\n | 'APP-NAV-CONTEXT-CHANGED'\r\n >;\r\n };\r\n }\r\n>;\r\n\r\nconst store = new PersistentStore('history');\r\n\r\nexport const useNavService = (params: ComponentParams<Struct>) => {\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 component: Component<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(model.routes[route].path(msg.payload.params));\r\n },\r\n },\r\n },\r\n 'APP-NAV-GET-CONTEXT': {\r\n in: {\r\n callback: (msg) => {\r\n return model.history[model.history.length - 1];\r\n },\r\n },\r\n },\r\n 'APP-NAV-READ-HISTORY': {\r\n in: {\r\n callback: (msg) => {\r\n return model.history[model.history.length - 1];\r\n },\r\n },\r\n },\r\n 'APP-NAV-CONTEXT-CHANGED': {\r\n \r\n }\r\n },\r\n },\r\n events: {\r\n onLayout: (model) => {\r\n const history = model.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 model.msgBus.dispatch({\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 const model = useComponent(component, params);\r\n\r\n // deps\r\n // location, navType, params, searchParams\r\n\r\n return model;\r\n};\r\n\r\nexport type NavServiceStruct = Struct;\r\nexport const NavServiceFC = getFC(useNavService);\r\n"],"names":["PersistentStore","useNavService","params","navigate","useNavigate","location","useLocation","navType","useNavigationType","nvaParams","useParams","searchParams","useSearchParams","model","useComponent","msg","route","history","ctx","NavServiceFC","getFC"],"mappings":";;;AAyCc,IAAIA,EAAgB,SAAS;AAEpC,MAAMC,IAAgB,CAACC,MAAoC;AAC9D,QAAMC,IAAWC,EAAA,GAEXC,IAAWC,EAAA,GACXC,IAAUC,EAAA,GACVC,IAAYC,EAAA,GACZ,CAACC,CAAY,IAAIC,EAAA,GAiEjBC,IAAQC,EA/DuB;AAAA,IACjC,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,cAAAZ,EAASY,EAAI,OAAa;AAAA,YAC9B;AAAA,UAAA;AAAA,UAEJ,IAAI;AAAA,YACA,UAAU,OAAOA,MAAQ;AACrB,oBAAMC,IAAQD,EAAI,QAAQ;AAC1B,cAAAZ,EAASU,EAAM,OAAOG,CAAK,EAAE,KAAKD,EAAI,QAAQ,MAAM,CAAC;AAAA,YACzD;AAAA,UAAA;AAAA,QACJ;AAAA,QAEJ,uBAAuB;AAAA,UACnB,IAAI;AAAA,YACA,UAAU,CAACA,MACAF,EAAM,QAAQA,EAAM,QAAQ,SAAS,CAAC;AAAA,UACjD;AAAA,QACJ;AAAA,QAEJ,wBAAwB;AAAA,UACpB,IAAI;AAAA,YACA,UAAU,CAACE,MACAF,EAAM,QAAQA,EAAM,QAAQ,SAAS,CAAC;AAAA,UACjD;AAAA,QACJ;AAAA,QAEJ,2BAA2B,CAAA;AAAA,MAE3B;AAAA,IACJ;AAAA,IAEJ,QAAQ;AAAA,MACJ,UAAU,CAACA,MAAU;AACjB,cAAMI,IAAUJ,EAAM;AACtB,YAAII,GAAS;AACT,gBAAMC,IAAM;AAAA,YACR,UAAAb;AAAA,YACA,cAAAM;AAAA,YACA,QAAQF;AAAA,YACR,SAAAF;AAAA,UAAA;AAEJ,UAAAU,EAAQ,KAAKC,CAAG,GAChBL,EAAM,OAAO,SAAS;AAAA,YAClB,SAAS;AAAA,YACT,OAAO;AAAA,YACP,SAASK;AAAA,UAAA,CACZ;AAAA,QACL;AAAA,MACJ;AAAA,IAAA;AAAA,IAEJ,MAAM,MACK;AAAA,EACX,GAGkChB,CAAM;AAK5C,SAAOW;AACX,GAGaM,IAAeC,EAAMnB,CAAa;"}
1
+ {"version":3,"file":"NavService.es.js","sources":["../../src/services/NavService.tsx"],"sourcesContent":["\r\nimport {\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 { PersistentStore } from '@actdim/utico/store/persistentStore';\r\nimport { BaseAppMsgChannels, BaseAppMsgStruct, NavContext, NavRoutes } from '@/appDomain/appContracts';\r\nimport { getFC, useComponent, type Component, type ComponentDef, type ComponentModel, type ComponentParams, type ComponentStruct } from '@/componentModel/componentModel';\r\n\r\ntype Struct = ComponentStruct<\r\n BaseAppMsgStruct,\r\n {\r\n props: {\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-GET-CONTEXT'\r\n | 'APP-NAV-READ-HISTORY'\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-GET-CONTEXT': {\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-READ-HISTORY': {\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.dispatch({\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 NavServiceFC = getFC(useNavService);\r\n"],"names":["useNavService","params","c","m","navigate","useNavigate","location","useLocation","navType","useNavigationType","nvaParams","useParams","searchParams","useSearchParams","useComponent","msg","route","history","ctx","NavServiceFC","getFC"],"mappings":";;AAiCO,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,SAAS;AAAA,YACd,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,IAAeC,EAAMpB,CAAa;"}
@@ -0,0 +1,6 @@
1
+ import { PropsWithChildren } from 'react';
2
+ import { MsgProviderAdapter } from '../componentModel/adapters';
3
+ export declare function ServiceProvider(props: PropsWithChildren<{
4
+ adapters?: MsgProviderAdapter[];
5
+ }>): any;
6
+ //# sourceMappingURL=ServiceProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServiceProvider.d.ts","sourceRoot":"","sources":["../../src/services/ServiceProvider.tsx"],"names":[],"mappings":"AACA,OAAO,EAAiB,iBAAiB,EAAmB,MAAM,OAAO,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAoB,MAAM,4BAA4B,CAAC;AAKlF,wBAAgB,eAAe,CAC3B,KAAK,EAAE,iBAAiB,CAAC;IACrB,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACnC,CAAC,OAYL"}