@actdim/dynstruct 1.1.5 → 1.1.7

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 (49) hide show
  1. package/dist/appDomain/appContracts.d.ts +7 -6
  2. package/dist/appDomain/appContracts.d.ts.map +1 -1
  3. package/dist/appDomain/appContracts.es.js +8 -10
  4. package/dist/appDomain/appContracts.es.js.map +1 -1
  5. package/dist/appDomain/security/securityProvider.d.ts.map +1 -1
  6. package/dist/appDomain/security/securityProvider.es.js +48 -50
  7. package/dist/appDomain/security/securityProvider.es.js.map +1 -1
  8. package/dist/componentModel/DynamicContent.es.js +5 -5
  9. package/dist/componentModel/DynamicContent.es.js.map +1 -1
  10. package/dist/componentModel/adapters.d.ts +4 -3
  11. package/dist/componentModel/adapters.d.ts.map +1 -1
  12. package/dist/componentModel/adapters.es.js +10 -12
  13. package/dist/componentModel/adapters.es.js.map +1 -1
  14. package/dist/componentModel/componentContext.d.ts +2 -2
  15. package/dist/componentModel/componentContext.d.ts.map +1 -1
  16. package/dist/componentModel/componentContext.es.js +1 -1
  17. package/dist/componentModel/componentContext.es.js.map +1 -1
  18. package/dist/componentModel/contracts.d.ts +21 -21
  19. package/dist/componentModel/contracts.d.ts.map +1 -1
  20. package/dist/componentModel/contracts.es.js.map +1 -1
  21. package/dist/componentModel/core.d.ts.map +1 -1
  22. package/dist/componentModel/core.es.js +86 -86
  23. package/dist/componentModel/core.es.js.map +1 -1
  24. package/dist/componentModel/react.d.ts.map +1 -1
  25. package/dist/componentModel/react.es.js +130 -136
  26. package/dist/componentModel/react.es.js.map +1 -1
  27. package/dist/services/ServiceProvider.d.ts +6 -4
  28. package/dist/services/ServiceProvider.d.ts.map +1 -1
  29. package/dist/services/ServiceProvider.es.js +8 -13
  30. package/dist/services/ServiceProvider.es.js.map +1 -1
  31. package/dist/services/StorageService.d.ts +5 -14
  32. package/dist/services/StorageService.d.ts.map +1 -1
  33. package/dist/services/StorageService.es.js +37 -48
  34. package/dist/services/StorageService.es.js.map +1 -1
  35. package/dist/services/{NavService.d.ts → react/NavService.d.ts} +3 -3
  36. package/dist/services/react/NavService.d.ts.map +1 -0
  37. package/dist/services/{NavService.es.js → react/NavService.es.js} +2 -2
  38. package/dist/services/react/NavService.es.js.map +1 -0
  39. package/dist/services/react/ServiceProvider.d.ts +7 -0
  40. package/dist/services/react/ServiceProvider.d.ts.map +1 -0
  41. package/dist/services/react/ServiceProvider.es.js +24 -0
  42. package/dist/services/react/ServiceProvider.es.js.map +1 -0
  43. package/dist/services/react/StorageService.d.ts +16 -0
  44. package/dist/services/react/StorageService.d.ts.map +1 -0
  45. package/dist/services/react/StorageService.es.js +55 -0
  46. package/dist/services/react/StorageService.es.js.map +1 -0
  47. package/package.json +1 -1
  48. package/dist/services/NavService.d.ts.map +0 -1
  49. package/dist/services/NavService.es.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"core.es.js","sources":["../../src/componentModel/core.tsx"],"sourcesContent":["import React from 'react';\r\nimport { MsgBus } from '@actdim/msgmesh/contracts';\r\nimport { isObservable, runInAction, toJS, autorun, IReactionDisposer } from 'mobx';\r\nimport type {\r\n Binding,\r\n Component,\r\n ComponentMsgHeaders,\r\n ComponentStruct,\r\n EffectController,\r\n EffectFn,\r\n MsgChannelGroupProviderParams,\r\n MsgChannelGroupSubscriberParams,\r\n PropEventHandlers,\r\n PropValueChangeHandler,\r\n PropValueChangingHandler,\r\n Validator,\r\n ValueConverter,\r\n} from './contracts';\r\nimport { $isBinding, ComponentMsgFilter } from './contracts';\r\nimport { isPlainObject } from 'mobx/dist/internal';\r\n\r\nconst blankView = () => null;\r\n\r\nexport function isBinding(obj: any): obj is Binding {\r\n return obj[$isBinding] === true;\r\n}\r\n\r\nexport function bind<T, TFrom = any>(\r\n get: () => T,\r\n set?: (value: T) => void,\r\n converter?: ValueConverter<T, TFrom>,\r\n validator?: Validator<T>,\r\n): Binding {\r\n return {\r\n get: get,\r\n set: set,\r\n converter: converter,\r\n validator: validator,\r\n readOnly: !!set,\r\n [$isBinding]: true,\r\n };\r\n}\r\n\r\nexport function bindProp<T extends object, P extends keyof T>(target: () => T, prop: P): Binding {\r\n return {\r\n get: () => target()[prop],\r\n set: (value: T[P]) => {\r\n target()[prop] = value;\r\n },\r\n [$isBinding]: true,\r\n };\r\n}\r\n\r\nconst proxyCache = new WeakMap<object, any>();\r\n\r\nexport type ProxyEventHandlers = {\r\n onPropChanging?: PropValueChangingHandler<PropertyKey>;\r\n onPropChange?: PropValueChangeHandler<PropertyKey>;\r\n} & Record<PropertyKey, PropEventHandlers>;\r\n\r\nexport function createRecursiveProxy(\r\n target: any,\r\n bindings: Map<PropertyKey, Binding>,\r\n handlers: ProxyEventHandlers,\r\n) {\r\n if (typeof target !== 'object' || target === null) {\r\n return target;\r\n }\r\n\r\n // isPlainObject\r\n if (!isObservable(target)) {\r\n return target;\r\n }\r\n\r\n if (proxyCache.has(target)) {\r\n return proxyCache.get(target);\r\n }\r\n\r\n const proxy = new Proxy(target, {\r\n get(obj, prop, receiver) {\r\n // 1. custom handlers\r\n const onGet = handlers[prop]?.onGet;\r\n if (onGet) return onGet();\r\n\r\n // 2. bindings\r\n const binding = bindings.get(prop);\r\n if (binding?.get) {\r\n return binding.get();\r\n }\r\n\r\n const value = Reflect.get(obj, prop, receiver);\r\n\r\n if (typeof value === 'object' && value !== null && isObservable(value)) {\r\n return createRecursiveProxy(value, bindings, handlers);\r\n }\r\n\r\n return value;\r\n },\r\n\r\n set(obj, prop, value, receiver) {\r\n const oldValue = obj[prop];\r\n\r\n // before-change hooks\r\n const onChanging = handlers[prop]?.onChanging;\r\n if (onChanging && onChanging(oldValue, value) === false) {\r\n return true;\r\n }\r\n\r\n if (\r\n handlers.onPropChanging &&\r\n handlers.onPropChanging(prop, oldValue, value) === false\r\n ) {\r\n return true;\r\n }\r\n\r\n const result = runInAction(() => {\r\n return Reflect.set(obj, prop, value, receiver);\r\n });\r\n\r\n // bindings\r\n const binding = bindings.get(prop);\r\n binding?.set?.(value);\r\n\r\n // after-change hooks\r\n handlers[prop]?.onChange?.(value);\r\n handlers.onPropChange?.(prop, value);\r\n\r\n return result;\r\n },\r\n });\r\n\r\n proxyCache.set(target, proxy);\r\n return proxy;\r\n}\r\n\r\nexport function toHtmlId(url: string): string {\r\n let parts = url\r\n .split('/')\r\n .filter(Boolean)\r\n .map((segment) => decodeURIComponent(segment));\r\n\r\n const raw = parts.join('-');\r\n // sanitize\r\n let id = raw\r\n .normalize('NFKD')\r\n .replace(/[^a-zA-Z0-9\\-_:.+#]/g, '-')\r\n .replace(/-+/g, '-')\r\n .replace(/^[^a-zA-Z]+/, '-')\r\n // .replace(/:/g, '-')\r\n // .replace(/\\./g, '_')\r\n // .replace(/#/g, '-')\r\n .replace(/[+#]$/, '-');\r\n return id;\r\n}\r\n\r\nexport function getComponentSourceByCaller(depth = 2): string | null {\r\n const err = new Error();\r\n const stack = err.stack?.split('\\n');\r\n if (!stack || stack.length <= depth) {\r\n return null;\r\n }\r\n const match = stack[depth].match(/\\(([^)]+)\\)/);\r\n const result = match?.[1];\r\n if (result) {\r\n if (\r\n document.querySelector('script[type=\"module\"][src*=\"/@vite/\"]') &&\r\n globalThis['CONFIG_TYPE'] === 'DEVELOPMENT'\r\n ) {\r\n return result.replace(/\\?[^:]+/, '');\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nexport function getComponentNameByCaller(depth = 2): string | null {\r\n const err = new Error();\r\n const stack = err.stack?.split('\\n');\r\n if (!stack || stack.length <= depth) {\r\n return null;\r\n }\r\n const line = stack[depth].trim();\r\n const match = line.match(/^at\\s+([^\\s(]+)/);\r\n if (!match) {\r\n return null;\r\n }\r\n const fnName = match[1];\r\n const hookMatch = fnName.match(/^use(.+)/);\r\n if (hookMatch) {\r\n return hookMatch[1];\r\n }\r\n return fnName;\r\n}\r\n\r\nexport function registerMsgBroker<TStruct extends ComponentStruct = ComponentStruct>(\r\n component: Component<TStruct>,\r\n) {\r\n const providers = component?.msgBroker.provide;\r\n if (providers) {\r\n for (const [channel, providerGroups] of Object.entries(providers)) {\r\n for (const [g, p] of Object.entries(providerGroups)) {\r\n const provider = p as MsgChannelGroupProviderParams;\r\n const callback = provider.callback;\r\n if (callback) {\r\n provider.callback = (msg, headers) => {\r\n return callback(msg, headers, component);\r\n };\r\n }\r\n const filter = provider.filter;\r\n const componentFilter = provider.componentFilter || ComponentMsgFilter.None;\r\n 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 options: {\r\n abortSignal: component.msgBroker.abortController.signal,\r\n },\r\n });\r\n }\r\n }\r\n }\r\n const subscribers = component?.msgBroker?.subscribe;\r\n if (subscribers) {\r\n for (const [channel, subscriberGroups] of Object.entries(subscribers)) {\r\n for (const [g, s] of Object.entries(subscriberGroups)) {\r\n const subscriber = s as MsgChannelGroupSubscriberParams;\r\n const callback = subscriber.callback;\r\n if (callback) {\r\n subscriber.callback = (msg) => {\r\n return callback(msg, component);\r\n };\r\n }\r\n const filter = subscriber.filter;\r\n const componentFilter = subscriber.componentFilter || ComponentMsgFilter.None;\r\n 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\nexport function getComponentMsgBus<TStruct extends ComponentStruct = ComponentStruct>(\r\n msgBus: MsgBus<TStruct['msg']>,\r\n headerSetter: (headers?: ComponentMsgHeaders) => void,\r\n) {\r\n const updateParams = (params: { payload?: any; headers?: ComponentMsgHeaders }) => {\r\n if (params.payload != undefined) {\r\n params.payload = structuredClone(toJS(params.payload)); // always?\r\n }\r\n if (!params.headers) {\r\n params.headers = {};\r\n }\r\n headerSetter?.(params.headers);\r\n };\r\n return {\r\n config: msgBus.config,\r\n on: (params) => {\r\n return msgBus.on(params);\r\n },\r\n once: (params) => {\r\n return msgBus.once(params);\r\n },\r\n stream: (params) => {\r\n return msgBus.stream(params);\r\n },\r\n provide: (params) => {\r\n updateParams(params);\r\n return msgBus.provide(params);\r\n },\r\n send: (params) => {\r\n updateParams(params);\r\n return msgBus.send(params);\r\n },\r\n request: (params) => {\r\n updateParams(params);\r\n return msgBus.request(params);\r\n },\r\n } as MsgBus<TStruct['msg']>;\r\n}\r\n\r\nexport function createEffect<\r\n TStruct extends ComponentStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n>(\r\n component: Component<TStruct, TMsgHeaders>,\r\n name: string,\r\n fn: EffectFn<TStruct, TMsgHeaders>,\r\n): EffectController {\r\n let disposer: IReactionDisposer | null = null;\r\n let paused = false;\r\n let effectCleanup: () => void = undefined;\r\n\r\n const start = () => {\r\n if (disposer) {\r\n return;\r\n }\r\n\r\n disposer = autorun(\r\n () => {\r\n if (!paused) {\r\n const cleanup = fn(component);\r\n if (typeof cleanup === 'function') {\r\n cleanup();\r\n effectCleanup = cleanup;\r\n }\r\n }\r\n },\r\n { name: `effect:${name}` },\r\n );\r\n };\r\n\r\n const stop = () => {\r\n disposer?.();\r\n disposer = null;\r\n if (effectCleanup) {\r\n effectCleanup();\r\n effectCleanup = undefined;\r\n }\r\n };\r\n\r\n const pause = () => {\r\n paused = true;\r\n };\r\n\r\n const resume = () => {\r\n paused = false;\r\n };\r\n\r\n const restart = () => {\r\n stop();\r\n start();\r\n };\r\n\r\n start();\r\n\r\n return { start, pause, resume, stop, restart };\r\n}\r\n\r\n// TODO: move to utico\r\n// function asyncToGeneratorFlow(asyncFn: (...args: any[]) => Promise<any>) {\r\n// return function* (...args: any[]) {\r\n// const result = yield asyncFn(...args);\r\n// return result;\r\n// };\r\n// }\r\n"],"names":["isBinding","obj","$isBinding","bind","get","set","converter","validator","bindProp","target","prop","value","proxyCache","createRecursiveProxy","bindings","handlers","isObservable","proxy","receiver","onGet","binding","oldValue","onChanging","result","runInAction","toHtmlId","url","segment","getComponentSourceByCaller","depth","stack","getComponentNameByCaller","match","fnName","hookMatch","registerMsgBroker","component","providers","channel","providerGroups","g","p","provider","callback","msg","headers","filter","componentFilter","ComponentMsgFilter","msgFilter","subscribers","subscriberGroups","subscriber","getComponentMsgBus","msgBus","headerSetter","updateParams","params","toJS","createEffect","name","fn","disposer","paused","effectCleanup","start","autorun","cleanup","stop","pause","resume","restart"],"mappings":"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"}
1
+ {"version":3,"file":"core.es.js","sources":["../../src/componentModel/core.tsx"],"sourcesContent":["import React from 'react';\r\nimport { MsgBus } from '@actdim/msgmesh/contracts';\r\nimport { isObservable, runInAction, toJS, autorun, IReactionDisposer } from 'mobx';\r\nimport type {\r\n Binding,\r\n Component,\r\n ComponentMsgHeaders,\r\n ComponentStruct,\r\n EffectController,\r\n EffectFn,\r\n MsgChannelGroupProviderParams,\r\n MsgChannelGroupSubscriberParams,\r\n PropEventHandlers,\r\n PropValueChangeHandler,\r\n PropValueChangingHandler,\r\n Validator,\r\n ValueConverter,\r\n} from './contracts';\r\nimport { $isBinding, ComponentMsgFilter } from './contracts';\r\nimport { isPlainObject } from 'mobx/dist/internal';\r\n\r\nconst blankView = () => null;\r\n\r\nexport function isBinding(obj: any): obj is Binding {\r\n return obj[$isBinding] === true;\r\n}\r\n\r\nexport function bind<T, TFrom = any>(\r\n get: () => T,\r\n set?: (value: T) => void,\r\n converter?: ValueConverter<T, TFrom>,\r\n validator?: Validator<T>,\r\n): Binding {\r\n return {\r\n get: get,\r\n set: set,\r\n converter: converter,\r\n validator: validator,\r\n readOnly: !!set,\r\n [$isBinding]: true,\r\n };\r\n}\r\n\r\nexport function bindProp<T extends object, P extends keyof T>(target: () => T, prop: P): Binding {\r\n return {\r\n get: () => target()[prop],\r\n set: (value: T[P]) => {\r\n target()[prop] = value;\r\n },\r\n [$isBinding]: true,\r\n };\r\n}\r\n\r\nconst proxyCache = new WeakMap<object, any>();\r\n\r\nexport type ProxyEventHandlers = {\r\n onPropChanging?: PropValueChangingHandler<PropertyKey>;\r\n onPropChange?: PropValueChangeHandler<PropertyKey>;\r\n} & Record<PropertyKey, PropEventHandlers>;\r\n\r\nexport function createRecursiveProxy(\r\n target: any,\r\n bindings: Map<PropertyKey, Binding>,\r\n handlers: ProxyEventHandlers,\r\n) {\r\n if (typeof target !== 'object' || target === null) {\r\n return target;\r\n }\r\n\r\n // isPlainObject\r\n if (!isObservable(target)) {\r\n return target;\r\n }\r\n\r\n if (proxyCache.has(target)) {\r\n return proxyCache.get(target);\r\n }\r\n\r\n const proxy = new Proxy(target, {\r\n get(obj, prop, receiver) {\r\n // 1. custom handlers\r\n const onGet = handlers[prop]?.onGet;\r\n if (onGet) return onGet();\r\n\r\n // 2. bindings\r\n const binding = bindings.get(prop);\r\n if (binding?.get) {\r\n return binding.get();\r\n }\r\n\r\n const value = Reflect.get(obj, prop, receiver);\r\n\r\n if (typeof value === 'object' && value !== null && isObservable(value)) {\r\n return createRecursiveProxy(value, bindings, handlers);\r\n }\r\n\r\n return value;\r\n },\r\n\r\n set(obj, prop, value, receiver) {\r\n const oldValue = obj[prop];\r\n\r\n // before-change hooks\r\n const onChanging = handlers[prop]?.onChanging;\r\n if (onChanging && onChanging(oldValue, value) === false) {\r\n return true;\r\n }\r\n\r\n if (\r\n handlers.onPropChanging &&\r\n handlers.onPropChanging(prop, oldValue, value) === false\r\n ) {\r\n return true;\r\n }\r\n\r\n const result = runInAction(() => {\r\n return Reflect.set(obj, prop, value, receiver);\r\n });\r\n\r\n // bindings\r\n const binding = bindings.get(prop);\r\n binding?.set?.(value);\r\n\r\n // after-change hooks\r\n handlers[prop]?.onChange?.(value);\r\n handlers.onPropChange?.(prop, value);\r\n\r\n return result;\r\n },\r\n });\r\n\r\n proxyCache.set(target, proxy);\r\n return proxy;\r\n}\r\n\r\nexport function toHtmlId(url: string): string {\r\n let parts = url\r\n .split('/')\r\n .filter(Boolean)\r\n .map((segment) => decodeURIComponent(segment));\r\n\r\n const raw = parts.join('-');\r\n // sanitize\r\n let id = raw\r\n .normalize('NFKD')\r\n .replace(/[^a-zA-Z0-9\\-_:.+#]/g, '-')\r\n .replace(/-+/g, '-')\r\n .replace(/^[^a-zA-Z]+/, '-')\r\n // .replace(/:/g, '-')\r\n // .replace(/\\./g, '_')\r\n // .replace(/#/g, '-')\r\n .replace(/[+#]$/, '-');\r\n return id;\r\n}\r\n\r\nexport function getComponentSourceByCaller(depth = 2): string | null {\r\n const err = new Error();\r\n const stack = err.stack?.split('\\n');\r\n if (!stack || stack.length <= depth) {\r\n return null;\r\n }\r\n const match = stack[depth].match(/\\(([^)]+)\\)/);\r\n const result = match?.[1];\r\n if (result) {\r\n if (\r\n document.querySelector('script[type=\"module\"][src*=\"/@vite/\"]') &&\r\n globalThis['CONFIG_TYPE'] === 'DEVELOPMENT'\r\n ) {\r\n return result.replace(/\\?[^:]+/, '');\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nexport function getComponentNameByCaller(depth = 2): string | null {\r\n const err = new Error();\r\n const stack = err.stack?.split('\\n');\r\n if (!stack || stack.length <= depth) {\r\n return null;\r\n }\r\n const line = stack[depth].trim();\r\n const match = line.match(/^at\\s+([^\\s(]+)/);\r\n if (!match) {\r\n return null;\r\n }\r\n const fnName = match[1];\r\n const hookMatch = fnName.match(/^use(.+)/);\r\n if (hookMatch) {\r\n return hookMatch[1];\r\n }\r\n return fnName;\r\n}\r\n\r\nexport function registerMsgBroker<TStruct extends ComponentStruct = ComponentStruct>(\r\n component: Component<TStruct>,\r\n) {\r\n const providers = component?.msgBroker.provide;\r\n if (providers) {\r\n for (const [channel, providerGroups] of Object.entries(providers)) {\r\n for (const [g, p] of Object.entries(providerGroups)) {\r\n const provider = p as MsgChannelGroupProviderParams;\r\n const callback = provider.callback;\r\n if (callback) {\r\n provider.callback = (msg, headers) => {\r\n return callback(msg, headers, component);\r\n };\r\n }\r\n const filter = provider.filter;\r\n const componentFilter = provider.componentFilter || ComponentMsgFilter.None;\r\n provider.filter = (msg) => {\r\n let result = true;\r\n if (componentFilter & ComponentMsgFilter.FromAncestors) {\r\n const ancestorIds = component.getChainUp();\r\n result = ancestorIds?.indexOf(msg.headers?.sourceId) >= 0;\r\n }\r\n if (result && componentFilter & ComponentMsgFilter.FromDescendants) {\r\n const descendantIds = component.getChainDown();\r\n result = descendantIds?.indexOf(msg.headers?.sourceId) >= 0;\r\n }\r\n if (result && filter) {\r\n result = filter(msg, component);\r\n }\r\n return result;\r\n };\r\n\r\n component.msgBus.provide({\r\n ...p,\r\n channel: channel,\r\n group: g,\r\n options: {\r\n abortSignal: component.msgBroker.abortController.signal,\r\n },\r\n });\r\n }\r\n }\r\n }\r\n const subscribers = component?.msgBroker?.subscribe;\r\n if (subscribers) {\r\n for (const [channel, subscriberGroups] of Object.entries(subscribers)) {\r\n for (const [g, s] of Object.entries(subscriberGroups)) {\r\n const subscriber = s as MsgChannelGroupSubscriberParams;\r\n const callback = subscriber.callback;\r\n if (callback) {\r\n subscriber.callback = (msg) => {\r\n return callback(msg, component);\r\n };\r\n }\r\n const filter = subscriber.filter;\r\n const componentFilter = subscriber.componentFilter || ComponentMsgFilter.None;\r\n subscriber.filter = (msg) => {\r\n let result = true;\r\n if (componentFilter & ComponentMsgFilter.FromAncestors) {\r\n const ancestorIds = component.getChainUp();\r\n result = ancestorIds?.indexOf(msg.headers?.sourceId) >= 0;\r\n }\r\n if (result && componentFilter & ComponentMsgFilter.FromDescendants) {\r\n const descendantIds = component.getChainDown();\r\n result = descendantIds?.indexOf(msg.headers?.sourceId) >= 0;\r\n }\r\n if (result && filter) {\r\n result = filter(msg, component);\r\n }\r\n return result;\r\n };\r\n\r\n component.msgBus.on({\r\n ...s,\r\n channel: channel,\r\n group: g,\r\n config: {\r\n abortSignal: component.msgBroker.abortController.signal,\r\n },\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function getComponentMsgBus<TStruct extends ComponentStruct = ComponentStruct>(\r\n msgBus: MsgBus<TStruct['msg']>,\r\n headerSetter: (headers?: ComponentMsgHeaders) => void,\r\n) {\r\n const updateParams = (params: { payload?: any; headers?: ComponentMsgHeaders }) => {\r\n if (params.payload != undefined) {\r\n params.payload = structuredClone(toJS(params.payload)); // always?\r\n }\r\n if (!params.headers) {\r\n params.headers = {};\r\n }\r\n headerSetter?.(params.headers);\r\n };\r\n return {\r\n config: msgBus.config,\r\n on: (params) => {\r\n return msgBus.on(params);\r\n },\r\n once: (params) => {\r\n return msgBus.once(params);\r\n },\r\n stream: (params) => {\r\n return msgBus.stream(params);\r\n },\r\n provide: (params) => {\r\n updateParams(params);\r\n return msgBus.provide(params);\r\n },\r\n send: (params) => {\r\n updateParams(params);\r\n return msgBus.send(params);\r\n },\r\n request: (params) => {\r\n updateParams(params);\r\n return msgBus.request(params);\r\n },\r\n } as MsgBus<TStruct['msg']>;\r\n}\r\n\r\nexport function createEffect<\r\n TStruct extends ComponentStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n>(\r\n component: Component<TStruct, TMsgHeaders>,\r\n name: string,\r\n fn: EffectFn<TStruct, TMsgHeaders>,\r\n): EffectController {\r\n let disposer: IReactionDisposer | null = null;\r\n let paused = false;\r\n let effectCleanup: () => void = undefined;\r\n\r\n const start = () => {\r\n if (disposer) {\r\n return;\r\n }\r\n\r\n disposer = autorun(\r\n () => {\r\n if (!paused) {\r\n const cleanup = fn(component);\r\n if (typeof cleanup === 'function') {\r\n cleanup();\r\n effectCleanup = cleanup;\r\n }\r\n }\r\n },\r\n { name: `effect:${name}` },\r\n );\r\n };\r\n\r\n const stop = () => {\r\n disposer?.();\r\n disposer = null;\r\n if (effectCleanup) {\r\n effectCleanup();\r\n effectCleanup = undefined;\r\n }\r\n };\r\n\r\n const pause = () => {\r\n paused = true;\r\n };\r\n\r\n const resume = () => {\r\n paused = false;\r\n };\r\n\r\n const restart = () => {\r\n stop();\r\n start();\r\n };\r\n\r\n start();\r\n\r\n return { start, pause, resume, stop, restart };\r\n}\r\n\r\n// TODO: move to utico\r\n// function asyncToGeneratorFlow(asyncFn: (...args: any[]) => Promise<any>) {\r\n// return function* (...args: any[]) {\r\n// const result = yield asyncFn(...args);\r\n// return result;\r\n// };\r\n// }\r\n"],"names":["isBinding","obj","$isBinding","bind","get","set","converter","validator","bindProp","target","prop","value","proxyCache","createRecursiveProxy","bindings","handlers","isObservable","proxy","receiver","onGet","binding","oldValue","onChanging","result","runInAction","toHtmlId","url","segment","getComponentSourceByCaller","depth","stack","getComponentNameByCaller","match","fnName","hookMatch","registerMsgBroker","component","providers","channel","providerGroups","g","p","provider","callback","msg","headers","filter","componentFilter","ComponentMsgFilter","subscribers","subscriberGroups","subscriber","getComponentMsgBus","msgBus","headerSetter","updateParams","params","toJS","createEffect","name","fn","disposer","paused","effectCleanup","start","autorun","cleanup","stop","pause","resume","restart"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/componentModel/react.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAiD,EAAE,EAAW,MAAM,OAAO,CAAC;AAO1F,OAAO,EAEH,SAAS,EAET,YAAY,EAEZ,mBAAmB,EACnB,eAAe,EACf,eAAe,EAOlB,MAAM,aAAa,CAAC;AAwWrB,wBAAgB,YAAY,CACxB,OAAO,SAAS,eAAe,GAAG,eAAe,EACjD,WAAW,SAAS,mBAAmB,GAAG,mBAAmB,EAC/D,YAAY,EAAE,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,OAQnF;AAGD,wBAAgB,KAAK,CAAC,OAAO,SAAS,eAAe,EACjD,OAAO,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,OAAO,CAAC,GAClE,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAS9B"}
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/componentModel/react.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAiD,EAAE,EAAW,MAAM,OAAO,CAAC;AAO1F,OAAO,EAEH,SAAS,EAET,YAAY,EAEZ,mBAAmB,EACnB,eAAe,EACf,eAAe,EAOlB,MAAM,aAAa,CAAC;AAmWrB,wBAAgB,YAAY,CACxB,OAAO,SAAS,eAAe,GAAG,eAAe,EACjD,WAAW,SAAS,mBAAmB,GAAG,mBAAmB,EAC/D,YAAY,EAAE,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,OAQnF;AAGD,wBAAgB,KAAK,CAAC,OAAO,SAAS,eAAe,EACjD,OAAO,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,OAAO,CAAC,GAClE,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAQ9B"}
@@ -1,200 +1,194 @@
1
- import u, { useLayoutEffect as H, useEffect as M, useMemo as j } from "react";
2
- import { observer as x } from "mobx-react-lite";
1
+ import d, { useLayoutEffect as w, useEffect as M, useMemo as G } from "react";
2
+ import { observer as S } from "mobx-react-lite";
3
3
  import { observable as P } from "mobx";
4
- import { useLazyRef as G } from "../reactHooks.es.js";
5
- import { getGlobalFlags as f } from "../globals.es.js";
6
- import { useComponentContext as S, ReactComponentContext as F } from "./componentContext.es.js";
7
- import { $ON_CHANGE as L, $ON_CHANGING as z, $ON_GET as U } from "./contracts.es.js";
8
- import { lazy as A } from "@actdim/utico/utils";
9
- import { getComponentSourceByCaller as T, getComponentMsgBus as _, toHtmlId as J, registerMsgBroker as V, isBinding as q, createRecursiveProxy as K, createEffect as Q } from "./core.es.js";
10
- function a(e) {
4
+ import { useLazyRef as F } from "../reactHooks.es.js";
5
+ import { getGlobalFlags as h } from "../globals.es.js";
6
+ import { useComponentContext as H, ReactComponentContext as L } from "./componentContext.es.js";
7
+ import { $ON_CHANGE as z, $ON_CHANGING as A, $ON_GET as T } from "./contracts.es.js";
8
+ import { lazy as U } from "@actdim/utico/utils";
9
+ import { getComponentSourceByCaller as _, getComponentMsgBus as J, toHtmlId as V, registerMsgBroker as q, isBinding as K, createRecursiveProxy as Q, createEffect as W } from "./core.es.js";
10
+ function C(e) {
11
11
  return e.replace(/^./, e[0].toUpperCase());
12
12
  }
13
- function W(e) {
13
+ function X(e) {
14
14
  return e.replace(/^[a-z][a-z0-9+.-]*:\/\/[^\/]+/, "");
15
15
  }
16
- function X(e, o) {
17
- let t, d;
16
+ function Y(e, i) {
17
+ let t, l;
18
18
  e || (e = {});
19
- let l = e.regType;
20
- l || (l = T(6), l = W(l)), o || (o = {});
21
- const I = e.view;
22
- let C = e.msgBus;
23
- const v = /* @__PURE__ */ new Map(), O = A(() => _(C, (n) => {
24
- n?.sourceId == null && (n.sourceId = t.id);
19
+ let u = e.regType;
20
+ u || (u = _(6), u = X(u)), i || (i = {});
21
+ const $ = e.view;
22
+ let v = e.msgBus;
23
+ const b = /* @__PURE__ */ new Map(), B = U(() => J(v, (r) => {
24
+ r?.sourceId == null && (r.sourceId = t.id);
25
25
  }));
26
- let h = {
26
+ let a = {
27
27
  ...e.msgBroker
28
28
  };
29
- h.abortController || (h.abortController = new AbortController());
30
- const w = x((n) => {
31
- const r = S(), g = r.currentId;
32
- if (t.parentId = g, C || (C = r.msgBus), !t.id) {
33
- let i = o.$id;
34
- if (!i) {
35
- const y = o.$key;
36
- y ? i = `${J(l)}#${y}` : i = r.getNextId(l);
29
+ a.abortController || (a.abortController = new AbortController());
30
+ const y = H(), N = S((r) => {
31
+ const n = H(), g = n.currentId;
32
+ if (t.parentId = g, v || (v = n.msgBus), !t.id) {
33
+ let o = i.$id;
34
+ if (!o) {
35
+ const f = i.$key;
36
+ f ? o = `${V(u)}#${f}` : o = n.getNextId(u);
37
37
  }
38
- t.id = i, t.getHierarchyId = () => r.getHierarchyPath(i), t.getChainDown = () => r.getChainDown(i), t.getChainUp = () => r.getChainUp(i), t.getChildren = () => r.getChildren(i), t.getParent = () => r.getParent(i), t.getNodeMap = () => r.getNodeMap();
38
+ t.id = o;
39
39
  }
40
- H(() => {
40
+ w(() => {
41
41
  try {
42
- if (r.register(t.id, l, g), f().debug) {
43
- const i = t.getHierarchyId();
44
- console.debug(`${i}>layout`);
42
+ if (n.register(t.id, u, g), h().debug) {
43
+ const o = t.getHierarchyId();
44
+ console.debug(`${o}>layout`);
45
45
  }
46
- V(t), e.events?.onLayout?.(t), o.onLayout?.(t);
47
- } catch (i) {
48
- e.events?.onError?.(t, i), o.onError?.(t, i);
46
+ q(t), e.events?.onLayout?.(t), i.onLayout?.(t);
47
+ } catch (o) {
48
+ e.events?.onError?.(t, o), i.onError?.(t, o);
49
49
  }
50
50
  return () => {
51
- if (f().debug) {
52
- const i = t.getHierarchyId();
53
- console.debug(`${i}>layout-destroy`);
51
+ if (h().debug) {
52
+ const o = t.getHierarchyId();
53
+ console.debug(`${o}>layout-destroy`);
54
54
  }
55
- r.unregister(t.id), h.abortController?.abort(), e.events?.onLayoutDestroy?.(t), o.onLayoutDestroy?.(t);
55
+ n.unregister(t.id), a.abortController?.abort(), e.events?.onLayoutDestroy?.(t), i.onLayoutDestroy?.(t);
56
56
  };
57
- }, [e, o, r]), M(() => {
57
+ }, [e, i, n]), M(() => {
58
58
  try {
59
- if (f().debug) {
60
- const i = t.getHierarchyId();
61
- console.debug(`${i}>ready`);
59
+ if (h().debug) {
60
+ const o = t.getHierarchyId();
61
+ console.debug(`${o}>ready`);
62
62
  }
63
- e.events?.onReady?.(t), o.onReady?.(t);
64
- } catch (i) {
65
- if (f().debug) {
66
- const y = t.getHierarchyId();
67
- console.debug(`${y}>destroy`);
63
+ e.events?.onReady?.(t), i.onReady?.(t);
64
+ } catch (o) {
65
+ if (h().debug) {
66
+ const f = t.getHierarchyId();
67
+ console.debug(`${f}>destroy`);
68
68
  }
69
- e.events?.onError?.(t, i), o.onError?.(t, i);
69
+ e.events?.onError?.(t, o), i.onError?.(t, o);
70
70
  }
71
71
  return () => {
72
- e.events?.onDestroy?.(t), o.onDestroy?.(t);
72
+ e.events?.onDestroy?.(t), i.onDestroy?.(t);
73
73
  };
74
- }, [e, o, r]);
74
+ }, [e, i, n]);
75
75
  let s;
76
76
  try {
77
- if (f().debug) {
78
- const i = t.getHierarchyId();
79
- console.debug(`${i}>view`);
77
+ if (h().debug) {
78
+ const o = t.getHierarchyId();
79
+ console.debug(`${o}>view`);
80
80
  }
81
- typeof I == "function" ? s = I(n, t) : s = /* @__PURE__ */ u.createElement(u.Fragment, null, n.children);
82
- } catch (i) {
83
- const y = JSON.stringify(i);
84
- s = /* @__PURE__ */ u.createElement(u.Fragment, null, y);
81
+ typeof $ == "function" ? s = $(r, t) : s = /* @__PURE__ */ d.createElement(d.Fragment, null, r.children);
82
+ } catch (o) {
83
+ const f = JSON.stringify(o);
84
+ s = /* @__PURE__ */ d.createElement(d.Fragment, null, f);
85
85
  }
86
- const c = j(
87
- () => ({ ...r, currentId: t.id }),
88
- [e, o, r]
86
+ const c = G(
87
+ () => ({ ...n, currentId: t.id }),
88
+ [e, i, n]
89
89
  );
90
- return /* @__PURE__ */ u.createElement(F.Provider, { value: c }, s);
91
- }), b = {};
92
- if (d = {}, e.props && Object.assign(d, e.props), e.actions && Object.assign(d, e.actions), e.children)
93
- for (const [n, r] of Object.entries(e.children))
94
- if (typeof r == "function") {
95
- const g = r, s = (c) => {
96
- const i = g(c);
97
- return /* @__PURE__ */ u.createElement(i.View, null);
90
+ return /* @__PURE__ */ d.createElement(L.Provider, { value: c }, s);
91
+ }), I = {};
92
+ if (l = {}, e.props && Object.assign(l, e.props), e.actions && Object.assign(l, e.actions), e.children)
93
+ for (const [r, n] of Object.entries(e.children))
94
+ if (typeof n == "function") {
95
+ const g = n, s = (c) => {
96
+ const o = g(c);
97
+ return /* @__PURE__ */ d.createElement(o.View, null);
98
98
  };
99
- Reflect.set(b, a(n), s);
99
+ Reflect.set(I, C(r), s);
100
100
  } else
101
- Reflect.set(b, n, r);
102
- for (const [n, r] of Object.entries(o))
103
- n in d && (q(r) ? v.set(n, r) : Reflect.set(d, n, r));
104
- const $ = {
105
- onPropChanging: o.onPropChanging || e.events?.onPropChanging ? (n, r, g) => {
106
- let s = !0, c = o.onPropChanging;
107
- return c && (s = c(String(n), r, g)), s && (c = e.events?.onPropChanging, c && (s = c(String(n), r, g))), s;
101
+ Reflect.set(I, r, n);
102
+ for (const [r, n] of Object.entries(i))
103
+ r in l && (K(n) ? b.set(r, n) : Reflect.set(l, r, n));
104
+ const E = {
105
+ onPropChanging: i.onPropChanging || e.events?.onPropChanging ? (r, n, g) => {
106
+ let s = !0, c = i.onPropChanging;
107
+ return c && (s = c(String(r), n, g)), s && (c = e.events?.onPropChanging, c && (s = c(String(r), n, g))), s;
108
108
  } : void 0,
109
- onPropChange: o.onPropChange || e.events?.onPropChange ? (n, r) => {
110
- o.onPropChange?.(String(n), r), e.events?.onPropChange?.(String(n), r);
109
+ onPropChange: i.onPropChange || e.events?.onPropChange ? (r, n) => {
110
+ i.onPropChange?.(String(r), n), e.events?.onPropChange?.(String(r), n);
111
111
  } : void 0
112
112
  };
113
- function B(n) {
114
- const r = `${U}${a(n)}`;
115
- return o[r] || e.events?.[r];
113
+ function R(r) {
114
+ const n = `${T}${C(r)}`;
115
+ return i[n] || e.events?.[n];
116
116
  }
117
- function N(n) {
118
- const r = `${z}${a(n)}`;
117
+ function x(r) {
118
+ const n = `${A}${C(r)}`;
119
119
  return ((g, s) => {
120
- let c = !0, i = o[r];
121
- return i && (c = i(g, s)), c && (i = e.events?.[r], i && (c = i(g, s))), c;
120
+ let c = !0, o = i[n];
121
+ return o && (c = o(g, s)), c && (o = e.events?.[n], o && (c = o(g, s))), c;
122
122
  });
123
123
  }
124
- function R(n) {
125
- const r = `${L}${a(n)}`;
124
+ function j(r) {
125
+ const n = `${z}${C(r)}`;
126
126
  return ((g) => {
127
- o[r]?.(g), e.events?.[r]?.(g);
127
+ i[n]?.(g), e.events?.[n]?.(g);
128
128
  });
129
129
  }
130
- let E = {};
130
+ let k = {};
131
131
  if (e.props) {
132
- for (const n of Object.keys(e.props))
133
- $[n] = {
134
- onGet: B(n),
135
- onChanging: N(n),
136
- onChange: R(n)
132
+ for (const r of Object.keys(e.props))
133
+ E[r] = {
134
+ onGet: R(r),
135
+ onChanging: x(r),
136
+ onChange: j(r)
137
137
  };
138
- for (const n of Object.keys(e.props))
139
- E[n] = P.deep;
138
+ for (const r of Object.keys(e.props))
139
+ k[r] = P.deep;
140
140
  }
141
141
  if (e.actions)
142
- for (const n of Object.keys(e.actions))
142
+ for (const r of Object.keys(e.actions))
143
143
  ;
144
- d = P(d, E, {
144
+ l = P(l, k, {
145
145
  deep: !0
146
- }), d = K(d, v, $);
147
- let k = {};
146
+ }), l = Q(l, b, E);
147
+ let O = {};
148
148
  if (t = {
149
- id: o.$id,
150
- key: o.$key,
151
- regType: l,
149
+ id: i.$id,
150
+ key: i.$key,
151
+ regType: u,
152
152
  parentId: void 0,
153
- getHierarchyId: () => {
154
- },
155
- getChainDown: () => {
156
- },
157
- getChainUp: () => {
158
- },
159
- getChildren: () => {
160
- },
161
- getParent: () => {
162
- },
163
- getNodeMap: () => {
164
- },
165
- bindings: v,
153
+ getHierarchyId: () => y.getHierarchyPath(t.id),
154
+ getChainDown: () => y.getChainDown(t.id),
155
+ getChainUp: () => y.getChainUp(t.id),
156
+ getChildren: () => y.getChildren(t.id),
157
+ getParent: () => y.getParent(t.id),
158
+ getNodeMap: () => y.getNodeMap(),
159
+ bindings: b,
166
160
  get msgBus() {
167
- return O();
161
+ return B();
168
162
  },
169
- msgBroker: h,
170
- effects: k,
163
+ msgBroker: a,
164
+ effects: O,
171
165
  // view: componentDef.view,
172
- View: w,
173
- children: b,
174
- model: d
166
+ View: N,
167
+ children: I,
168
+ model: l
175
169
  }, e.effects)
176
- for (const [n, r] of Object.entries(e.effects))
177
- k[n] = Q(
170
+ for (const [r, n] of Object.entries(e.effects))
171
+ O[r] = W(
178
172
  t,
179
- n,
180
- r
173
+ r,
174
+ n
181
175
  );
182
- return e.events?.onInit && e.events.onInit(t), o.onInit && o.onInit(t), t;
176
+ return e.events?.onInit && e.events.onInit(t), i.onInit && i.onInit(t), t;
183
177
  }
184
- function ie(e, o) {
185
- const t = G(() => X(e, o));
186
- return H(() => () => {
178
+ function oe(e, i) {
179
+ const t = F(() => Y(e, i));
180
+ return w(() => () => {
187
181
  t.current = null;
188
182
  }, []), t.current;
189
183
  }
190
- function oe(e) {
184
+ function se(e) {
191
185
  return (t) => {
192
- const d = e(t);
193
- return /* @__PURE__ */ u.createElement(d.View, { ...t });
186
+ const l = e(t);
187
+ return /* @__PURE__ */ d.createElement(l.View, { ...t });
194
188
  };
195
189
  }
196
190
  export {
197
- oe as getFC,
198
- ie as useComponent
191
+ se as getFC,
192
+ oe as useComponent
199
193
  };
200
194
  //# sourceMappingURL=react.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"react.es.js","sources":["../../src/componentModel/react.tsx"],"sourcesContent":["import React, { PropsWithChildren, useEffect, useLayoutEffect, FC, useMemo } from 'react';\r\nimport { Mutable } from '@actdim/utico/typeCore';\r\nimport { observer } from 'mobx-react-lite';\r\nimport { action, observable } from 'mobx';\r\nimport { useLazyRef } from '@/reactHooks';\r\nimport { getGlobalFlags } from '@/globals';\r\nimport { ReactComponentContext, useComponentContext } from './componentContext';\r\nimport {\r\n Binding,\r\n Component,\r\n ComponentChildren,\r\n ComponentDef,\r\n ComponentModel,\r\n ComponentMsgHeaders,\r\n ComponentParams,\r\n ComponentStruct,\r\n ComponentViewImplFn,\r\n ComponentViewProps,\r\n EffectController,\r\n EffectFn,\r\n ValueChangeHandler,\r\n ValueChangingHandler,\r\n} from './contracts';\r\nimport { $ON_CHANGE, $ON_CHANGING, $ON_GET, $isBinding, ComponentMsgFilter } from './contracts';\r\nimport { lazy } from '@actdim/utico/utils';\r\nimport {\r\n createEffect,\r\n createRecursiveProxy,\r\n getComponentSourceByCaller,\r\n getComponentMsgBus,\r\n isBinding,\r\n ProxyEventHandlers,\r\n registerMsgBroker,\r\n toHtmlId,\r\n} from './core';\r\n\r\nfunction capitalize(name: string) {\r\n return name.replace(/^./, name[0].toUpperCase());\r\n}\r\n\r\nfunction cleanSourceRef(sourceRef: string) {\r\n // remove origin\r\n return sourceRef.replace(/^[a-z][a-z0-9+.-]*:\\/\\/[^\\/]+/, '');\r\n}\r\n\r\nfunction createComponent<TStruct extends ComponentStruct = ComponentStruct>(\r\n componentDef: ComponentDef<TStruct>,\r\n params?: ComponentParams<TStruct>,\r\n): Component<TStruct> {\r\n // result\r\n let component: Mutable<Component<TStruct>>;\r\n let model: Mutable<ComponentModel<TStruct>>;\r\n\r\n if (!componentDef) {\r\n componentDef = {};\r\n }\r\n\r\n let regType = componentDef.regType;\r\n if (!regType) {\r\n regType = getComponentSourceByCaller(6);\r\n // type = getComponentNameByCaller(6);\r\n regType = cleanSourceRef(regType);\r\n // throw new Error('Valid component definition is required');\r\n }\r\n\r\n if (!params) {\r\n params = {};\r\n }\r\n\r\n const view = componentDef.view;\r\n let msgBus = componentDef.msgBus;\r\n\r\n const bindings = new Map<PropertyKey, Binding>();\r\n\r\n const componentMsgBus = lazy(() => {\r\n return getComponentMsgBus(msgBus, (headers) => {\r\n if (headers?.sourceId == undefined) {\r\n headers.sourceId = component.id;\r\n }\r\n }); // as ComponentModel<TStruct>['msgBus']\r\n });\r\n\r\n let msgBroker = {\r\n ...componentDef.msgBroker,\r\n };\r\n\r\n if (!msgBroker.abortController) {\r\n msgBroker.abortController = new AbortController();\r\n }\r\n\r\n const ViewFC = observer((props: ComponentViewProps) => {\r\n const context = useComponentContext();\r\n const parentId = context.currentId;\r\n\r\n component.parentId = parentId;\r\n\r\n if (!msgBus) {\r\n msgBus = context.msgBus;\r\n }\r\n\r\n if (!component.id) {\r\n let id = params.$id;\r\n if (!id) {\r\n const key = params.$key;\r\n if (key) {\r\n id = `${toHtmlId(regType)}#${key}`;\r\n } else {\r\n id = context.getNextId(regType);\r\n }\r\n }\r\n\r\n component.id = id;\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\r\n useLayoutEffect(() => {\r\n try {\r\n context.register(component.id, regType, parentId);\r\n\r\n if (getGlobalFlags().debug) {\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>layout`);\r\n }\r\n\r\n registerMsgBroker(component);\r\n\r\n componentDef.events?.onLayout?.(component);\r\n params.onLayout?.(component);\r\n } catch (err) {\r\n componentDef.events?.onError?.(component, err);\r\n params.onError?.(component, err);\r\n }\r\n\r\n return () => {\r\n if (getGlobalFlags().debug) {\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>layout-destroy`);\r\n }\r\n context.unregister(component.id);\r\n\r\n msgBroker.abortController?.abort();\r\n\r\n componentDef.events?.onLayoutDestroy?.(component);\r\n params.onLayoutDestroy?.(component);\r\n };\r\n }, [componentDef, params, context]);\r\n\r\n useEffect(() => {\r\n try {\r\n if (getGlobalFlags().debug) {\r\n // mount\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>ready`);\r\n }\r\n componentDef.events?.onReady?.(component);\r\n params.onReady?.(component);\r\n } catch (err) {\r\n if (getGlobalFlags().debug) {\r\n // unmount\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>destroy`);\r\n }\r\n componentDef.events?.onError?.(component, err);\r\n params.onError?.(component, err);\r\n }\r\n return () => {\r\n componentDef.events?.onDestroy?.(component);\r\n params.onDestroy?.(component);\r\n };\r\n }, [componentDef, params, context]);\r\n\r\n let content: React.ReactNode;\r\n // let content: any;\r\n try {\r\n if (getGlobalFlags().debug) {\r\n // render\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>view`);\r\n }\r\n if (typeof view === 'function') {\r\n content = view(props, component);\r\n } else {\r\n // content = props.children;\r\n content = <>{props.children}</>;\r\n }\r\n } catch (err) {\r\n // throw err;\r\n const errDetails = JSON.stringify(err);\r\n // msgBus.send\r\n content = <>{errDetails}</>;\r\n }\r\n const scopeContext = useMemo(\r\n () => ({ ...context, currentId: component.id }),\r\n [componentDef, params, context],\r\n );\r\n return (\r\n <ReactComponentContext.Provider value={scopeContext}>\r\n {content}\r\n </ReactComponentContext.Provider>\r\n );\r\n });\r\n\r\n const children = {} as ComponentChildren<TStruct['children']>;\r\n\r\n model = {} as Mutable<ComponentModel<TStruct>>;\r\n\r\n if (componentDef.props) {\r\n Object.assign(model, componentDef.props);\r\n }\r\n\r\n if (componentDef.actions) {\r\n Object.assign(model, componentDef.actions);\r\n }\r\n\r\n if (componentDef.children) {\r\n for (const [key, value] of Object.entries(componentDef.children)) {\r\n if (typeof value == 'function') {\r\n const view = value as (params: any) => Component;\r\n const ChildViewFC: ComponentViewImplFn<TStruct> = (props) => {\r\n const c = view(props);\r\n return <c.View />;\r\n // if (typeof c.view === \"function\") {\r\n // return c.view(props);\r\n // }\r\n // return <>{props.children}</>;\r\n };\r\n Reflect.set(children, capitalize(key), ChildViewFC);\r\n } else {\r\n Reflect.set(children, key, value);\r\n }\r\n }\r\n }\r\n\r\n // Reflect.ownKeys/Object.keys\r\n for (const [key, value] of Object.entries(params)) {\r\n // model.hasOwnProperty(key)\r\n if (key in model) {\r\n if (isBinding(value)) {\r\n bindings.set(key, value);\r\n } else {\r\n Reflect.set(model, key, value);\r\n }\r\n }\r\n }\r\n\r\n const proxyEventHandlers: Pick<ProxyEventHandlers, 'onPropChanging' | 'onPropChange'> = {\r\n onPropChanging:\r\n params.onPropChanging || componentDef.events?.onPropChanging\r\n ? (prop, oldValue, newValue) => {\r\n let result = true;\r\n let handler = params.onPropChanging;\r\n if (handler) {\r\n result = handler(String(prop), oldValue, newValue);\r\n }\r\n if (result) {\r\n handler = componentDef.events?.onPropChanging;\r\n if (handler) {\r\n result = handler(String(prop), oldValue, newValue);\r\n }\r\n }\r\n return result;\r\n }\r\n : undefined,\r\n onPropChange:\r\n params.onPropChange || componentDef.events?.onPropChange\r\n ? (prop, value) => {\r\n params.onPropChange?.(String(prop), value);\r\n componentDef.events?.onPropChange?.(String(prop), value);\r\n }\r\n : undefined,\r\n };\r\n\r\n function resolveOnGetEventHandler(prop: string) {\r\n const key = `${$ON_GET}${capitalize(prop)}`;\r\n return params[key] || componentDef.events?.[key];\r\n }\r\n\r\n function resolveOnChangingEventHandler(prop: string) {\r\n const key = `${$ON_CHANGING}${capitalize(prop)}`;\r\n return ((oldValue: any, newValue: any) => {\r\n let result = true;\r\n let handler = params[key] as ValueChangingHandler<any>;\r\n if (handler) {\r\n result = handler(oldValue, newValue);\r\n }\r\n if (result) {\r\n handler = componentDef.events?.[key] as ValueChangingHandler<any>;\r\n if (handler) {\r\n result = handler(oldValue, newValue);\r\n }\r\n }\r\n return result;\r\n }) as ValueChangingHandler;\r\n }\r\n\r\n function resolveOnChangeEventHandler(prop: string) {\r\n const key = `${$ON_CHANGE}${capitalize(prop)}`;\r\n return ((value: any) => {\r\n (params[key] as ValueChangeHandler<any>)?.(value);\r\n (componentDef.events?.[key] as ValueChangeHandler<any>)?.(value);\r\n }) as ValueChangeHandler;\r\n }\r\n\r\n let annotationMap: Record<string, any> = {};\r\n\r\n if (componentDef.props) {\r\n for (const prop of Object.keys(componentDef.props)) {\r\n proxyEventHandlers[prop] = {\r\n onGet: resolveOnGetEventHandler(prop),\r\n onChanging: resolveOnChangingEventHandler(prop),\r\n onChange: resolveOnChangeEventHandler(prop),\r\n };\r\n }\r\n\r\n for (const key of Object.keys(componentDef.props)) {\r\n annotationMap[key] = observable.deep;\r\n }\r\n }\r\n\r\n if (componentDef.actions) {\r\n const annotationMap: Record<string, any> = {};\r\n for (const key of Object.keys(componentDef.actions)) {\r\n annotationMap[key] = action;\r\n }\r\n }\r\n\r\n model = observable(model, annotationMap, {\r\n deep: true,\r\n });\r\n\r\n model = createRecursiveProxy(model, bindings, proxyEventHandlers);\r\n\r\n let effects: Record<string, EffectController> = {};\r\n component = {\r\n id: params.$id,\r\n key: params.$key,\r\n regType: regType,\r\n parentId: undefined,\r\n getHierarchyId: () => 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 }, []); // [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":["capitalize","name","cleanSourceRef","sourceRef","createComponent","componentDef","params","component","model","regType","getComponentSourceByCaller","view","msgBus","bindings","componentMsgBus","lazy","getComponentMsgBus","headers","msgBroker","ViewFC","observer","props","context","useComponentContext","parentId","id","key","toHtmlId","useLayoutEffect","getGlobalFlags","hierarchyId","registerMsgBroker","err","useEffect","content","React","errDetails","scopeContext","useMemo","ReactComponentContext","children","value","ChildViewFC","c","isBinding","proxyEventHandlers","prop","oldValue","newValue","result","handler","resolveOnGetEventHandler","$ON_GET","resolveOnChangingEventHandler","$ON_CHANGING","resolveOnChangeEventHandler","$ON_CHANGE","annotationMap","observable","createRecursiveProxy","effects","fn","createEffect","useComponent","ref","useLazyRef","getFC","factory"],"mappings":"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"}
1
+ {"version":3,"file":"react.es.js","sources":["../../src/componentModel/react.tsx"],"sourcesContent":["import React, { PropsWithChildren, useEffect, useLayoutEffect, FC, useMemo } from 'react';\r\nimport { Mutable } from '@actdim/utico/typeCore';\r\nimport { observer } from 'mobx-react-lite';\r\nimport { action, observable } from 'mobx';\r\nimport { useLazyRef } from '@/reactHooks';\r\nimport { getGlobalFlags } from '@/globals';\r\nimport { ReactComponentContext, useComponentContext } from './componentContext';\r\nimport {\r\n Binding,\r\n Component,\r\n ComponentChildren,\r\n ComponentDef,\r\n ComponentModel,\r\n ComponentMsgHeaders,\r\n ComponentParams,\r\n ComponentStruct,\r\n ComponentViewImplFn,\r\n ComponentViewProps,\r\n EffectController,\r\n EffectFn,\r\n ValueChangeHandler,\r\n ValueChangingHandler,\r\n} from './contracts';\r\nimport { $ON_CHANGE, $ON_CHANGING, $ON_GET, $isBinding, ComponentMsgFilter } from './contracts';\r\nimport { lazy } from '@actdim/utico/utils';\r\nimport {\r\n createEffect,\r\n createRecursiveProxy,\r\n getComponentSourceByCaller,\r\n getComponentMsgBus,\r\n isBinding,\r\n ProxyEventHandlers,\r\n registerMsgBroker,\r\n toHtmlId,\r\n} from './core';\r\n\r\nfunction capitalize(name: string) {\r\n return name.replace(/^./, name[0].toUpperCase());\r\n}\r\n\r\nfunction cleanSourceRef(sourceRef: string) {\r\n // remove origin\r\n return sourceRef.replace(/^[a-z][a-z0-9+.-]*:\\/\\/[^\\/]+/, '');\r\n}\r\n\r\nfunction createComponent<TStruct extends ComponentStruct = ComponentStruct>(\r\n componentDef: ComponentDef<TStruct>,\r\n params?: ComponentParams<TStruct>,\r\n): Component<TStruct> {\r\n // result\r\n let component: Mutable<Component<TStruct>>;\r\n let model: Mutable<ComponentModel<TStruct>>;\r\n\r\n if (!componentDef) {\r\n componentDef = {};\r\n }\r\n\r\n let regType = componentDef.regType;\r\n if (!regType) {\r\n regType = getComponentSourceByCaller(6);\r\n // type = getComponentNameByCaller(6);\r\n regType = cleanSourceRef(regType);\r\n // throw new Error('Valid component definition is required');\r\n }\r\n\r\n if (!params) {\r\n params = {};\r\n }\r\n\r\n const view = componentDef.view;\r\n let msgBus = componentDef.msgBus;\r\n\r\n const bindings = new Map<PropertyKey, Binding>();\r\n\r\n const componentMsgBus = lazy(() => {\r\n return getComponentMsgBus(msgBus, (headers) => {\r\n if (headers?.sourceId == undefined) {\r\n headers.sourceId = component.id;\r\n }\r\n }); // as ComponentModel<TStruct>['msgBus']\r\n });\r\n\r\n let msgBroker = {\r\n ...componentDef.msgBroker,\r\n };\r\n\r\n if (!msgBroker.abortController) {\r\n msgBroker.abortController = new AbortController();\r\n }\r\n\r\n const context = useComponentContext();\r\n\r\n const ViewFC = observer((props: ComponentViewProps) => {\r\n const context = useComponentContext();\r\n const parentId = context.currentId;\r\n\r\n component.parentId = parentId;\r\n\r\n if (!msgBus) {\r\n msgBus = context.msgBus;\r\n }\r\n\r\n if (!component.id) {\r\n let id = params.$id;\r\n if (!id) {\r\n const key = params.$key;\r\n if (key) {\r\n id = `${toHtmlId(regType)}#${key}`;\r\n } else {\r\n id = context.getNextId(regType);\r\n }\r\n }\r\n component.id = id;\r\n }\r\n\r\n useLayoutEffect(() => {\r\n try {\r\n context.register(component.id, regType, parentId);\r\n\r\n if (getGlobalFlags().debug) {\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>layout`);\r\n }\r\n\r\n registerMsgBroker(component);\r\n\r\n componentDef.events?.onLayout?.(component);\r\n params.onLayout?.(component);\r\n } catch (err) {\r\n componentDef.events?.onError?.(component, err);\r\n params.onError?.(component, err);\r\n }\r\n\r\n return () => {\r\n if (getGlobalFlags().debug) {\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>layout-destroy`);\r\n }\r\n context.unregister(component.id);\r\n\r\n msgBroker.abortController?.abort();\r\n\r\n componentDef.events?.onLayoutDestroy?.(component);\r\n params.onLayoutDestroy?.(component);\r\n };\r\n }, [componentDef, params, context]);\r\n\r\n useEffect(() => {\r\n try {\r\n if (getGlobalFlags().debug) {\r\n // mount\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>ready`);\r\n }\r\n componentDef.events?.onReady?.(component);\r\n params.onReady?.(component);\r\n } catch (err) {\r\n if (getGlobalFlags().debug) {\r\n // unmount\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>destroy`);\r\n }\r\n componentDef.events?.onError?.(component, err);\r\n params.onError?.(component, err);\r\n }\r\n return () => {\r\n componentDef.events?.onDestroy?.(component);\r\n params.onDestroy?.(component);\r\n };\r\n }, [componentDef, params, context]);\r\n\r\n let content: React.ReactNode;\r\n // let content: any;\r\n try {\r\n if (getGlobalFlags().debug) {\r\n // render\r\n const hierarchyId = component.getHierarchyId();\r\n console.debug(`${hierarchyId}>view`);\r\n }\r\n if (typeof view === 'function') {\r\n content = view(props, component);\r\n } else {\r\n // content = props.children;\r\n content = <>{props.children}</>;\r\n }\r\n } catch (err) {\r\n // throw err;\r\n const errDetails = JSON.stringify(err);\r\n // msgBus.send\r\n content = <>{errDetails}</>;\r\n }\r\n const scopeContext = useMemo(\r\n () => ({ ...context, currentId: component.id }),\r\n [componentDef, params, context],\r\n );\r\n return (\r\n <ReactComponentContext.Provider value={scopeContext}>\r\n {content}\r\n </ReactComponentContext.Provider>\r\n );\r\n });\r\n\r\n const children = {} as ComponentChildren<TStruct['children']>;\r\n\r\n model = {} as Mutable<ComponentModel<TStruct>>;\r\n\r\n if (componentDef.props) {\r\n Object.assign(model, componentDef.props);\r\n }\r\n\r\n if (componentDef.actions) {\r\n Object.assign(model, componentDef.actions);\r\n }\r\n\r\n if (componentDef.children) {\r\n for (const [key, value] of Object.entries(componentDef.children)) {\r\n if (typeof value == 'function') {\r\n const view = value as (params: any) => Component;\r\n const ChildViewFC: ComponentViewImplFn<TStruct> = (props) => {\r\n const c = view(props);\r\n return <c.View />;\r\n // if (typeof c.view === \"function\") {\r\n // return c.view(props);\r\n // }\r\n // return <>{props.children}</>;\r\n };\r\n Reflect.set(children, capitalize(key), ChildViewFC);\r\n } else {\r\n Reflect.set(children, key, value);\r\n }\r\n }\r\n }\r\n\r\n // Reflect.ownKeys/Object.keys\r\n for (const [key, value] of Object.entries(params)) {\r\n // model.hasOwnProperty(key)\r\n if (key in model) {\r\n if (isBinding(value)) {\r\n bindings.set(key, value);\r\n } else {\r\n Reflect.set(model, key, value);\r\n }\r\n }\r\n }\r\n\r\n const proxyEventHandlers: Pick<ProxyEventHandlers, 'onPropChanging' | 'onPropChange'> = {\r\n onPropChanging:\r\n params.onPropChanging || componentDef.events?.onPropChanging\r\n ? (prop, oldValue, newValue) => {\r\n let result = true;\r\n let handler = params.onPropChanging;\r\n if (handler) {\r\n result = handler(String(prop), oldValue, newValue);\r\n }\r\n if (result) {\r\n handler = componentDef.events?.onPropChanging;\r\n if (handler) {\r\n result = handler(String(prop), oldValue, newValue);\r\n }\r\n }\r\n return result;\r\n }\r\n : undefined,\r\n onPropChange:\r\n params.onPropChange || componentDef.events?.onPropChange\r\n ? (prop, value) => {\r\n params.onPropChange?.(String(prop), value);\r\n componentDef.events?.onPropChange?.(String(prop), value);\r\n }\r\n : undefined,\r\n };\r\n\r\n function resolveOnGetEventHandler(prop: string) {\r\n const key = `${$ON_GET}${capitalize(prop)}`;\r\n return params[key] || componentDef.events?.[key];\r\n }\r\n\r\n function resolveOnChangingEventHandler(prop: string) {\r\n const key = `${$ON_CHANGING}${capitalize(prop)}`;\r\n return ((oldValue: any, newValue: any) => {\r\n let result = true;\r\n let handler = params[key] as ValueChangingHandler<any>;\r\n if (handler) {\r\n result = handler(oldValue, newValue);\r\n }\r\n if (result) {\r\n handler = componentDef.events?.[key] as ValueChangingHandler<any>;\r\n if (handler) {\r\n result = handler(oldValue, newValue);\r\n }\r\n }\r\n return result;\r\n }) as ValueChangingHandler;\r\n }\r\n\r\n function resolveOnChangeEventHandler(prop: string) {\r\n const key = `${$ON_CHANGE}${capitalize(prop)}`;\r\n return ((value: any) => {\r\n (params[key] as ValueChangeHandler<any>)?.(value);\r\n (componentDef.events?.[key] as ValueChangeHandler<any>)?.(value);\r\n }) as ValueChangeHandler;\r\n }\r\n\r\n let annotationMap: Record<string, any> = {};\r\n\r\n if (componentDef.props) {\r\n for (const prop of Object.keys(componentDef.props)) {\r\n proxyEventHandlers[prop] = {\r\n onGet: resolveOnGetEventHandler(prop),\r\n onChanging: resolveOnChangingEventHandler(prop),\r\n onChange: resolveOnChangeEventHandler(prop),\r\n };\r\n }\r\n\r\n for (const key of Object.keys(componentDef.props)) {\r\n annotationMap[key] = observable.deep;\r\n }\r\n }\r\n\r\n if (componentDef.actions) {\r\n const annotationMap: Record<string, any> = {};\r\n for (const key of Object.keys(componentDef.actions)) {\r\n annotationMap[key] = action;\r\n }\r\n }\r\n\r\n model = observable(model, annotationMap, {\r\n deep: true,\r\n });\r\n\r\n model = createRecursiveProxy(model, bindings, proxyEventHandlers);\r\n\r\n let effects: Record<string, EffectController> = {};\r\n component = {\r\n id: params.$id,\r\n key: params.$key,\r\n regType: regType,\r\n parentId: undefined,\r\n getHierarchyId: () => context.getHierarchyPath(component.id),\r\n getChainDown: () => context.getChainDown(component.id),\r\n getChainUp: () => context.getChainUp(component.id),\r\n getChildren: () => context.getChildren(component.id),\r\n getParent: () => context.getParent(component.id),\r\n getNodeMap: () => context.getNodeMap(),\r\n bindings: bindings,\r\n get msgBus() {\r\n return componentMsgBus();\r\n },\r\n msgBroker: msgBroker,\r\n effects: effects,\r\n // view: componentDef.view,\r\n View: ViewFC,\r\n children: children,\r\n model: model,\r\n };\r\n\r\n if (componentDef.effects) {\r\n for (const [name, fn] of Object.entries(componentDef.effects)) {\r\n effects[name] = createEffect(\r\n component,\r\n name,\r\n fn as EffectFn<TStruct, ComponentMsgHeaders>,\r\n );\r\n }\r\n }\r\n\r\n if (componentDef.events?.onInit) {\r\n componentDef.events.onInit(component);\r\n }\r\n\r\n if (params.onInit) {\r\n params.onInit(component);\r\n }\r\n\r\n return component;\r\n}\r\n\r\nexport function useComponent<\r\n TStruct extends ComponentStruct = ComponentStruct,\r\n TMsgHeaders extends ComponentMsgHeaders = ComponentMsgHeaders,\r\n>(componentDef: ComponentDef<TStruct, TMsgHeaders>, params: ComponentParams<TStruct>) {\r\n const ref = useLazyRef(() => createComponent(componentDef, params));\r\n useLayoutEffect(() => {\r\n return () => {\r\n ref.current = null;\r\n };\r\n }, []); // [params]?\r\n return ref.current;\r\n}\r\n\r\n// asFC/toFC\r\nexport function getFC<TStruct extends ComponentStruct>(\r\n factory: (params: ComponentParams<TStruct>) => Component<TStruct>,\r\n): FC<ComponentParams<TStruct>> {\r\n const result = (params: ComponentParams<TStruct> & PropsWithChildren) => {\r\n // componentHook\r\n const c = factory(params); // without useRef!\r\n // return c.view();\r\n return <c.View {...params} />;\r\n };\r\n return result;\r\n}\r\n\r\n// TODO:\r\n// do not observe props with \"_\", \"$\" prefixes\r\n"],"names":["capitalize","name","cleanSourceRef","sourceRef","createComponent","componentDef","params","component","model","regType","getComponentSourceByCaller","view","msgBus","bindings","componentMsgBus","lazy","getComponentMsgBus","headers","msgBroker","context","useComponentContext","ViewFC","observer","props","parentId","id","key","toHtmlId","useLayoutEffect","getGlobalFlags","hierarchyId","registerMsgBroker","err","useEffect","content","React","errDetails","scopeContext","useMemo","ReactComponentContext","children","value","ChildViewFC","c","isBinding","proxyEventHandlers","prop","oldValue","newValue","result","handler","resolveOnGetEventHandler","$ON_GET","resolveOnChangingEventHandler","$ON_CHANGING","resolveOnChangeEventHandler","$ON_CHANGE","annotationMap","observable","createRecursiveProxy","effects","fn","createEffect","useComponent","ref","useLazyRef","getFC","factory"],"mappings":"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"}
@@ -1,6 +1,8 @@
1
- import { PropsWithChildren } from 'react';
1
+ import { BaseAppMsgStruct } from '../appDomain/appContracts';
2
2
  import { MsgProviderAdapter } from '../componentModel/adapters';
3
- export declare function ServiceProvider(props: PropsWithChildren<{
4
- adapters?: MsgProviderAdapter[];
5
- }>): any;
3
+ import { MsgBus } from '@actdim/msgmesh/contracts';
4
+ export declare function createServiceProvider(msgBus: MsgBus<BaseAppMsgStruct>, adapters?: MsgProviderAdapter[], abortSignal?: AbortSignal): {
5
+ adapters: MsgProviderAdapter[];
6
+ abortSignal: AbortSignal;
7
+ };
6
8
  //# sourceMappingURL=ServiceProvider.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"ServiceProvider.d.ts","sourceRoot":"","sources":["../../src/services/ServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAoB,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAEnD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC,EAAE,kBAAkB,EAAE,EAAE,WAAW,CAAC,EAAE,WAAW;;;EAUjI"}
@@ -1,17 +1,12 @@
1
- import { useComponentContext as o } from "../componentModel/componentContext.es.js";
2
- import n, { createContext as a, useLayoutEffect as c } from "react";
3
- import { registerAdapters as s } from "../componentModel/adapters.es.js";
4
- const i = a(void 0);
5
- function l(t) {
6
- const e = o();
7
- return c(() => {
8
- const r = new AbortController();
9
- return s(e.msgBus, t.adapters, r.signal), () => {
10
- r.abort();
11
- };
12
- }, [e.msgBus, t.adapters]), /* @__PURE__ */ n.createElement(i.Provider, { value: t.adapters }, t.children);
1
+ import { registerAdapters as n } from "../componentModel/adapters.es.js";
2
+ function i(o, e, r) {
3
+ const t = new AbortController();
4
+ return r && (r = AbortSignal.any([r, t.signal])), n(o, e, r), {
5
+ adapters: e,
6
+ abortSignal: r
7
+ };
13
8
  }
14
9
  export {
15
- l as ServiceProvider
10
+ i as createServiceProvider
16
11
  };
17
12
  //# sourceMappingURL=ServiceProvider.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ServiceProvider.es.js","sources":["../../src/services/ServiceProvider.tsx"],"sourcesContent":["import { useComponentContext } from '@/componentModel/componentContext';\r\nimport { createContext, PropsWithChildren, useLayoutEffect } from 'react';\r\nimport { MsgProviderAdapter, registerAdapters } from '../componentModel/adapters';\r\nimport React from 'react';\r\n\r\nconst ReactContext = createContext<MsgProviderAdapter[]>(undefined);\r\n\r\nexport function ServiceProvider(\r\n props: PropsWithChildren<{\r\n adapters?: MsgProviderAdapter[];\r\n }>,\r\n) {\r\n const context = useComponentContext();\r\n useLayoutEffect(() => {\r\n const abortController = new AbortController();\r\n registerAdapters(context.msgBus, props.adapters, abortController.signal);\r\n return () => {\r\n abortController.abort();\r\n };\r\n }, [context.msgBus, props.adapters]);\r\n\r\n return <ReactContext.Provider value={props.adapters}>{props.children}</ReactContext.Provider>;\r\n}\r\n"],"names":["ReactContext","createContext","ServiceProvider","props","context","useComponentContext","useLayoutEffect","abortController","registerAdapters","React"],"mappings":";;;AAKA,MAAMA,IAAeC,EAAoC,MAAS;AAE3D,SAASC,EACZC,GAGF;AACE,QAAMC,IAAUC,EAAA;AAChB,SAAAC,EAAgB,MAAM;AAClB,UAAMC,IAAkB,IAAI,gBAAA;AAC5B,WAAAC,EAAiBJ,EAAQ,QAAQD,EAAM,UAAUI,EAAgB,MAAM,GAChE,MAAM;AACT,MAAAA,EAAgB,MAAA;AAAA,IACpB;AAAA,EACJ,GAAG,CAACH,EAAQ,QAAQD,EAAM,QAAQ,CAAC,GAE5B,gBAAAM,EAAA,cAACT,EAAa,UAAb,EAAsB,OAAOG,EAAM,SAAA,GAAWA,EAAM,QAAS;AACzE;"}
1
+ {"version":3,"file":"ServiceProvider.es.js","sources":["../../src/services/ServiceProvider.ts"],"sourcesContent":["import { BaseAppMsgStruct } from '@/appDomain/appContracts';\r\nimport { MsgProviderAdapter, registerAdapters } from '../componentModel/adapters';\r\nimport { MsgBus } from '@actdim/msgmesh/contracts';\r\n\r\nexport function createServiceProvider(msgBus: MsgBus<BaseAppMsgStruct>, adapters?: MsgProviderAdapter[], abortSignal?: AbortSignal) {\r\n const abortController = new AbortController();\r\n if (abortSignal) {\r\n abortSignal = AbortSignal.any([abortSignal, abortController.signal]);\r\n }\r\n registerAdapters(msgBus, adapters, abortSignal);\r\n return {\r\n adapters,\r\n abortSignal\r\n }\r\n}\r\n\r\n"],"names":["createServiceProvider","msgBus","adapters","abortSignal","abortController","registerAdapters"],"mappings":";AAIO,SAASA,EAAsBC,GAAkCC,GAAiCC,GAA2B;AAChI,QAAMC,IAAkB,IAAI,gBAAA;AAC5B,SAAID,MACAA,IAAc,YAAY,IAAI,CAACA,GAAaC,EAAgB,MAAM,CAAC,IAEvEC,EAAiBJ,GAAQC,GAAUC,CAAW,GACvC;AAAA,IACH,UAAAD;AAAA,IACA,aAAAC;AAAA,EAAA;AAER;"}