@platforma-sdk/ui-vue 1.42.42 → 1.42.44

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 (62) hide show
  1. package/.turbo/turbo-build.log +34 -33
  2. package/.turbo/turbo-type-check.log +1 -1
  3. package/CHANGELOG.md +7 -0
  4. package/dist/AgGridVue/createAgGridColDef.js +3 -2
  5. package/dist/AgGridVue/createAgGridColDef.js.map +1 -1
  6. package/dist/AgGridVue/useAgGridOptions.js +3 -2
  7. package/dist/AgGridVue/useAgGridOptions.js.map +1 -1
  8. package/dist/components/PlAgDataTable/PlAgDataTableSheets.vue2.js +3 -2
  9. package/dist/components/PlAgDataTable/PlAgDataTableSheets.vue2.js.map +1 -1
  10. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js +3 -2
  11. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js.map +1 -1
  12. package/dist/components/PlAgDataTable/PlAgRowCount.vue.js +3 -2
  13. package/dist/components/PlAgDataTable/PlAgRowCount.vue.js.map +1 -1
  14. package/dist/components/PlAgDataTable/sources/focus-row.js +21 -20
  15. package/dist/components/PlAgDataTable/sources/focus-row.js.map +1 -1
  16. package/dist/components/PlAgDataTable/sources/table-source-v2.js +3 -2
  17. package/dist/components/PlAgDataTable/sources/table-source-v2.js.map +1 -1
  18. package/dist/components/PlAgDataTable/sources/table-state-v2.js +3 -2
  19. package/dist/components/PlAgDataTable/sources/table-state-v2.js.map +1 -1
  20. package/dist/components/PlAgDataTable/types.js +10 -9
  21. package/dist/components/PlAgDataTable/types.js.map +1 -1
  22. package/dist/components/PlAgRowNumCheckbox/PlAgRowNumCheckbox.vue.js +12 -11
  23. package/dist/components/PlAgRowNumCheckbox/PlAgRowNumCheckbox.vue.js.map +1 -1
  24. package/dist/components/PlAgRowNumHeader.vue.js +9 -8
  25. package/dist/components/PlAgRowNumHeader.vue.js.map +1 -1
  26. package/dist/components/PlAnnotations/components/AnnotationsSidebar.vue2.js +3 -2
  27. package/dist/components/PlAnnotations/components/AnnotationsSidebar.vue2.js.map +1 -1
  28. package/dist/components/PlAnnotations/components/DynamicForm.vue2.js +3 -2
  29. package/dist/components/PlAnnotations/components/DynamicForm.vue2.js.map +1 -1
  30. package/dist/components/PlAnnotations/components/FilterSidebar.vue2.js +3 -2
  31. package/dist/components/PlAnnotations/components/FilterSidebar.vue2.js.map +1 -1
  32. package/dist/components/PlAnnotations/components/PlAnnotationsModal.vue2.js +10 -9
  33. package/dist/components/PlAnnotations/components/PlAnnotationsModal.vue2.js.map +1 -1
  34. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js +3 -2
  35. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js.map +1 -1
  36. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue2.js +3 -2
  37. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue2.js.map +1 -1
  38. package/dist/components/PlMultiSequenceAlignment/data.js +9 -8
  39. package/dist/components/PlMultiSequenceAlignment/data.js.map +1 -1
  40. package/dist/components/PlTableFilters/PlTableAddFilterV2.vue.js +3 -2
  41. package/dist/components/PlTableFilters/PlTableAddFilterV2.vue.js.map +1 -1
  42. package/dist/components/PlTableFilters/PlTableFilterEntryV2.vue.js +3 -2
  43. package/dist/components/PlTableFilters/PlTableFilterEntryV2.vue.js.map +1 -1
  44. package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js +3 -2
  45. package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js.map +1 -1
  46. package/dist/components/PlTableFilters/filters-state.js +10 -9
  47. package/dist/components/PlTableFilters/filters-state.js.map +1 -1
  48. package/dist/createModel.js +3 -2
  49. package/dist/createModel.js.map +1 -1
  50. package/dist/defineApp.js +9 -8
  51. package/dist/defineApp.js.map +1 -1
  52. package/dist/internal/UpdateSerializer.js +11 -10
  53. package/dist/internal/UpdateSerializer.js.map +1 -1
  54. package/dist/internal/createAppModel.js +12 -11
  55. package/dist/internal/createAppModel.js.map +1 -1
  56. package/dist/internal/createAppV1.js +3 -2
  57. package/dist/internal/createAppV1.js.map +1 -1
  58. package/dist/internal/createAppV2.js +14 -13
  59. package/dist/internal/createAppV2.js.map +1 -1
  60. package/dist/lib/util/helpers/dist/test_timeouts.js +28 -0
  61. package/dist/lib/util/helpers/dist/test_timeouts.js.map +1 -0
  62. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"defineApp.js","sources":["../src/defineApp.ts"],"sourcesContent":["import { notEmpty } from '@milaboratories/helpers';\nimport type { PlatformaV1, PlatformaV2 } from '@platforma-sdk/model';\nimport { getPlatformaApiVersion, unwrapResult, type BlockOutputsBase, type Platforma } from '@platforma-sdk/model';\nimport type { Component, Reactive } from 'vue';\nimport { inject, markRaw, reactive } from 'vue';\nimport { createAppV1, type BaseAppV1 } from './internal/createAppV1';\nimport { createAppV2, type BaseAppV2 } from './internal/createAppV2';\nimport type { AppSettings, ExtendSettings, Routes } from './types';\nimport { activateAgGrid } from './aggrid';\n\nconst pluginKey = Symbol('sdk-vue');\n\nexport function useSdkPlugin(): SdkPlugin {\n return inject(pluginKey)!;\n}\n\nexport function defineApp<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n Extend extends ExtendSettings<Href> = ExtendSettings<Href>,\n>(\n platforma: PlatformaV1<Args, Outputs, UiState, Href>,\n extendApp: (app: BaseAppV1<Args, Outputs, UiState, Href>) => Extend,\n settings?: AppSettings,\n): SdkPluginV1<Args, Outputs, UiState, Href, Extend>;\n\nexport function defineApp<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n Extend extends ExtendSettings<Href> = ExtendSettings<Href>,\n>(\n platforma: PlatformaV2<Args, Outputs, UiState, Href>,\n extendApp: (app: BaseAppV2<Args, Outputs, UiState, Href>) => Extend,\n settings?: AppSettings,\n): SdkPluginV2<Args, Outputs, UiState, Href, Extend>;\n\nexport function defineApp<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n Extend extends ExtendSettings<Href> = ExtendSettings<Href>,\n>(\n platforma: Platforma<Args, Outputs, UiState, Href>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n extendApp: (app: any) => Extend,\n settings: AppSettings = {},\n): SdkPlugin<Args, Outputs, UiState, Href, Extend> {\n let app: undefined | AppV1<Args, Outputs, UiState, Href, Extend> | AppV2<Args, Outputs, UiState, Href, Extend> = undefined;\n\n activateAgGrid();\n\n const runtimeApiVersion = platforma.apiVersion ?? 1; // undefined means 1 (backward compatibility)\n\n const blockRequestedApiVersion = getPlatformaApiVersion();\n\n const loadApp = async () => {\n if (blockRequestedApiVersion !== runtimeApiVersion) {\n throw new Error(`Block requested API version ${blockRequestedApiVersion} but runtime API version is ${runtimeApiVersion}.\n Please update the desktop app to use the latest API version.`);\n }\n\n if (platforma.apiVersion === undefined || platforma.apiVersion === 1) {\n await platforma\n .loadBlockState()\n .then((state) => {\n plugin.loaded = true;\n const baseApp = createAppV1<Args, Outputs, UiState, Href>(state, platforma, settings);\n\n const localState = extendApp(baseApp);\n\n const routes = Object.fromEntries(\n Object.entries(localState.routes as Routes<Href>).map(([href, component]) => {\n const c = typeof component === 'function' ? component() : component;\n return [href, markRaw(c as Component)];\n }),\n );\n\n app = Object.assign(baseApp, {\n ...localState,\n getRoute(href: Href): Component | undefined {\n return routes[href];\n },\n } as unknown as AppV1<Args, Outputs, UiState, Href, Extend>);\n });\n } else if (platforma.apiVersion === 2) {\n await platforma\n .loadBlockState()\n .then((stateOrError) => {\n const state = unwrapResult(stateOrError);\n plugin.loaded = true;\n const baseApp = createAppV2<Args, Outputs, UiState, Href>(state, platforma, settings);\n\n const localState = extendApp(baseApp);\n\n const routes = Object.fromEntries(\n Object.entries(localState.routes as Routes<Href>).map(([href, component]) => {\n const c = typeof component === 'function' ? component() : component;\n return [href, markRaw(c as Component)];\n }),\n );\n\n app = Object.assign(baseApp, {\n ...localState,\n getRoute(href: Href): Component | undefined {\n return routes[href];\n },\n } as unknown as AppV2<Args, Outputs, UiState, Href, Extend>);\n });\n }\n };\n\n const plugin = reactive({\n loaded: false,\n error: undefined as unknown,\n // Href to get typed query parameters for a specific route\n useApp<PageHref extends Href = Href>() {\n return notEmpty(app, 'App is not loaded') as App<Args, Outputs, UiState, PageHref, Extend>;\n },\n // @todo type portability issue with Vue\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n install(app: any) {\n app.provide(pluginKey, this);\n loadApp().catch((err) => {\n console.error('load initial state error', err);\n plugin.error = err;\n });\n },\n });\n\n return plugin as SdkPlugin<Args, Outputs, UiState, Href, Extend>;\n}\n\nexport type AppV1<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n Local extends ExtendSettings<Href> = ExtendSettings<Href>,\n> = (BaseAppV1<Args, Outputs, UiState, Href>) & Reactive<Omit<Local, 'routes'>> & { getRoute(href: Href): Component | undefined };\n\nexport type AppV2<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n Local extends ExtendSettings<Href> = ExtendSettings<Href>,\n> = (BaseAppV2<Args, Outputs, UiState, Href>) & Reactive<Omit<Local, 'routes'>> & { getRoute(href: Href): Component | undefined };\n\nexport type App<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n Local extends ExtendSettings<Href> = ExtendSettings<Href>,\n> = AppV1<Args, Outputs, UiState, Href, Local> | AppV2<Args, Outputs, UiState, Href, Local>;\n\nexport type SdkPluginV1<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n Local extends ExtendSettings<Href> = ExtendSettings<Href>,\n> = {\n loaded: boolean;\n error: unknown;\n useApp<PageHref extends Href = Href>(): AppV1<Args, Outputs, UiState, PageHref, Local>;\n install(app: unknown): void;\n};\n\nexport type SdkPluginV2<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n Local extends ExtendSettings<Href> = ExtendSettings<Href>,\n> = {\n loaded: boolean;\n error: unknown;\n useApp<PageHref extends Href = Href>(): AppV2<Args, Outputs, UiState, PageHref, Local>;\n install(app: unknown): void;\n};\n\nexport type SdkPlugin<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n Local extends ExtendSettings<Href> = ExtendSettings<Href>,\n> = SdkPluginV1<Args, Outputs, UiState, Href, Local> | SdkPluginV2<Args, Outputs, UiState, Href, Local>;\n"],"names":["pluginKey","useSdkPlugin","inject","defineApp","platforma","extendApp","settings","app","activateAgGrid","runtimeApiVersion","blockRequestedApiVersion","getPlatformaApiVersion","loadApp","state","plugin","baseApp","createAppV1","localState","routes","href","component","c","markRaw","stateOrError","unwrapResult","createAppV2","reactive","notEmpty","err"],"mappings":";;;;;;AAUA,MAAMA,IAAY,OAAO,SAAS;AAE3B,SAASC,IAA0B;AACxC,SAAOC,EAAOF,CAAS;AACzB;AA0BO,SAASG,EAOdC,GAEAC,GACAC,IAAwB,CAAA,GACyB;AACjD,MAAIC;AAEJ,EAAAC,EAAA;AAEA,QAAMC,IAAoBL,EAAU,cAAc,GAE5CM,IAA2BC,EAAA,GAE3BC,IAAU,YAAY;AAC1B,QAAIF,MAA6BD;AAC/B,YAAM,IAAI,MAAM,+BAA+BC,CAAwB,+BAA+BD,CAAiB;AAAA,mEAC1D;AAG/D,IAAIL,EAAU,eAAe,UAAaA,EAAU,eAAe,IACjE,MAAMA,EACH,eAAA,EACA,KAAK,CAACS,MAAU;AACf,MAAAC,EAAO,SAAS;AAChB,YAAMC,IAAUC,EAA0CH,GAAOT,GAAWE,CAAQ,GAE9EW,IAAaZ,EAAUU,CAAO,GAE9BG,IAAS,OAAO;AAAA,QACpB,OAAO,QAAQD,EAAW,MAAsB,EAAE,IAAI,CAAC,CAACE,GAAMC,CAAS,MAAM;AAC3E,gBAAMC,IAAI,OAAOD,KAAc,aAAaA,MAAcA;AAC1D,iBAAO,CAACD,GAAMG,EAAQD,CAAc,CAAC;AAAA,QACvC,CAAC;AAAA,MAAA;AAGH,MAAAd,IAAM,OAAO,OAAOQ,GAAS;AAAA,QAC3B,GAAGE;AAAA,QACH,SAASE,GAAmC;AAC1C,iBAAOD,EAAOC,CAAI;AAAA,QACpB;AAAA,MAAA,CACyD;AAAA,IAC7D,CAAC,IACMf,EAAU,eAAe,KAClC,MAAMA,EACH,eAAA,EACA,KAAK,CAACmB,MAAiB;AACtB,YAAMV,IAAQW,EAAaD,CAAY;AACvC,MAAAT,EAAO,SAAS;AAChB,YAAMC,IAAUU,EAA0CZ,GAAOT,GAAWE,CAAQ,GAE9EW,IAAaZ,EAAUU,CAAO,GAE9BG,IAAS,OAAO;AAAA,QACpB,OAAO,QAAQD,EAAW,MAAsB,EAAE,IAAI,CAAC,CAACE,GAAMC,CAAS,MAAM;AAC3E,gBAAMC,IAAI,OAAOD,KAAc,aAAaA,MAAcA;AAC1D,iBAAO,CAACD,GAAMG,EAAQD,CAAc,CAAC;AAAA,QACvC,CAAC;AAAA,MAAA;AAGH,MAAAd,IAAM,OAAO,OAAOQ,GAAS;AAAA,QAC3B,GAAGE;AAAA,QACH,SAASE,GAAmC;AAC1C,iBAAOD,EAAOC,CAAI;AAAA,QACpB;AAAA,MAAA,CACyD;AAAA,IAC7D,CAAC;AAAA,EAEP,GAEML,IAASY,EAAS;AAAA,IACtB,QAAQ;AAAA,IACR,OAAO;AAAA;AAAA,IAEP,SAAuC;AACrC,aAAOC,EAASpB,GAAK,mBAAmB;AAAA,IAC1C;AAAA;AAAA;AAAA,IAGA,QAAQA,GAAU;AAChBA,MAAAA,EAAI,QAAQP,GAAW,IAAI,GAC3BY,EAAA,EAAU,MAAM,CAACgB,MAAQ;AACvB,gBAAQ,MAAM,4BAA4BA,CAAG,GAC7Cd,EAAO,QAAQc;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,EAAA,CACD;AAED,SAAOd;AACT;"}
1
+ {"version":3,"file":"defineApp.js","sources":["../src/defineApp.ts"],"sourcesContent":["import { notEmpty } from '@milaboratories/helpers';\nimport type { PlatformaV1, PlatformaV2 } from '@platforma-sdk/model';\nimport { getPlatformaApiVersion, unwrapResult, type BlockOutputsBase, type Platforma } from '@platforma-sdk/model';\nimport type { Component, Reactive } from 'vue';\nimport { inject, markRaw, reactive } from 'vue';\nimport { createAppV1, type BaseAppV1 } from './internal/createAppV1';\nimport { createAppV2, type BaseAppV2 } from './internal/createAppV2';\nimport type { AppSettings, ExtendSettings, Routes } from './types';\nimport { activateAgGrid } from './aggrid';\n\nconst pluginKey = Symbol('sdk-vue');\n\nexport function useSdkPlugin(): SdkPlugin {\n return inject(pluginKey)!;\n}\n\nexport function defineApp<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n Extend extends ExtendSettings<Href> = ExtendSettings<Href>,\n>(\n platforma: PlatformaV1<Args, Outputs, UiState, Href>,\n extendApp: (app: BaseAppV1<Args, Outputs, UiState, Href>) => Extend,\n settings?: AppSettings,\n): SdkPluginV1<Args, Outputs, UiState, Href, Extend>;\n\nexport function defineApp<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n Extend extends ExtendSettings<Href> = ExtendSettings<Href>,\n>(\n platforma: PlatformaV2<Args, Outputs, UiState, Href>,\n extendApp: (app: BaseAppV2<Args, Outputs, UiState, Href>) => Extend,\n settings?: AppSettings,\n): SdkPluginV2<Args, Outputs, UiState, Href, Extend>;\n\nexport function defineApp<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n Extend extends ExtendSettings<Href> = ExtendSettings<Href>,\n>(\n platforma: Platforma<Args, Outputs, UiState, Href>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n extendApp: (app: any) => Extend,\n settings: AppSettings = {},\n): SdkPlugin<Args, Outputs, UiState, Href, Extend> {\n let app: undefined | AppV1<Args, Outputs, UiState, Href, Extend> | AppV2<Args, Outputs, UiState, Href, Extend> = undefined;\n\n activateAgGrid();\n\n const runtimeApiVersion = platforma.apiVersion ?? 1; // undefined means 1 (backward compatibility)\n\n const blockRequestedApiVersion = getPlatformaApiVersion();\n\n const loadApp = async () => {\n if (blockRequestedApiVersion !== runtimeApiVersion) {\n throw new Error(`Block requested API version ${blockRequestedApiVersion} but runtime API version is ${runtimeApiVersion}.\n Please update the desktop app to use the latest API version.`);\n }\n\n if (platforma.apiVersion === undefined || platforma.apiVersion === 1) {\n await platforma\n .loadBlockState()\n .then((state) => {\n plugin.loaded = true;\n const baseApp = createAppV1<Args, Outputs, UiState, Href>(state, platforma, settings);\n\n const localState = extendApp(baseApp);\n\n const routes = Object.fromEntries(\n Object.entries(localState.routes as Routes<Href>).map(([href, component]) => {\n const c = typeof component === 'function' ? component() : component;\n return [href, markRaw(c as Component)];\n }),\n );\n\n app = Object.assign(baseApp, {\n ...localState,\n getRoute(href: Href): Component | undefined {\n return routes[href];\n },\n } as unknown as AppV1<Args, Outputs, UiState, Href, Extend>);\n });\n } else if (platforma.apiVersion === 2) {\n await platforma\n .loadBlockState()\n .then((stateOrError) => {\n const state = unwrapResult(stateOrError);\n plugin.loaded = true;\n const baseApp = createAppV2<Args, Outputs, UiState, Href>(state, platforma, settings);\n\n const localState = extendApp(baseApp);\n\n const routes = Object.fromEntries(\n Object.entries(localState.routes as Routes<Href>).map(([href, component]) => {\n const c = typeof component === 'function' ? component() : component;\n return [href, markRaw(c as Component)];\n }),\n );\n\n app = Object.assign(baseApp, {\n ...localState,\n getRoute(href: Href): Component | undefined {\n return routes[href];\n },\n } as unknown as AppV2<Args, Outputs, UiState, Href, Extend>);\n });\n }\n };\n\n const plugin = reactive({\n loaded: false,\n error: undefined as unknown,\n // Href to get typed query parameters for a specific route\n useApp<PageHref extends Href = Href>() {\n return notEmpty(app, 'App is not loaded') as App<Args, Outputs, UiState, PageHref, Extend>;\n },\n // @todo type portability issue with Vue\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n install(app: any) {\n app.provide(pluginKey, this);\n loadApp().catch((err) => {\n console.error('load initial state error', err);\n plugin.error = err;\n });\n },\n });\n\n return plugin as SdkPlugin<Args, Outputs, UiState, Href, Extend>;\n}\n\nexport type AppV1<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n Local extends ExtendSettings<Href> = ExtendSettings<Href>,\n> = (BaseAppV1<Args, Outputs, UiState, Href>) & Reactive<Omit<Local, 'routes'>> & { getRoute(href: Href): Component | undefined };\n\nexport type AppV2<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n Local extends ExtendSettings<Href> = ExtendSettings<Href>,\n> = (BaseAppV2<Args, Outputs, UiState, Href>) & Reactive<Omit<Local, 'routes'>> & { getRoute(href: Href): Component | undefined };\n\nexport type App<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n Local extends ExtendSettings<Href> = ExtendSettings<Href>,\n> = AppV1<Args, Outputs, UiState, Href, Local> | AppV2<Args, Outputs, UiState, Href, Local>;\n\nexport type SdkPluginV1<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n Local extends ExtendSettings<Href> = ExtendSettings<Href>,\n> = {\n loaded: boolean;\n error: unknown;\n useApp<PageHref extends Href = Href>(): AppV1<Args, Outputs, UiState, PageHref, Local>;\n install(app: unknown): void;\n};\n\nexport type SdkPluginV2<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n Local extends ExtendSettings<Href> = ExtendSettings<Href>,\n> = {\n loaded: boolean;\n error: unknown;\n useApp<PageHref extends Href = Href>(): AppV2<Args, Outputs, UiState, PageHref, Local>;\n install(app: unknown): void;\n};\n\nexport type SdkPlugin<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n Local extends ExtendSettings<Href> = ExtendSettings<Href>,\n> = SdkPluginV1<Args, Outputs, UiState, Href, Local> | SdkPluginV2<Args, Outputs, UiState, Href, Local>;\n"],"names":["pluginKey","useSdkPlugin","inject","defineApp","platforma","extendApp","settings","app","activateAgGrid","runtimeApiVersion","blockRequestedApiVersion","getPlatformaApiVersion","loadApp","state","plugin","baseApp","createAppV1","localState","routes","href","component","c","markRaw","stateOrError","unwrapResult","createAppV2","reactive","notEmpty","err"],"mappings":";;;;;;;AAUA,MAAMA,IAAY,OAAO,SAAS;AAE3B,SAASC,IAA0B;AACxC,SAAOC,EAAOF,CAAS;AACzB;AA0BO,SAASG,EAOdC,GAEAC,GACAC,IAAwB,CAAA,GACyB;AACjD,MAAIC;AAEJ,EAAAC,EAAA;AAEA,QAAMC,IAAoBL,EAAU,cAAc,GAE5CM,IAA2BC,EAAA,GAE3BC,IAAU,YAAY;AAC1B,QAAIF,MAA6BD;AAC/B,YAAM,IAAI,MAAM,+BAA+BC,CAAwB,+BAA+BD,CAAiB;AAAA,mEAC1D;AAG/D,IAAIL,EAAU,eAAe,UAAaA,EAAU,eAAe,IACjE,MAAMA,EACH,eAAA,EACA,KAAK,CAACS,MAAU;AACf,MAAAC,EAAO,SAAS;AAChB,YAAMC,IAAUC,EAA0CH,GAAOT,GAAWE,CAAQ,GAE9EW,IAAaZ,EAAUU,CAAO,GAE9BG,IAAS,OAAO;AAAA,QACpB,OAAO,QAAQD,EAAW,MAAsB,EAAE,IAAI,CAAC,CAACE,GAAMC,CAAS,MAAM;AAC3E,gBAAMC,IAAI,OAAOD,KAAc,aAAaA,MAAcA;AAC1D,iBAAO,CAACD,GAAMG,EAAQD,CAAc,CAAC;AAAA,QACvC,CAAC;AAAA,MAAA;AAGH,MAAAd,IAAM,OAAO,OAAOQ,GAAS;AAAA,QAC3B,GAAGE;AAAA,QACH,SAASE,GAAmC;AAC1C,iBAAOD,EAAOC,CAAI;AAAA,QACpB;AAAA,MAAA,CACyD;AAAA,IAC7D,CAAC,IACMf,EAAU,eAAe,KAClC,MAAMA,EACH,eAAA,EACA,KAAK,CAACmB,MAAiB;AACtB,YAAMV,IAAQW,EAAaD,CAAY;AACvC,MAAAT,EAAO,SAAS;AAChB,YAAMC,IAAUU,EAA0CZ,GAAOT,GAAWE,CAAQ,GAE9EW,IAAaZ,EAAUU,CAAO,GAE9BG,IAAS,OAAO;AAAA,QACpB,OAAO,QAAQD,EAAW,MAAsB,EAAE,IAAI,CAAC,CAACE,GAAMC,CAAS,MAAM;AAC3E,gBAAMC,IAAI,OAAOD,KAAc,aAAaA,MAAcA;AAC1D,iBAAO,CAACD,GAAMG,EAAQD,CAAc,CAAC;AAAA,QACvC,CAAC;AAAA,MAAA;AAGH,MAAAd,IAAM,OAAO,OAAOQ,GAAS;AAAA,QAC3B,GAAGE;AAAA,QACH,SAASE,GAAmC;AAC1C,iBAAOD,EAAOC,CAAI;AAAA,QACpB;AAAA,MAAA,CACyD;AAAA,IAC7D,CAAC;AAAA,EAEP,GAEML,IAASY,EAAS;AAAA,IACtB,QAAQ;AAAA,IACR,OAAO;AAAA;AAAA,IAEP,SAAuC;AACrC,aAAOC,EAASpB,GAAK,mBAAmB;AAAA,IAC1C;AAAA;AAAA;AAAA,IAGA,QAAQA,GAAU;AAChBA,MAAAA,EAAI,QAAQP,GAAW,IAAI,GAC3BY,EAAA,EAAU,MAAM,CAACgB,MAAQ;AACvB,gBAAQ,MAAM,4BAA4BA,CAAG,GAC7Cd,EAAO,QAAQc;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,EAAA,CACD;AAED,SAAOd;AACT;"}
@@ -2,8 +2,9 @@ var u = Object.defineProperty;
2
2
  var c = (e, t, r) => t in e ? u(e, t, { enumerable: !0, configurable: !0, writable: !0, value: r }) : e[t] = r;
3
3
  var i = (e, t, r) => c(e, typeof t != "symbol" ? t + "" : t, r);
4
4
  import { delay as a } from "../lib/util/helpers/dist/utils.js";
5
+ import "../lib/util/helpers/dist/test_timeouts.js";
5
6
  import { hasAbortError as h } from "@platforma-sdk/model";
6
- class y {
7
+ class d {
7
8
  constructor(t = {}) {
8
9
  i(this, "ongoingRun", Promise.resolve(!0));
9
10
  i(this, "ongoingOperation", Promise.resolve());
@@ -18,16 +19,16 @@ class y {
18
19
  while (!t);
19
20
  }
20
21
  async retry(t, r) {
21
- const o = {
22
+ const n = {
22
23
  i: 0
23
24
  };
24
25
  for (; ; )
25
26
  try {
26
- return o.i++, await t();
27
- } catch (n) {
28
- const { delayMs: s } = r(n, o);
29
- if (h(n))
30
- throw n;
27
+ return n.i++, await t();
28
+ } catch (o) {
29
+ const { delayMs: s } = r(o, n);
30
+ if (h(o))
31
+ throw o;
31
32
  await a(s);
32
33
  }
33
34
  }
@@ -51,14 +52,14 @@ class y {
51
52
  }
52
53
  if (this.counter !== r)
53
54
  return !1;
54
- const o = this.retry(() => t(), (n) => (console.warn("UpdateSerializer.run error, retrying...", n), {
55
+ const n = this.retry(() => t(), (o) => (console.warn("UpdateSerializer.run error, retrying...", o), {
55
56
  delayMs: 100
56
57
  // TODO: flexible delay
57
58
  }));
58
- return this.ongoingOperation = o, await o, !0;
59
+ return this.ongoingOperation = n, await n, !0;
59
60
  }
60
61
  }
61
62
  export {
62
- y as UpdateSerializer
63
+ d as UpdateSerializer
63
64
  };
64
65
  //# sourceMappingURL=UpdateSerializer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UpdateSerializer.js","sources":["../../src/internal/UpdateSerializer.ts"],"sourcesContent":["import { delay } from '@milaboratories/helpers';\nimport { hasAbortError } from '@platforma-sdk/model';\n\nexport type RetryState = {\n i: number;\n};\n\nexport type OnNext = (e: unknown, state: RetryState) => { delayMs: number };\n\nexport class UpdateSerializer {\n private ongoingRun: Promise<boolean> = Promise.resolve(true);\n private ongoingOperation: Promise<void> = Promise.resolve();\n private counter = 0;\n\n constructor(private readonly options: {\n debounceSpan?: number;\n } = {}) {}\n\n async allSettled(): Promise<void> {\n await delay(this.options.debounceSpan ?? 0);\n let completed = false;\n do {\n await delay(0);\n completed = await this.ongoingRun.then(() => {\n return true;\n }).catch((e) => {\n console.log('ongoingRun error', e);\n return false;\n });\n } while (!completed);\n }\n\n async retry<T>(\n op: () => Promise<T>,\n onNext: OnNext,\n ): Promise<T> {\n const state: RetryState = {\n i: 0,\n };\n\n while (true) {\n try {\n state.i++;\n return await op();\n } catch (e: unknown) {\n const { delayMs } = onNext(e, state);\n\n if (hasAbortError(e)) {\n throw e;\n }\n\n await delay(delayMs);\n }\n }\n }\n\n /**\n * @returns true if operation succeeded, or false if operation was evicted by a more recent call\n */\n public async run(op: () => Promise<void>): Promise<boolean> {\n return this.ongoingRun = this._run(op);\n }\n\n /**\n * @returns true if operation succeeded, or false if operation was evicted by a more recent call\n */\n private async _run(op: () => Promise<void>): Promise<boolean> {\n // assigning a sequential update id to the call\n this.counter++;\n const myId = this.counter;\n\n if (this.options.debounceSpan) {\n await delay(this.options.debounceSpan);\n }\n\n // checking that this update is still the most recent\n if (this.counter !== myId) {\n // operation was canceled, because another operation was queued\n // after we started waiting for previous operation to finish\n return false;\n }\n\n // awaiting previous operation to finish\n try {\n await this.ongoingOperation;\n } catch (_err: unknown) {\n // ignoring the error here, original caller will receive any rejections\n }\n\n // checking that this update is still the most recent\n if (this.counter !== myId) {\n // operation was canceled, because another operation was queued\n // after we started waiting for previous operation to finish\n return false;\n }\n\n // asynchronously starting the operation\n const opPromise = this.retry(() => op(), (e) => {\n console.warn('UpdateSerializer.run error, retrying...', e);\n return {\n delayMs: 100, // TODO: flexible delay\n };\n });\n // publishing the promise for the next operation to await\n this.ongoingOperation = opPromise;\n // actually awaiting for the operation result, any rejections will be thrown here\n await opPromise;\n\n // operation was successfully called\n return true;\n }\n}\n"],"names":["UpdateSerializer","options","__publicField","delay","completed","e","op","onNext","state","delayMs","hasAbortError","myId","opPromise"],"mappings":";;;;;AASO,MAAMA,EAAiB;AAAA,EAK5B,YAA6BC,IAEzB,IAAI;AANA,IAAAC,EAAA,oBAA+B,QAAQ,QAAQ,EAAI;AACnD,IAAAA,EAAA,0BAAkC,QAAQ,QAAA;AAC1C,IAAAA,EAAA,iBAAU;AAEW,SAAA,UAAAD;AAAA,EAEpB;AAAA,EAET,MAAM,aAA4B;AAChC,UAAME,EAAM,KAAK,QAAQ,gBAAgB,CAAC;AAC1C,QAAIC,IAAY;AAChB;AACE,YAAMD,EAAM,CAAC,GACbC,IAAY,MAAM,KAAK,WAAW,KAAK,MAC9B,EACR,EAAE,MAAM,CAACC,OACR,QAAQ,IAAI,oBAAoBA,CAAC,GAC1B,GACR;AAAA,WACM,CAACD;AAAA,EACZ;AAAA,EAEA,MAAM,MACJE,GACAC,GACY;AACZ,UAAMC,IAAoB;AAAA,MACxB,GAAG;AAAA,IAAA;AAGL;AACE,UAAI;AACF,eAAAA,EAAM,KACC,MAAMF,EAAA;AAAA,MACf,SAASD,GAAY;AACnB,cAAM,EAAE,SAAAI,EAAA,IAAYF,EAAOF,GAAGG,CAAK;AAEnC,YAAIE,EAAcL,CAAC;AACjB,gBAAMA;AAGR,cAAMF,EAAMM,CAAO;AAAA,MACrB;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,IAAIH,GAA2C;AAC1D,WAAO,KAAK,aAAa,KAAK,KAAKA,CAAE;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,KAAKA,GAA2C;AAE5D,SAAK;AACL,UAAMK,IAAO,KAAK;AAOlB,QALI,KAAK,QAAQ,gBACf,MAAMR,EAAM,KAAK,QAAQ,YAAY,GAInC,KAAK,YAAYQ;AAGnB,aAAO;AAIT,QAAI;AACF,YAAM,KAAK;AAAA,IACb,QAAwB;AAAA,IAExB;AAGA,QAAI,KAAK,YAAYA;AAGnB,aAAO;AAIT,UAAMC,IAAY,KAAK,MAAM,MAAMN,EAAA,GAAM,CAACD,OACxC,QAAQ,KAAK,2CAA2CA,CAAC,GAClD;AAAA,MACL,SAAS;AAAA;AAAA,IAAA,EAEZ;AAED,gBAAK,mBAAmBO,GAExB,MAAMA,GAGC;AAAA,EACT;AACF;"}
1
+ {"version":3,"file":"UpdateSerializer.js","sources":["../../src/internal/UpdateSerializer.ts"],"sourcesContent":["import { delay } from '@milaboratories/helpers';\nimport { hasAbortError } from '@platforma-sdk/model';\n\nexport type RetryState = {\n i: number;\n};\n\nexport type OnNext = (e: unknown, state: RetryState) => { delayMs: number };\n\nexport class UpdateSerializer {\n private ongoingRun: Promise<boolean> = Promise.resolve(true);\n private ongoingOperation: Promise<void> = Promise.resolve();\n private counter = 0;\n\n constructor(private readonly options: {\n debounceSpan?: number;\n } = {}) {}\n\n async allSettled(): Promise<void> {\n await delay(this.options.debounceSpan ?? 0);\n let completed = false;\n do {\n await delay(0);\n completed = await this.ongoingRun.then(() => {\n return true;\n }).catch((e) => {\n console.log('ongoingRun error', e);\n return false;\n });\n } while (!completed);\n }\n\n async retry<T>(\n op: () => Promise<T>,\n onNext: OnNext,\n ): Promise<T> {\n const state: RetryState = {\n i: 0,\n };\n\n while (true) {\n try {\n state.i++;\n return await op();\n } catch (e: unknown) {\n const { delayMs } = onNext(e, state);\n\n if (hasAbortError(e)) {\n throw e;\n }\n\n await delay(delayMs);\n }\n }\n }\n\n /**\n * @returns true if operation succeeded, or false if operation was evicted by a more recent call\n */\n public async run(op: () => Promise<void>): Promise<boolean> {\n return this.ongoingRun = this._run(op);\n }\n\n /**\n * @returns true if operation succeeded, or false if operation was evicted by a more recent call\n */\n private async _run(op: () => Promise<void>): Promise<boolean> {\n // assigning a sequential update id to the call\n this.counter++;\n const myId = this.counter;\n\n if (this.options.debounceSpan) {\n await delay(this.options.debounceSpan);\n }\n\n // checking that this update is still the most recent\n if (this.counter !== myId) {\n // operation was canceled, because another operation was queued\n // after we started waiting for previous operation to finish\n return false;\n }\n\n // awaiting previous operation to finish\n try {\n await this.ongoingOperation;\n } catch (_err: unknown) {\n // ignoring the error here, original caller will receive any rejections\n }\n\n // checking that this update is still the most recent\n if (this.counter !== myId) {\n // operation was canceled, because another operation was queued\n // after we started waiting for previous operation to finish\n return false;\n }\n\n // asynchronously starting the operation\n const opPromise = this.retry(() => op(), (e) => {\n console.warn('UpdateSerializer.run error, retrying...', e);\n return {\n delayMs: 100, // TODO: flexible delay\n };\n });\n // publishing the promise for the next operation to await\n this.ongoingOperation = opPromise;\n // actually awaiting for the operation result, any rejections will be thrown here\n await opPromise;\n\n // operation was successfully called\n return true;\n }\n}\n"],"names":["UpdateSerializer","options","__publicField","delay","completed","e","op","onNext","state","delayMs","hasAbortError","myId","opPromise"],"mappings":";;;;;;AASO,MAAMA,EAAiB;AAAA,EAK5B,YAA6BC,IAEzB,IAAI;AANA,IAAAC,EAAA,oBAA+B,QAAQ,QAAQ,EAAI;AACnD,IAAAA,EAAA,0BAAkC,QAAQ,QAAA;AAC1C,IAAAA,EAAA,iBAAU;AAEW,SAAA,UAAAD;AAAA,EAEpB;AAAA,EAET,MAAM,aAA4B;AAChC,UAAME,EAAM,KAAK,QAAQ,gBAAgB,CAAC;AAC1C,QAAIC,IAAY;AAChB;AACE,YAAMD,EAAM,CAAC,GACbC,IAAY,MAAM,KAAK,WAAW,KAAK,MAC9B,EACR,EAAE,MAAM,CAACC,OACR,QAAQ,IAAI,oBAAoBA,CAAC,GAC1B,GACR;AAAA,WACM,CAACD;AAAA,EACZ;AAAA,EAEA,MAAM,MACJE,GACAC,GACY;AACZ,UAAMC,IAAoB;AAAA,MACxB,GAAG;AAAA,IAAA;AAGL;AACE,UAAI;AACF,eAAAA,EAAM,KACC,MAAMF,EAAA;AAAA,MACf,SAASD,GAAY;AACnB,cAAM,EAAE,SAAAI,EAAA,IAAYF,EAAOF,GAAGG,CAAK;AAEnC,YAAIE,EAAcL,CAAC;AACjB,gBAAMA;AAGR,cAAMF,EAAMM,CAAO;AAAA,MACrB;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,IAAIH,GAA2C;AAC1D,WAAO,KAAK,aAAa,KAAK,KAAKA,CAAE;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,KAAKA,GAA2C;AAE5D,SAAK;AACL,UAAMK,IAAO,KAAK;AAOlB,QALI,KAAK,QAAQ,gBACf,MAAMR,EAAM,KAAK,QAAQ,YAAY,GAInC,KAAK,YAAYQ;AAGnB,aAAO;AAIT,QAAI;AACF,YAAM,KAAK;AAAA,IACb,QAAwB;AAAA,IAExB;AAGA,QAAI,KAAK,YAAYA;AAGnB,aAAO;AAIT,UAAMC,IAAY,KAAK,MAAM,MAAMN,EAAA,GAAM,CAACD,OACxC,QAAQ,KAAK,2CAA2CA,CAAC,GAClD;AAAA,MACL,SAAS;AAAA;AAAA,IAAA,EAEZ;AAED,gBAAK,mBAAmBO,GAExB,MAAMA,GAGC;AAAA,EACT;AACF;"}
@@ -1,23 +1,24 @@
1
1
  import { ref as d, watch as m, computed as s, unref as w, reactive as Z } from "vue";
2
2
  import { isJsonEqual as _, deepClone as g } from "../lib/util/helpers/dist/objects.js";
3
+ import "../lib/util/helpers/dist/test_timeouts.js";
3
4
  import { identity as j, isZodError as q, ensureError as x, formatZodError as A } from "../utils.js";
4
- function k(a, f, J) {
5
- const c = a.validate ?? j, { autoSave: E } = a, t = d(), o = d(), n = (e) => {
6
- o.value = {
5
+ function z(o, f, J) {
6
+ const c = o.validate ?? j, { autoSave: E } = o, t = d(), a = d(), n = (e) => {
7
+ a.value = {
7
8
  model: Object.assign(g(e), f ?? {}),
8
9
  stage: Symbol()
9
10
  };
10
11
  };
11
12
  m(
12
- () => a.get(),
13
+ () => o.get(),
13
14
  (e) => n(e),
14
15
  { immediate: !0 }
15
16
  );
16
17
  const v = () => {
17
18
  var e;
18
- return a.onSave(c(g((e = o.value) == null ? void 0 : e.model)));
19
+ return o.onSave(c(g((e = a.value) == null ? void 0 : e.model)));
19
20
  }, p = () => {
20
- n(a.get()), t.value = void 0;
21
+ n(o.get()), t.value = void 0;
21
22
  }, i = (e) => {
22
23
  const r = x(e);
23
24
  q(r) ? t.value = Error(A(r)) : t.value = r;
@@ -31,7 +32,7 @@ function k(a, f, J) {
31
32
  }, l = s({
32
33
  get: () => {
33
34
  var e;
34
- return (e = o.value) == null ? void 0 : e.model;
35
+ return (e = a.value) == null ? void 0 : e.model;
35
36
  },
36
37
  set() {
37
38
  throw Error("Cannot replace base model");
@@ -40,7 +41,7 @@ function k(a, f, J) {
40
41
  m(
41
42
  [() => ({ args: l.value.args, ui: l.value.ui }), () => {
42
43
  var e;
43
- return (e = o.value) == null ? void 0 : e.stage;
44
+ return (e = a.value) == null ? void 0 : e.stage;
44
45
  }],
45
46
  ([e, r], [u, C]) => {
46
47
  r === C && S(e);
@@ -49,8 +50,8 @@ function k(a, f, J) {
49
50
  );
50
51
  const h = s(() => !t.value), b = s(() => {
51
52
  var u;
52
- const { args: e, ui: r } = ((u = w(o)) == null ? void 0 : u.model) ?? {};
53
- return !_(a.get(), { args: e, ui: r });
53
+ const { args: e, ui: r } = ((u = w(a)) == null ? void 0 : u.model) ?? {};
54
+ return !_(o.get(), { args: e, ui: r });
54
55
  }), y = s(() => t.value ? t.value.message : "");
55
56
  return Z({
56
57
  model: l,
@@ -64,6 +65,6 @@ function k(a, f, J) {
64
65
  });
65
66
  }
66
67
  export {
67
- k as createAppModel
68
+ z as createAppModel
68
69
  };
69
70
  //# sourceMappingURL=createAppModel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createAppModel.js","sources":["../../src/internal/createAppModel.ts"],"sourcesContent":["import { reactive, computed, ref, watch, unref, type ComputedRef, type UnwrapNestedRefs } from 'vue';\nimport type { ModelOptions, Model, AppSettings } from '../types';\nimport { deepClone, isJsonEqual } from '@milaboratories/helpers';\nimport { identity, ensureError, isZodError, formatZodError } from '../utils';\n\nexport function createAppModel<\n M extends { args: unknown; ui: unknown },\n V = unknown,\n E extends Record<string, ComputedRef<unknown>> = Record<string, ComputedRef<unknown>>,\n>(options: ModelOptions<M, V>, extended: E, _settings: AppSettings): Model<M & UnwrapNestedRefs<E>> {\n type R = M & UnwrapNestedRefs<E>;\n\n const validate = options.validate ?? identity;\n\n const { autoSave } = options;\n\n const error = ref<Error | undefined>();\n\n const local = ref<{ model: R; readonly stage: symbol }>();\n\n const setSource = (v: M) => {\n local.value = {\n model: Object.assign(deepClone(v), extended ?? {}) as R,\n stage: Symbol(),\n };\n };\n\n watch(\n () => options.get(),\n (v) => setSource(v),\n { immediate: true },\n );\n\n const save = () => options.onSave(validate(deepClone(local.value?.model)));\n\n const revert = () => {\n setSource(options.get());\n error.value = undefined;\n };\n\n const setError = (cause: unknown) => {\n const err = ensureError(cause);\n if (isZodError(err)) {\n error.value = Error(formatZodError(err)); // @todo temp\n } else {\n error.value = err;\n }\n };\n\n const setValue = (v: M) => {\n error.value = undefined;\n try {\n validate(v);\n if (autoSave) {\n save();\n }\n } catch (cause: unknown) {\n setError(cause);\n }\n };\n\n const model = computed<R>({\n get: () => {\n return local.value?.model as R;\n },\n set() {\n throw Error('Cannot replace base model');\n },\n });\n\n watch(\n [() => ({ args: model.value.args, ui: model.value.ui }), () => local.value?.stage],\n ([n, newStage], [_, oldStage]) => {\n if (newStage === oldStage) {\n setValue(n as M);\n }\n },\n { deep: true },\n );\n\n const valid = computed(() => !error.value);\n\n const isChanged = computed(() => {\n const { args, ui } = unref(local)?.model ?? {};\n return !isJsonEqual(options.get(), { args, ui });\n });\n\n const errorString = computed(() => (error.value ? error.value.message : ''));\n\n return reactive({\n model,\n valid,\n isChanged,\n error,\n errorString,\n save,\n revert,\n setError,\n });\n}\n"],"names":["createAppModel","options","extended","_settings","validate","identity","autoSave","error","ref","local","setSource","v","deepClone","watch","save","_a","revert","setError","cause","err","ensureError","isZodError","formatZodError","setValue","model","computed","n","newStage","_","oldStage","valid","isChanged","args","ui","unref","isJsonEqual","errorString","reactive"],"mappings":";;;AAKO,SAASA,EAIdC,GAA6BC,GAAaC,GAAwD;AAGlG,QAAMC,IAAWH,EAAQ,YAAYI,GAE/B,EAAE,UAAAC,MAAaL,GAEfM,IAAQC,EAAA,GAERC,IAAQD,EAAA,GAERE,IAAY,CAACC,MAAS;AAC1B,IAAAF,EAAM,QAAQ;AAAA,MACZ,OAAO,OAAO,OAAOG,EAAUD,CAAC,GAAGT,KAAY,EAAE;AAAA,MACjD,OAAO,OAAA;AAAA,IAAO;AAAA,EAElB;AAEA,EAAAW;AAAA,IACE,MAAMZ,EAAQ,IAAA;AAAA,IACd,CAACU,MAAMD,EAAUC,CAAC;AAAA,IAClB,EAAE,WAAW,GAAA;AAAA,EAAK;AAGpB,QAAMG,IAAO;;AAAM,WAAAb,EAAQ,OAAOG,EAASQ,GAAUG,IAAAN,EAAM,UAAN,gBAAAM,EAAa,KAAK,CAAC,CAAC;AAAA,KAEnEC,IAAS,MAAM;AACnB,IAAAN,EAAUT,EAAQ,KAAK,GACvBM,EAAM,QAAQ;AAAA,EAChB,GAEMU,IAAW,CAACC,MAAmB;AACnC,UAAMC,IAAMC,EAAYF,CAAK;AAC7B,IAAIG,EAAWF,CAAG,IAChBZ,EAAM,QAAQ,MAAMe,EAAeH,CAAG,CAAC,IAEvCZ,EAAM,QAAQY;AAAA,EAElB,GAEMI,IAAW,CAACZ,MAAS;AACzB,IAAAJ,EAAM,QAAQ;AACd,QAAI;AACF,MAAAH,EAASO,CAAC,GACNL,KACFQ,EAAA;AAAA,IAEJ,SAASI,GAAgB;AACvB,MAAAD,EAASC,CAAK;AAAA,IAChB;AAAA,EACF,GAEMM,IAAQC,EAAY;AAAA,IACxB,KAAK,MAAM;;AACT,cAAOV,IAAAN,EAAM,UAAN,gBAAAM,EAAa;AAAA,IACtB;AAAA,IACA,MAAM;AACJ,YAAM,MAAM,2BAA2B;AAAA,IACzC;AAAA,EAAA,CACD;AAED,EAAAF;AAAA,IACE,CAAC,OAAO,EAAE,MAAMW,EAAM,MAAM,MAAM,IAAIA,EAAM,MAAM,GAAA,IAAO,MAAA;;AAAM,cAAAT,IAAAN,EAAM,UAAN,gBAAAM,EAAa;AAAA,KAAK;AAAA,IACjF,CAAC,CAACW,GAAGC,CAAQ,GAAG,CAACC,GAAGC,CAAQ,MAAM;AAChC,MAAIF,MAAaE,KACfN,EAASG,CAAM;AAAA,IAEnB;AAAA,IACA,EAAE,MAAM,GAAA;AAAA,EAAK;AAGf,QAAMI,IAAQL,EAAS,MAAM,CAAClB,EAAM,KAAK,GAEnCwB,IAAYN,EAAS,MAAM;;AAC/B,UAAM,EAAE,MAAAO,GAAM,IAAAC,EAAA,MAAOlB,IAAAmB,EAAMzB,CAAK,MAAX,gBAAAM,EAAc,UAAS,CAAA;AAC5C,WAAO,CAACoB,EAAYlC,EAAQ,IAAA,GAAO,EAAE,MAAA+B,GAAM,IAAAC,GAAI;AAAA,EACjD,CAAC,GAEKG,IAAcX,EAAS,MAAOlB,EAAM,QAAQA,EAAM,MAAM,UAAU,EAAG;AAE3E,SAAO8B,EAAS;AAAA,IACd,OAAAb;AAAA,IACA,OAAAM;AAAA,IACA,WAAAC;AAAA,IACA,OAAAxB;AAAA,IACA,aAAA6B;AAAA,IACA,MAAAtB;AAAA,IACA,QAAAE;AAAA,IACA,UAAAC;AAAA,EAAA,CACD;AACH;"}
1
+ {"version":3,"file":"createAppModel.js","sources":["../../src/internal/createAppModel.ts"],"sourcesContent":["import { reactive, computed, ref, watch, unref, type ComputedRef, type UnwrapNestedRefs } from 'vue';\nimport type { ModelOptions, Model, AppSettings } from '../types';\nimport { deepClone, isJsonEqual } from '@milaboratories/helpers';\nimport { identity, ensureError, isZodError, formatZodError } from '../utils';\n\nexport function createAppModel<\n M extends { args: unknown; ui: unknown },\n V = unknown,\n E extends Record<string, ComputedRef<unknown>> = Record<string, ComputedRef<unknown>>,\n>(options: ModelOptions<M, V>, extended: E, _settings: AppSettings): Model<M & UnwrapNestedRefs<E>> {\n type R = M & UnwrapNestedRefs<E>;\n\n const validate = options.validate ?? identity;\n\n const { autoSave } = options;\n\n const error = ref<Error | undefined>();\n\n const local = ref<{ model: R; readonly stage: symbol }>();\n\n const setSource = (v: M) => {\n local.value = {\n model: Object.assign(deepClone(v), extended ?? {}) as R,\n stage: Symbol(),\n };\n };\n\n watch(\n () => options.get(),\n (v) => setSource(v),\n { immediate: true },\n );\n\n const save = () => options.onSave(validate(deepClone(local.value?.model)));\n\n const revert = () => {\n setSource(options.get());\n error.value = undefined;\n };\n\n const setError = (cause: unknown) => {\n const err = ensureError(cause);\n if (isZodError(err)) {\n error.value = Error(formatZodError(err)); // @todo temp\n } else {\n error.value = err;\n }\n };\n\n const setValue = (v: M) => {\n error.value = undefined;\n try {\n validate(v);\n if (autoSave) {\n save();\n }\n } catch (cause: unknown) {\n setError(cause);\n }\n };\n\n const model = computed<R>({\n get: () => {\n return local.value?.model as R;\n },\n set() {\n throw Error('Cannot replace base model');\n },\n });\n\n watch(\n [() => ({ args: model.value.args, ui: model.value.ui }), () => local.value?.stage],\n ([n, newStage], [_, oldStage]) => {\n if (newStage === oldStage) {\n setValue(n as M);\n }\n },\n { deep: true },\n );\n\n const valid = computed(() => !error.value);\n\n const isChanged = computed(() => {\n const { args, ui } = unref(local)?.model ?? {};\n return !isJsonEqual(options.get(), { args, ui });\n });\n\n const errorString = computed(() => (error.value ? error.value.message : ''));\n\n return reactive({\n model,\n valid,\n isChanged,\n error,\n errorString,\n save,\n revert,\n setError,\n });\n}\n"],"names":["createAppModel","options","extended","_settings","validate","identity","autoSave","error","ref","local","setSource","v","deepClone","watch","save","_a","revert","setError","cause","err","ensureError","isZodError","formatZodError","setValue","model","computed","n","newStage","_","oldStage","valid","isChanged","args","ui","unref","isJsonEqual","errorString","reactive"],"mappings":";;;;AAKO,SAASA,EAIdC,GAA6BC,GAAaC,GAAwD;AAGlG,QAAMC,IAAWH,EAAQ,YAAYI,GAE/B,EAAE,UAAAC,MAAaL,GAEfM,IAAQC,EAAA,GAERC,IAAQD,EAAA,GAERE,IAAY,CAACC,MAAS;AAC1B,IAAAF,EAAM,QAAQ;AAAA,MACZ,OAAO,OAAO,OAAOG,EAAUD,CAAC,GAAGT,KAAY,EAAE;AAAA,MACjD,OAAO,OAAA;AAAA,IAAO;AAAA,EAElB;AAEA,EAAAW;AAAA,IACE,MAAMZ,EAAQ,IAAA;AAAA,IACd,CAACU,MAAMD,EAAUC,CAAC;AAAA,IAClB,EAAE,WAAW,GAAA;AAAA,EAAK;AAGpB,QAAMG,IAAO;;AAAM,WAAAb,EAAQ,OAAOG,EAASQ,GAAUG,IAAAN,EAAM,UAAN,gBAAAM,EAAa,KAAK,CAAC,CAAC;AAAA,KAEnEC,IAAS,MAAM;AACnB,IAAAN,EAAUT,EAAQ,KAAK,GACvBM,EAAM,QAAQ;AAAA,EAChB,GAEMU,IAAW,CAACC,MAAmB;AACnC,UAAMC,IAAMC,EAAYF,CAAK;AAC7B,IAAIG,EAAWF,CAAG,IAChBZ,EAAM,QAAQ,MAAMe,EAAeH,CAAG,CAAC,IAEvCZ,EAAM,QAAQY;AAAA,EAElB,GAEMI,IAAW,CAACZ,MAAS;AACzB,IAAAJ,EAAM,QAAQ;AACd,QAAI;AACF,MAAAH,EAASO,CAAC,GACNL,KACFQ,EAAA;AAAA,IAEJ,SAASI,GAAgB;AACvB,MAAAD,EAASC,CAAK;AAAA,IAChB;AAAA,EACF,GAEMM,IAAQC,EAAY;AAAA,IACxB,KAAK,MAAM;;AACT,cAAOV,IAAAN,EAAM,UAAN,gBAAAM,EAAa;AAAA,IACtB;AAAA,IACA,MAAM;AACJ,YAAM,MAAM,2BAA2B;AAAA,IACzC;AAAA,EAAA,CACD;AAED,EAAAF;AAAA,IACE,CAAC,OAAO,EAAE,MAAMW,EAAM,MAAM,MAAM,IAAIA,EAAM,MAAM,GAAA,IAAO,MAAA;;AAAM,cAAAT,IAAAN,EAAM,UAAN,gBAAAM,EAAa;AAAA,KAAK;AAAA,IACjF,CAAC,CAACW,GAAGC,CAAQ,GAAG,CAACC,GAAGC,CAAQ,MAAM;AAChC,MAAIF,MAAaE,KACfN,EAASG,CAAM;AAAA,IAEnB;AAAA,IACA,EAAE,MAAM,GAAA;AAAA,EAAK;AAGf,QAAMI,IAAQL,EAAS,MAAM,CAAClB,EAAM,KAAK,GAEnCwB,IAAYN,EAAS,MAAM;;AAC/B,UAAM,EAAE,MAAAO,GAAM,IAAAC,EAAA,MAAOlB,IAAAmB,EAAMzB,CAAK,MAAX,gBAAAM,EAAc,UAAS,CAAA;AAC5C,WAAO,CAACoB,EAAYlC,EAAQ,IAAA,GAAO,EAAE,MAAA+B,GAAM,IAAAC,GAAI;AAAA,EACjD,CAAC,GAEKG,IAAcX,EAAS,MAAOlB,EAAM,QAAQA,EAAM,MAAM,UAAU,EAAG;AAE3E,SAAO8B,EAAS;AAAA,IACd,OAAAb;AAAA,IACA,OAAAM;AAAA,IACA,WAAAC;AAAA,IACA,OAAAxB;AAAA,IACA,aAAA6B;AAAA,IACA,MAAAtB;AAAA,IACA,QAAAE;AAAA,IACA,UAAAC;AAAA,EAAA,CACD;AACH;"}
@@ -1,12 +1,13 @@
1
1
  import { tap as M } from "../lib/util/helpers/dist/utils.js";
2
2
  import { isJsonEqual as n, deepClone as v } from "../lib/util/helpers/dist/objects.js";
3
+ import "../lib/util/helpers/dist/test_timeouts.js";
3
4
  import { reactive as S, nextTick as h, computed as s, watch as E } from "vue";
4
5
  import { createModel as m } from "../createModel.js";
5
6
  import { createAppModel as x } from "./createAppModel.js";
6
7
  import { parseQuery as N } from "../urls.js";
7
8
  import { MultiError as q, unwrapValueOrErrors as T } from "../utils.js";
8
9
  import { useDebounceFn as d } from "@vueuse/core";
9
- function D(i, a, g) {
10
+ function G(i, a, g) {
10
11
  const c = (e, ...t) => {
11
12
  g.debug && console.log(`%c>>> %c${e}`, "color: orange; font-weight: bold", "color: orange", ...t);
12
13
  }, r = S({
@@ -164,6 +165,6 @@ function D(i, a, g) {
164
165
  return S(Object.assign(y, w, B));
165
166
  }
166
167
  export {
167
- D as createAppV1
168
+ G as createAppV1
168
169
  };
169
170
  //# sourceMappingURL=createAppV1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createAppV1.js","sources":["../../src/internal/createAppV1.ts"],"sourcesContent":["import { deepClone, isJsonEqual, tap } from '@milaboratories/helpers';\nimport type { Mutable } from '@milaboratories/helpers';\nimport type { NavigationState, BlockOutputsBase, BlockState, PlatformaV1 } from '@platforma-sdk/model';\nimport { reactive, nextTick, computed, watch } from 'vue';\nimport type { StateModelOptions, UnwrapOutputs, OptionalResult, OutputValues, OutputErrors, AppSettings } from '../types';\nimport { createModel } from '../createModel';\nimport { createAppModel } from './createAppModel';\nimport { parseQuery } from '../urls';\nimport { MultiError, unwrapValueOrErrors } from '../utils';\nimport { useDebounceFn } from '@vueuse/core';\n/**\n * Creates an application instance with reactive state management, outputs, and methods for state updates and navigation.\n *\n * @template Args - The type of arguments used in the application.\n * @template Outputs - The type of block outputs extending `BlockOutputsBase`.\n * @template UiState - The type of the UI state.\n * @template Href - The type of navigation href, defaulting to a string starting with `/`.\n *\n * @param state - Initial state of the application, including args, outputs, UI state, and navigation state.\n * @param platforma - A platform interface for interacting with block states.\n * @param settings - Application settings, such as debug flags.\n *\n * @returns A reactive application object with methods, getters, and state.\n */\nexport function createAppV1<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n>(\n state: BlockState<Args, Outputs, UiState, Href>,\n platforma: PlatformaV1<Args, Outputs, UiState, Href>,\n settings: AppSettings,\n) {\n type AppModel = {\n args: Args;\n ui: UiState;\n };\n\n const log = (msg: string, ...rest: unknown[]) => {\n if (settings.debug) {\n console.log(`%c>>> %c${msg}`, 'color: orange; font-weight: bold', 'color: orange', ...rest);\n }\n };\n\n /**\n * Reactive snapshot of the application state, including args, outputs, UI state, and navigation state.\n */\n const snapshot = reactive({\n args: Object.freeze(state.args),\n outputs: Object.freeze(state.outputs),\n ui: Object.freeze(state.ui),\n navigationState: Object.freeze(state.navigationState) as NavigationState<Href>,\n }) as {\n args: Readonly<Args>;\n outputs: Partial<Readonly<Outputs>>;\n ui: Readonly<UiState>;\n navigationState: Readonly<NavigationState<Href>>;\n };\n\n const debounceSpan = settings.debounceSpan ?? 200;\n\n const maxWait = tap(settings.debounceMaxWait ?? 0, (v) => v < 20_000 ? 20_000 : v < debounceSpan ? debounceSpan * 100 : v);\n\n const setBlockArgs = useDebounceFn((args: Args) => {\n if (!isJsonEqual(args, snapshot.args)) {\n platforma.setBlockArgs(args);\n }\n }, debounceSpan, { maxWait });\n\n const setBlockUiState = useDebounceFn((ui: UiState) => {\n if (!isJsonEqual(ui, snapshot.ui)) {\n platforma.setBlockUiState(ui);\n }\n }, debounceSpan, { maxWait });\n\n const setBlockArgsAndUiState = useDebounceFn((args: Args, ui: UiState) => {\n if (!isJsonEqual(args, snapshot.args) || !isJsonEqual(ui, snapshot.ui)) {\n platforma.setBlockArgsAndUiState(args, ui);\n }\n }, debounceSpan, { maxWait });\n\n (platforma as unknown as PlatformaV1<Args, Outputs, UiState, Href>).onStateUpdates(async (updates) => {\n updates.forEach((patch) => {\n if (patch.key === 'args' && !isJsonEqual(snapshot.args, patch.value)) {\n snapshot.args = Object.freeze(patch.value);\n log('args patch', snapshot.args);\n }\n\n if (patch.key === 'ui' && !isJsonEqual(snapshot.ui, patch.value)) {\n snapshot.ui = Object.freeze(patch.value);\n log('ui patch', snapshot.ui);\n }\n\n if (patch.key === 'outputs' && !isJsonEqual(snapshot.outputs, patch.value)) {\n snapshot.outputs = Object.freeze(patch.value);\n log('outputs patch', snapshot.outputs);\n }\n\n if (patch.key === 'navigationState' && !isJsonEqual(snapshot.navigationState, patch.value)) {\n snapshot.navigationState = Object.freeze(patch.value);\n log('navigationState patch', snapshot.navigationState);\n }\n });\n\n await nextTick();\n });\n\n const cloneArgs = () => deepClone(snapshot.args) as Args;\n const cloneUiState = () => deepClone(snapshot.ui) as UiState;\n const cloneNavigationState = () => deepClone(snapshot.navigationState) as Mutable<NavigationState<Href>>;\n\n const methods = {\n createArgsModel<T = Args>(options: StateModelOptions<Args, T> = {}) {\n return createModel<T, Args>({\n get() {\n if (options.transform) {\n return options.transform(snapshot.args);\n }\n\n return snapshot.args as T;\n },\n validate: options.validate,\n autoSave: true,\n onSave(newArgs) {\n setBlockArgs(newArgs);\n },\n });\n },\n /**\n * defaultUiState is temporarily here, remove it after implementing initialUiState\n */\n createUiModel<T = UiState>(options: StateModelOptions<UiState, T> = {}, defaultUiState: () => UiState) {\n return createModel<T, UiState>({\n get() {\n if (options.transform) {\n return options.transform(snapshot.ui);\n }\n\n return (snapshot.ui ?? defaultUiState()) as T;\n },\n validate: options.validate,\n autoSave: true,\n onSave(newData) {\n setBlockUiState(newData);\n },\n });\n },\n /**\n * Note: Don't forget to list the output names, like: useOutputs('output1', 'output2', ...etc)\n * @param keys - List of output names\n * @returns {OptionalResult<UnwrapOutputs<Outputs, K>>}\n */\n useOutputs<K extends keyof Outputs>(...keys: K[]): OptionalResult<UnwrapOutputs<Outputs, K>> {\n const data = reactive({\n errors: undefined,\n value: undefined,\n });\n\n watch(\n () => snapshot.outputs,\n () => {\n try {\n Object.assign(data, {\n value: this.unwrapOutputs<K>(...keys),\n errors: undefined,\n });\n } catch (error) {\n Object.assign(data, {\n value: undefined,\n errors: [String(error)],\n });\n }\n },\n { immediate: true, deep: true },\n );\n\n return data as OptionalResult<UnwrapOutputs<Outputs, K>>;\n },\n /**\n * Retrieves the unwrapped values of outputs for the given keys.\n *\n * @template K - Keys of the outputs to unwrap.\n * @param keys - List of output names.\n * @throws Error if the outputs contain errors.\n * @returns An object with unwrapped output values.\n */\n unwrapOutputs<K extends keyof Outputs>(...keys: K[]): UnwrapOutputs<Outputs, K> {\n const outputs = snapshot.outputs;\n const entries = keys.map((key) => [key, unwrapValueOrErrors(outputs[key])]);\n return Object.fromEntries(entries);\n },\n /**\n * Updates the arguments state by applying a callback.\n *\n * @param cb - Callback to modify the current arguments.\n * @returns A promise resolving after the update is applied.\n */\n updateArgs(cb: (args: Args) => void) {\n const newArgs = cloneArgs();\n cb(newArgs);\n return platforma.setBlockArgs(newArgs);\n },\n /**\n * Updates the UI state by applying a callback.\n *\n * @param cb - Callback to modify the current UI state.\n * @returns A promise resolving after the update is applied.\n * @todo Make it mutable since there is already an initial one\n */\n updateUiState(cb: (args: UiState) => UiState): Promise<void> {\n const newUiState = cloneUiState();\n return platforma.setBlockUiState(cb(newUiState));\n },\n /**\n * Updates the navigation state by applying a callback.\n *\n * @param cb - Callback to modify the current navigation state.\n * @returns A promise resolving after the update is applied.\n */\n updateNavigationState(cb: (args: Mutable<NavigationState<Href>>) => void) {\n const newState = cloneNavigationState();\n cb(newState);\n return platforma.setNavigationState(newState);\n },\n /**\n * Navigates to a specific href by updating the navigation state.\n *\n * @param href - The target href to navigate to.\n * @returns A promise resolving after the navigation state is updated.\n */\n navigateTo(href: Href) {\n const newState = cloneNavigationState();\n newState.href = href;\n return platforma.setNavigationState(newState);\n },\n };\n\n const outputs = computed<OutputValues<Outputs>>(() => {\n const entries = Object.entries(snapshot.outputs).map(([k, vOrErr]) => [k, vOrErr.ok && vOrErr.value !== undefined ? vOrErr.value : undefined]);\n return Object.fromEntries(entries);\n });\n\n const outputErrors = computed<OutputErrors<Outputs>>(() => {\n const entries = Object.entries(snapshot.outputs).map(([k, vOrErr]) => [k, vOrErr && !vOrErr.ok ? new MultiError(vOrErr.errors) : undefined]);\n return Object.fromEntries(entries);\n });\n\n const getters = {\n snapshot,\n queryParams: computed(() => parseQuery<Href>(snapshot.navigationState.href)),\n href: computed(() => snapshot.navigationState.href),\n hasErrors: computed(() => Object.values(snapshot.outputs).some((v) => !v?.ok)),\n };\n\n const model = createAppModel(\n {\n get() {\n return { args: snapshot.args, ui: snapshot.ui } as AppModel;\n },\n autoSave: true,\n onSave(newData: AppModel) {\n setBlockArgsAndUiState(newData.args, newData.ui);\n },\n },\n {\n outputs,\n outputErrors,\n },\n settings,\n );\n\n return reactive(Object.assign(model, methods, getters));\n}\n\nexport type BaseAppV1<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n> = ReturnType<typeof createAppV1<Args, Outputs, UiState, Href>>;\n"],"names":["createAppV1","state","platforma","settings","log","msg","rest","snapshot","reactive","debounceSpan","maxWait","tap","v","setBlockArgs","useDebounceFn","args","isJsonEqual","setBlockUiState","ui","setBlockArgsAndUiState","updates","patch","nextTick","cloneArgs","deepClone","cloneUiState","cloneNavigationState","methods","options","createModel","newArgs","defaultUiState","newData","keys","data","watch","error","outputs","entries","key","unwrapValueOrErrors","cb","newUiState","newState","href","computed","k","vOrErr","outputErrors","MultiError","getters","parseQuery","model","createAppModel"],"mappings":"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"}
1
+ {"version":3,"file":"createAppV1.js","sources":["../../src/internal/createAppV1.ts"],"sourcesContent":["import { deepClone, isJsonEqual, tap } from '@milaboratories/helpers';\nimport type { Mutable } from '@milaboratories/helpers';\nimport type { NavigationState, BlockOutputsBase, BlockState, PlatformaV1 } from '@platforma-sdk/model';\nimport { reactive, nextTick, computed, watch } from 'vue';\nimport type { StateModelOptions, UnwrapOutputs, OptionalResult, OutputValues, OutputErrors, AppSettings } from '../types';\nimport { createModel } from '../createModel';\nimport { createAppModel } from './createAppModel';\nimport { parseQuery } from '../urls';\nimport { MultiError, unwrapValueOrErrors } from '../utils';\nimport { useDebounceFn } from '@vueuse/core';\n/**\n * Creates an application instance with reactive state management, outputs, and methods for state updates and navigation.\n *\n * @template Args - The type of arguments used in the application.\n * @template Outputs - The type of block outputs extending `BlockOutputsBase`.\n * @template UiState - The type of the UI state.\n * @template Href - The type of navigation href, defaulting to a string starting with `/`.\n *\n * @param state - Initial state of the application, including args, outputs, UI state, and navigation state.\n * @param platforma - A platform interface for interacting with block states.\n * @param settings - Application settings, such as debug flags.\n *\n * @returns A reactive application object with methods, getters, and state.\n */\nexport function createAppV1<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n>(\n state: BlockState<Args, Outputs, UiState, Href>,\n platforma: PlatformaV1<Args, Outputs, UiState, Href>,\n settings: AppSettings,\n) {\n type AppModel = {\n args: Args;\n ui: UiState;\n };\n\n const log = (msg: string, ...rest: unknown[]) => {\n if (settings.debug) {\n console.log(`%c>>> %c${msg}`, 'color: orange; font-weight: bold', 'color: orange', ...rest);\n }\n };\n\n /**\n * Reactive snapshot of the application state, including args, outputs, UI state, and navigation state.\n */\n const snapshot = reactive({\n args: Object.freeze(state.args),\n outputs: Object.freeze(state.outputs),\n ui: Object.freeze(state.ui),\n navigationState: Object.freeze(state.navigationState) as NavigationState<Href>,\n }) as {\n args: Readonly<Args>;\n outputs: Partial<Readonly<Outputs>>;\n ui: Readonly<UiState>;\n navigationState: Readonly<NavigationState<Href>>;\n };\n\n const debounceSpan = settings.debounceSpan ?? 200;\n\n const maxWait = tap(settings.debounceMaxWait ?? 0, (v) => v < 20_000 ? 20_000 : v < debounceSpan ? debounceSpan * 100 : v);\n\n const setBlockArgs = useDebounceFn((args: Args) => {\n if (!isJsonEqual(args, snapshot.args)) {\n platforma.setBlockArgs(args);\n }\n }, debounceSpan, { maxWait });\n\n const setBlockUiState = useDebounceFn((ui: UiState) => {\n if (!isJsonEqual(ui, snapshot.ui)) {\n platforma.setBlockUiState(ui);\n }\n }, debounceSpan, { maxWait });\n\n const setBlockArgsAndUiState = useDebounceFn((args: Args, ui: UiState) => {\n if (!isJsonEqual(args, snapshot.args) || !isJsonEqual(ui, snapshot.ui)) {\n platforma.setBlockArgsAndUiState(args, ui);\n }\n }, debounceSpan, { maxWait });\n\n (platforma as unknown as PlatformaV1<Args, Outputs, UiState, Href>).onStateUpdates(async (updates) => {\n updates.forEach((patch) => {\n if (patch.key === 'args' && !isJsonEqual(snapshot.args, patch.value)) {\n snapshot.args = Object.freeze(patch.value);\n log('args patch', snapshot.args);\n }\n\n if (patch.key === 'ui' && !isJsonEqual(snapshot.ui, patch.value)) {\n snapshot.ui = Object.freeze(patch.value);\n log('ui patch', snapshot.ui);\n }\n\n if (patch.key === 'outputs' && !isJsonEqual(snapshot.outputs, patch.value)) {\n snapshot.outputs = Object.freeze(patch.value);\n log('outputs patch', snapshot.outputs);\n }\n\n if (patch.key === 'navigationState' && !isJsonEqual(snapshot.navigationState, patch.value)) {\n snapshot.navigationState = Object.freeze(patch.value);\n log('navigationState patch', snapshot.navigationState);\n }\n });\n\n await nextTick();\n });\n\n const cloneArgs = () => deepClone(snapshot.args) as Args;\n const cloneUiState = () => deepClone(snapshot.ui) as UiState;\n const cloneNavigationState = () => deepClone(snapshot.navigationState) as Mutable<NavigationState<Href>>;\n\n const methods = {\n createArgsModel<T = Args>(options: StateModelOptions<Args, T> = {}) {\n return createModel<T, Args>({\n get() {\n if (options.transform) {\n return options.transform(snapshot.args);\n }\n\n return snapshot.args as T;\n },\n validate: options.validate,\n autoSave: true,\n onSave(newArgs) {\n setBlockArgs(newArgs);\n },\n });\n },\n /**\n * defaultUiState is temporarily here, remove it after implementing initialUiState\n */\n createUiModel<T = UiState>(options: StateModelOptions<UiState, T> = {}, defaultUiState: () => UiState) {\n return createModel<T, UiState>({\n get() {\n if (options.transform) {\n return options.transform(snapshot.ui);\n }\n\n return (snapshot.ui ?? defaultUiState()) as T;\n },\n validate: options.validate,\n autoSave: true,\n onSave(newData) {\n setBlockUiState(newData);\n },\n });\n },\n /**\n * Note: Don't forget to list the output names, like: useOutputs('output1', 'output2', ...etc)\n * @param keys - List of output names\n * @returns {OptionalResult<UnwrapOutputs<Outputs, K>>}\n */\n useOutputs<K extends keyof Outputs>(...keys: K[]): OptionalResult<UnwrapOutputs<Outputs, K>> {\n const data = reactive({\n errors: undefined,\n value: undefined,\n });\n\n watch(\n () => snapshot.outputs,\n () => {\n try {\n Object.assign(data, {\n value: this.unwrapOutputs<K>(...keys),\n errors: undefined,\n });\n } catch (error) {\n Object.assign(data, {\n value: undefined,\n errors: [String(error)],\n });\n }\n },\n { immediate: true, deep: true },\n );\n\n return data as OptionalResult<UnwrapOutputs<Outputs, K>>;\n },\n /**\n * Retrieves the unwrapped values of outputs for the given keys.\n *\n * @template K - Keys of the outputs to unwrap.\n * @param keys - List of output names.\n * @throws Error if the outputs contain errors.\n * @returns An object with unwrapped output values.\n */\n unwrapOutputs<K extends keyof Outputs>(...keys: K[]): UnwrapOutputs<Outputs, K> {\n const outputs = snapshot.outputs;\n const entries = keys.map((key) => [key, unwrapValueOrErrors(outputs[key])]);\n return Object.fromEntries(entries);\n },\n /**\n * Updates the arguments state by applying a callback.\n *\n * @param cb - Callback to modify the current arguments.\n * @returns A promise resolving after the update is applied.\n */\n updateArgs(cb: (args: Args) => void) {\n const newArgs = cloneArgs();\n cb(newArgs);\n return platforma.setBlockArgs(newArgs);\n },\n /**\n * Updates the UI state by applying a callback.\n *\n * @param cb - Callback to modify the current UI state.\n * @returns A promise resolving after the update is applied.\n * @todo Make it mutable since there is already an initial one\n */\n updateUiState(cb: (args: UiState) => UiState): Promise<void> {\n const newUiState = cloneUiState();\n return platforma.setBlockUiState(cb(newUiState));\n },\n /**\n * Updates the navigation state by applying a callback.\n *\n * @param cb - Callback to modify the current navigation state.\n * @returns A promise resolving after the update is applied.\n */\n updateNavigationState(cb: (args: Mutable<NavigationState<Href>>) => void) {\n const newState = cloneNavigationState();\n cb(newState);\n return platforma.setNavigationState(newState);\n },\n /**\n * Navigates to a specific href by updating the navigation state.\n *\n * @param href - The target href to navigate to.\n * @returns A promise resolving after the navigation state is updated.\n */\n navigateTo(href: Href) {\n const newState = cloneNavigationState();\n newState.href = href;\n return platforma.setNavigationState(newState);\n },\n };\n\n const outputs = computed<OutputValues<Outputs>>(() => {\n const entries = Object.entries(snapshot.outputs).map(([k, vOrErr]) => [k, vOrErr.ok && vOrErr.value !== undefined ? vOrErr.value : undefined]);\n return Object.fromEntries(entries);\n });\n\n const outputErrors = computed<OutputErrors<Outputs>>(() => {\n const entries = Object.entries(snapshot.outputs).map(([k, vOrErr]) => [k, vOrErr && !vOrErr.ok ? new MultiError(vOrErr.errors) : undefined]);\n return Object.fromEntries(entries);\n });\n\n const getters = {\n snapshot,\n queryParams: computed(() => parseQuery<Href>(snapshot.navigationState.href)),\n href: computed(() => snapshot.navigationState.href),\n hasErrors: computed(() => Object.values(snapshot.outputs).some((v) => !v?.ok)),\n };\n\n const model = createAppModel(\n {\n get() {\n return { args: snapshot.args, ui: snapshot.ui } as AppModel;\n },\n autoSave: true,\n onSave(newData: AppModel) {\n setBlockArgsAndUiState(newData.args, newData.ui);\n },\n },\n {\n outputs,\n outputErrors,\n },\n settings,\n );\n\n return reactive(Object.assign(model, methods, getters));\n}\n\nexport type BaseAppV1<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n> = ReturnType<typeof createAppV1<Args, Outputs, UiState, Href>>;\n"],"names":["createAppV1","state","platforma","settings","log","msg","rest","snapshot","reactive","debounceSpan","maxWait","tap","v","setBlockArgs","useDebounceFn","args","isJsonEqual","setBlockUiState","ui","setBlockArgsAndUiState","updates","patch","nextTick","cloneArgs","deepClone","cloneUiState","cloneNavigationState","methods","options","createModel","newArgs","defaultUiState","newData","keys","data","watch","error","outputs","entries","key","unwrapValueOrErrors","cb","newUiState","newState","href","computed","k","vOrErr","outputErrors","MultiError","getters","parseQuery","model","createAppModel"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { delay as L } from "../lib/util/helpers/dist/utils.js";
2
2
  import { uniqueId as V } from "../lib/util/helpers/dist/strings.js";
3
- import { deepClone as i } from "../lib/util/helpers/dist/objects.js";
3
+ import { deepClone as l } from "../lib/util/helpers/dist/objects.js";
4
+ import "../lib/util/helpers/dist/test_timeouts.js";
4
5
  import { unwrapResult as c, hasAbortError as G } from "@platforma-sdk/model";
5
6
  import { ref as w, computed as p, reactive as P } from "vue";
6
7
  import { createModel as B } from "../createModel.js";
@@ -20,7 +21,7 @@ const O = 100, Y = (n) => ({
20
21
  return u instanceof Error ? u.message : String(u);
21
22
  }
22
23
  };
23
- function ce(n, u, A) {
24
+ function de(n, u, A) {
24
25
  const a = (e, ...t) => {
25
26
  A.debug && console.log(`%c>>> %c${e}`, "color: orange; font-weight: bold", "color: orange", ...t.map((o) => Q(o)));
26
27
  }, b = (e, ...t) => {
@@ -37,23 +38,23 @@ function ce(n, u, A) {
37
38
  }), C = p(() => {
38
39
  const e = Object.entries(r.value.outputs).map(([t, o]) => [t, o && !o.ok ? new K(o.errors) : void 0]);
39
40
  return Object.fromEntries(e);
40
- }), l = P({
41
+ }), i = P({
41
42
  error: "",
42
43
  model: {
43
- args: i(r.value.args),
44
- ui: i(r.value.ui),
44
+ args: l(r.value.args),
45
+ ui: l(r.value.ui),
45
46
  outputs: q,
46
47
  outputErrors: C
47
48
  }
48
49
  }), { ignoreUpdates: $ } = X(
49
- () => l.model,
50
+ () => i.model,
50
51
  (e) => {
51
- const t = i(e);
52
+ const t = l(e);
52
53
  a("setArgsAndUiStateQueue appModel.model", t), M.run(() => D(t.args, t.ui).then(c));
53
54
  },
54
55
  { deep: !0 }
55
56
  ), z = (e) => {
56
- a("updateAppModel", e), l.model.args = i(e.args), l.model.ui = i(e.ui);
57
+ a("updateAppModel", e), i.model.args = l(e.args), i.model.ui = l(e.ui);
57
58
  };
58
59
  (async () => {
59
60
  var e, t;
@@ -76,7 +77,7 @@ function ce(n, u, A) {
76
77
  G(o) ? (a("patches loop aborted"), g.value = !0) : (b("error in patches loop", o), await new Promise((d) => setTimeout(d, 1e3)));
77
78
  }
78
79
  })();
79
- const x = () => i(l.model.args), j = () => i(l.model.ui), I = () => i(r.value.navigationState), F = {
80
+ const x = () => l(i.model.args), j = () => l(i.model.ui), I = () => l(r.value.navigationState), F = {
80
81
  cloneArgs: x,
81
82
  cloneUiState: j,
82
83
  cloneNavigationState: I,
@@ -127,7 +128,7 @@ function ce(n, u, A) {
127
128
  */
128
129
  updateArgs(e) {
129
130
  const t = x();
130
- return e(t), a("updateArgs", t), l.model.args = t, y.run(() => T(t).then(c));
131
+ return e(t), a("updateArgs", t), i.model.args = t, y.run(() => T(t).then(c));
131
132
  },
132
133
  /**
133
134
  * Updates the UI state by applying a callback.
@@ -138,7 +139,7 @@ function ce(n, u, A) {
138
139
  */
139
140
  updateUiState(e) {
140
141
  const t = e(j());
141
- return a("updateUiState", t), l.model.ui = t, U.run(() => E(t).then(c));
142
+ return a("updateUiState", t), i.model.ui = t, U.run(() => E(t).then(c));
142
143
  },
143
144
  /**
144
145
  * Navigates to a specific href by updating the navigation state.
@@ -160,10 +161,10 @@ function ce(n, u, A) {
160
161
  href: p(() => r.value.navigationState.href),
161
162
  hasErrors: p(() => Object.values(r.value.outputs).some((e) => !(e != null && e.ok)))
162
163
  };
163
- return P(Object.assign(l, F, J));
164
+ return P(Object.assign(i, F, J));
164
165
  }
165
166
  export {
166
- ce as createAppV2,
167
+ de as createAppV2,
167
168
  Y as createNextAuthorMarker,
168
169
  O as patchPoolingDelay
169
170
  };
@@ -1 +1 @@
1
- {"version":3,"file":"createAppV2.js","sources":["../../src/internal/createAppV2.ts"],"sourcesContent":["import { deepClone, delay, uniqueId } from '@milaboratories/helpers';\nimport type { Mutable } from '@milaboratories/helpers';\nimport type { NavigationState, BlockOutputsBase, BlockState, PlatformaV2, ValueWithUTag, AuthorMarker } from '@platforma-sdk/model';\nimport { hasAbortError, unwrapResult } from '@platforma-sdk/model';\nimport type { Ref } from 'vue';\nimport { reactive, computed, ref } from 'vue';\nimport type { StateModelOptions, UnwrapOutputs, OutputValues, OutputErrors, AppSettings } from '../types';\nimport { createModel } from '../createModel';\nimport { parseQuery } from '../urls';\nimport { MultiError, unwrapValueOrErrors } from '../utils';\nimport { applyPatch } from 'fast-json-patch';\nimport { UpdateSerializer } from './UpdateSerializer';\nimport { watchIgnorable } from '@vueuse/core';\n\nexport const patchPoolingDelay = 100;\n\nexport const createNextAuthorMarker = (marker: AuthorMarker | undefined): AuthorMarker => ({\n authorId: marker?.authorId ?? uniqueId(),\n localVersion: (marker?.localVersion ?? 0) + 1,\n});\n\nconst stringifyForDebug = (v: unknown) => {\n try {\n return JSON.stringify(v, null, 2);\n } catch (err) {\n return err instanceof Error ? err.message : String(err);\n }\n};\n\n/**\n * Creates an application instance with reactive state management, outputs, and methods for state updates and navigation.\n *\n * @template Args - The type of arguments used in the application.\n * @template Outputs - The type of block outputs extending `BlockOutputsBase`.\n * @template UiState - The type of the UI state.\n * @template Href - The type of navigation href, defaulting to a string starting with `/`.\n *\n * @param state - Initial state of the application, including args, outputs, UI state, and navigation state.\n * @param platforma - A platform interface for interacting with block states.\n * @param settings - Application settings, such as debug flags.\n *\n * @returns A reactive application object with methods, getters, and state.\n */\nexport function createAppV2<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n>(\n state: ValueWithUTag<BlockState<Args, Outputs, UiState, Href>>,\n platforma: PlatformaV2<Args, Outputs, UiState, Href>,\n settings: AppSettings,\n) {\n const debug = (msg: string, ...rest: unknown[]) => {\n if (settings.debug) {\n console.log(`%c>>> %c${msg}`, 'color: orange; font-weight: bold', 'color: orange', ...rest.map((r) => stringifyForDebug(r)));\n }\n };\n\n const error = (msg: string, ...rest: unknown[]) => {\n console.error(`%c>>> %c${msg}`, 'color: red; font-weight: bold', 'color: red', ...rest.map((r) => stringifyForDebug(r)));\n };\n\n const data = {\n isExternalSnapshot: false,\n author: {\n authorId: uniqueId(),\n localVersion: 0,\n },\n };\n\n const nextAuthorMarker = () => {\n data.author = createNextAuthorMarker(data.author);\n debug('nextAuthorMarker', data.author);\n return data.author;\n };\n\n const closedRef = ref(false);\n\n const uTagRef = ref(state.uTag);\n\n const debounceSpan = settings.debounceSpan ?? 200;\n\n const setArgsQueue = new UpdateSerializer({ debounceSpan });\n const setUiStateQueue = new UpdateSerializer({ debounceSpan });\n const setArgsAndUiStateQueue = new UpdateSerializer({ debounceSpan });\n const setNavigationStateQueue = new UpdateSerializer({ debounceSpan });\n /**\n * Reactive snapshot of the application state, including args, outputs, UI state, and navigation state.\n */\n const snapshot = ref<{\n args: Args;\n outputs: Partial<Outputs>;\n ui: UiState;\n navigationState: NavigationState<Href>;\n }>(state.value) as Ref<{\n args: Args;\n outputs: Partial<Outputs>;\n ui: UiState;\n navigationState: NavigationState<Href>;\n }>;\n\n const setBlockArgs = async (args: Args) => {\n return platforma.setBlockArgs(args, nextAuthorMarker());\n };\n\n const setBlockUiState = async (ui: UiState) => {\n return platforma.setBlockUiState(ui, nextAuthorMarker());\n };\n\n const setBlockArgsAndUiState = async (args: Args, ui: UiState) => {\n return platforma.setBlockArgsAndUiState(args, ui, nextAuthorMarker());\n };\n\n const setNavigationState = async (state: NavigationState<Href>) => {\n return platforma.setNavigationState(state);\n };\n\n const outputs = computed<OutputValues<Outputs>>(() => {\n const entries = Object.entries(snapshot.value.outputs as Partial<Readonly<Outputs>>).map(([k, vOrErr]) => [k, vOrErr.ok && vOrErr.value !== undefined ? vOrErr.value : undefined]);\n return Object.fromEntries(entries);\n });\n\n const outputErrors = computed<OutputErrors<Outputs>>(() => {\n const entries = Object.entries(snapshot.value.outputs as Partial<Readonly<Outputs>>).map(([k, vOrErr]) => [k, vOrErr && !vOrErr.ok ? new MultiError(vOrErr.errors) : undefined]);\n return Object.fromEntries(entries);\n });\n\n const appModel = reactive({\n error: '',\n model: {\n args: deepClone(snapshot.value.args) as Args,\n ui: deepClone(snapshot.value.ui) as UiState,\n outputs,\n outputErrors,\n },\n }) as {\n error: string;\n model: {\n args: Args;\n ui: UiState;\n outputs: OutputValues<Outputs>;\n outputErrors: OutputErrors<Outputs>;\n };\n };\n\n const { ignoreUpdates } = watchIgnorable(\n () => appModel.model,\n (_newData) => {\n const newData = deepClone(_newData);\n debug('setArgsAndUiStateQueue appModel.model', newData);\n setArgsAndUiStateQueue.run(() => setBlockArgsAndUiState(newData.args, newData.ui).then(unwrapResult));\n },\n { deep: true },\n );\n\n const updateAppModel = (newData: {\n args: Args;\n ui: UiState;\n }) => {\n debug('updateAppModel', newData);\n appModel.model.args = deepClone(newData.args) as Args;\n appModel.model.ui = deepClone(newData.ui) as UiState;\n };\n\n (async () => {\n window.addEventListener('beforeunload', () => {\n closedRef.value = true;\n platforma.dispose().then(unwrapResult).catch((err) => {\n error('error in dispose', err);\n });\n });\n\n while (!closedRef.value) {\n try {\n const patches = await platforma.getPatches(uTagRef.value).then(unwrapResult);\n\n debug('patches.length', patches.value.length);\n debug('uTagRef.value', uTagRef.value);\n debug('patches.uTag', patches.uTag);\n debug('patches.author', patches.author);\n debug('data.author', data.author);\n\n uTagRef.value = patches.uTag;\n\n if (patches.value.length === 0) {\n await new Promise((resolve) => setTimeout(resolve, patchPoolingDelay));\n continue;\n }\n\n const isAuthorChanged = data.author?.authorId !== patches.author?.authorId;\n\n // Immutable behavior, apply external changes to the snapshot\n if (isAuthorChanged || data.isExternalSnapshot) {\n debug('got external changes, applying them to the snapshot', snapshot.value);\n ignoreUpdates(() => {\n snapshot.value = applyPatch(snapshot.value, patches.value, false, false).newDocument;\n updateAppModel({ args: snapshot.value.args, ui: snapshot.value.ui });\n data.isExternalSnapshot = isAuthorChanged;\n });\n } else {\n // Mutable behavior\n snapshot.value = applyPatch(snapshot.value, patches.value).newDocument;\n }\n\n await new Promise((resolve) => setTimeout(resolve, patchPoolingDelay));\n } catch (err) {\n if (hasAbortError(err)) {\n debug('patches loop aborted');\n closedRef.value = true;\n } else {\n error('error in patches loop', err);\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n }\n }\n })();\n\n const cloneArgs = () => deepClone(appModel.model.args) as Args;\n const cloneUiState = () => deepClone(appModel.model.ui) as UiState;\n const cloneNavigationState = () => deepClone(snapshot.value.navigationState) as Mutable<NavigationState<Href>>;\n\n const methods = {\n cloneArgs,\n cloneUiState,\n cloneNavigationState,\n createArgsModel<T extends Args = Args>(options: StateModelOptions<Args, T> = {}) {\n return createModel<T, Args>({\n get() {\n if (options.transform) {\n return options.transform(snapshot.value.args as Args);\n }\n\n return snapshot.value.args as T;\n },\n validate: options.validate,\n autoSave: true,\n onSave(newArgs) {\n setArgsQueue.run(() => setBlockArgs(newArgs).then(unwrapResult));\n },\n });\n },\n /**\n * defaultUiState is temporarily here, remove it after implementing initialUiState\n */\n createUiModel<T extends UiState = UiState>(options: StateModelOptions<UiState, T> = {}, defaultUiState: () => UiState) {\n return createModel<T, UiState>({\n get() {\n if (options.transform) {\n return options.transform(snapshot.value.ui as UiState);\n }\n\n return (snapshot.value.ui ?? defaultUiState()) as T;\n },\n validate: options.validate,\n autoSave: true,\n onSave(newData) {\n setUiStateQueue.run(() => setBlockUiState(newData).then(unwrapResult));\n },\n });\n },\n /**\n * Retrieves the unwrapped values of outputs for the given keys.\n *\n * @template K - Keys of the outputs to unwrap.\n * @param keys - List of output names.\n * @throws Error if the outputs contain errors.\n * @returns An object with unwrapped output values.\n */\n unwrapOutputs<K extends keyof Outputs>(...keys: K[]): UnwrapOutputs<Outputs, K> {\n const outputs = snapshot.value.outputs as Partial<Readonly<Outputs>>;\n const entries = keys.map((key) => [key, unwrapValueOrErrors(outputs[key])]);\n return Object.fromEntries(entries);\n },\n /**\n * Updates the arguments state by applying a callback.\n *\n * @param cb - Callback to modify the current arguments.\n * @returns A promise resolving after the update is applied.\n */\n updateArgs(cb: (args: Args) => void): Promise<boolean> {\n const newArgs = cloneArgs();\n cb(newArgs);\n debug('updateArgs', newArgs);\n appModel.model.args = newArgs;\n return setArgsQueue.run(() => setBlockArgs(newArgs).then(unwrapResult));\n },\n /**\n * Updates the UI state by applying a callback.\n *\n * @param cb - Callback to modify the current UI state.\n * @returns A promise resolving after the update is applied.\n * @todo Make it mutable since there is already an initial one\n */\n updateUiState(cb: (args: UiState) => UiState): Promise<boolean> {\n const newUiState = cb(cloneUiState());\n debug('updateUiState', newUiState);\n appModel.model.ui = newUiState;\n return setUiStateQueue.run(() => setBlockUiState(newUiState).then(unwrapResult));\n },\n /**\n * Navigates to a specific href by updating the navigation state.\n *\n * @param href - The target href to navigate to.\n * @returns A promise resolving after the navigation state is updated.\n */\n navigateTo(href: Href) {\n const newState = cloneNavigationState();\n newState.href = href;\n return setNavigationStateQueue.run(() => setNavigationState(newState).then(unwrapResult));\n },\n async allSettled() {\n await delay(0);\n return setArgsAndUiStateQueue.allSettled();\n },\n };\n\n const getters = {\n closedRef,\n snapshot,\n queryParams: computed(() => parseQuery<Href>(snapshot.value.navigationState.href as Href)),\n href: computed(() => snapshot.value.navigationState.href),\n hasErrors: computed(() => Object.values(snapshot.value.outputs as Partial<Readonly<Outputs>>).some((v) => !v?.ok)),\n };\n\n return reactive(Object.assign(appModel, methods, getters));\n}\n\nexport type BaseAppV2<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n> = ReturnType<typeof createAppV2<Args, Outputs, UiState, Href>>;\n"],"names":["patchPoolingDelay","createNextAuthorMarker","marker","uniqueId","stringifyForDebug","v","err","createAppV2","state","platforma","settings","debug","msg","rest","r","error","data","nextAuthorMarker","closedRef","ref","uTagRef","debounceSpan","setArgsQueue","UpdateSerializer","setUiStateQueue","setArgsAndUiStateQueue","setNavigationStateQueue","snapshot","setBlockArgs","args","setBlockUiState","ui","setBlockArgsAndUiState","setNavigationState","outputs","computed","entries","k","vOrErr","outputErrors","MultiError","appModel","reactive","deepClone","ignoreUpdates","watchIgnorable","_newData","newData","unwrapResult","updateAppModel","patches","resolve","isAuthorChanged","_a","_b","applyPatch","hasAbortError","cloneArgs","cloneUiState","cloneNavigationState","methods","options","createModel","newArgs","defaultUiState","keys","key","unwrapValueOrErrors","cb","newUiState","href","newState","delay","getters","parseQuery"],"mappings":"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"}
1
+ {"version":3,"file":"createAppV2.js","sources":["../../src/internal/createAppV2.ts"],"sourcesContent":["import { deepClone, delay, uniqueId } from '@milaboratories/helpers';\nimport type { Mutable } from '@milaboratories/helpers';\nimport type { NavigationState, BlockOutputsBase, BlockState, PlatformaV2, ValueWithUTag, AuthorMarker } from '@platforma-sdk/model';\nimport { hasAbortError, unwrapResult } from '@platforma-sdk/model';\nimport type { Ref } from 'vue';\nimport { reactive, computed, ref } from 'vue';\nimport type { StateModelOptions, UnwrapOutputs, OutputValues, OutputErrors, AppSettings } from '../types';\nimport { createModel } from '../createModel';\nimport { parseQuery } from '../urls';\nimport { MultiError, unwrapValueOrErrors } from '../utils';\nimport { applyPatch } from 'fast-json-patch';\nimport { UpdateSerializer } from './UpdateSerializer';\nimport { watchIgnorable } from '@vueuse/core';\n\nexport const patchPoolingDelay = 100;\n\nexport const createNextAuthorMarker = (marker: AuthorMarker | undefined): AuthorMarker => ({\n authorId: marker?.authorId ?? uniqueId(),\n localVersion: (marker?.localVersion ?? 0) + 1,\n});\n\nconst stringifyForDebug = (v: unknown) => {\n try {\n return JSON.stringify(v, null, 2);\n } catch (err) {\n return err instanceof Error ? err.message : String(err);\n }\n};\n\n/**\n * Creates an application instance with reactive state management, outputs, and methods for state updates and navigation.\n *\n * @template Args - The type of arguments used in the application.\n * @template Outputs - The type of block outputs extending `BlockOutputsBase`.\n * @template UiState - The type of the UI state.\n * @template Href - The type of navigation href, defaulting to a string starting with `/`.\n *\n * @param state - Initial state of the application, including args, outputs, UI state, and navigation state.\n * @param platforma - A platform interface for interacting with block states.\n * @param settings - Application settings, such as debug flags.\n *\n * @returns A reactive application object with methods, getters, and state.\n */\nexport function createAppV2<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n>(\n state: ValueWithUTag<BlockState<Args, Outputs, UiState, Href>>,\n platforma: PlatformaV2<Args, Outputs, UiState, Href>,\n settings: AppSettings,\n) {\n const debug = (msg: string, ...rest: unknown[]) => {\n if (settings.debug) {\n console.log(`%c>>> %c${msg}`, 'color: orange; font-weight: bold', 'color: orange', ...rest.map((r) => stringifyForDebug(r)));\n }\n };\n\n const error = (msg: string, ...rest: unknown[]) => {\n console.error(`%c>>> %c${msg}`, 'color: red; font-weight: bold', 'color: red', ...rest.map((r) => stringifyForDebug(r)));\n };\n\n const data = {\n isExternalSnapshot: false,\n author: {\n authorId: uniqueId(),\n localVersion: 0,\n },\n };\n\n const nextAuthorMarker = () => {\n data.author = createNextAuthorMarker(data.author);\n debug('nextAuthorMarker', data.author);\n return data.author;\n };\n\n const closedRef = ref(false);\n\n const uTagRef = ref(state.uTag);\n\n const debounceSpan = settings.debounceSpan ?? 200;\n\n const setArgsQueue = new UpdateSerializer({ debounceSpan });\n const setUiStateQueue = new UpdateSerializer({ debounceSpan });\n const setArgsAndUiStateQueue = new UpdateSerializer({ debounceSpan });\n const setNavigationStateQueue = new UpdateSerializer({ debounceSpan });\n /**\n * Reactive snapshot of the application state, including args, outputs, UI state, and navigation state.\n */\n const snapshot = ref<{\n args: Args;\n outputs: Partial<Outputs>;\n ui: UiState;\n navigationState: NavigationState<Href>;\n }>(state.value) as Ref<{\n args: Args;\n outputs: Partial<Outputs>;\n ui: UiState;\n navigationState: NavigationState<Href>;\n }>;\n\n const setBlockArgs = async (args: Args) => {\n return platforma.setBlockArgs(args, nextAuthorMarker());\n };\n\n const setBlockUiState = async (ui: UiState) => {\n return platforma.setBlockUiState(ui, nextAuthorMarker());\n };\n\n const setBlockArgsAndUiState = async (args: Args, ui: UiState) => {\n return platforma.setBlockArgsAndUiState(args, ui, nextAuthorMarker());\n };\n\n const setNavigationState = async (state: NavigationState<Href>) => {\n return platforma.setNavigationState(state);\n };\n\n const outputs = computed<OutputValues<Outputs>>(() => {\n const entries = Object.entries(snapshot.value.outputs as Partial<Readonly<Outputs>>).map(([k, vOrErr]) => [k, vOrErr.ok && vOrErr.value !== undefined ? vOrErr.value : undefined]);\n return Object.fromEntries(entries);\n });\n\n const outputErrors = computed<OutputErrors<Outputs>>(() => {\n const entries = Object.entries(snapshot.value.outputs as Partial<Readonly<Outputs>>).map(([k, vOrErr]) => [k, vOrErr && !vOrErr.ok ? new MultiError(vOrErr.errors) : undefined]);\n return Object.fromEntries(entries);\n });\n\n const appModel = reactive({\n error: '',\n model: {\n args: deepClone(snapshot.value.args) as Args,\n ui: deepClone(snapshot.value.ui) as UiState,\n outputs,\n outputErrors,\n },\n }) as {\n error: string;\n model: {\n args: Args;\n ui: UiState;\n outputs: OutputValues<Outputs>;\n outputErrors: OutputErrors<Outputs>;\n };\n };\n\n const { ignoreUpdates } = watchIgnorable(\n () => appModel.model,\n (_newData) => {\n const newData = deepClone(_newData);\n debug('setArgsAndUiStateQueue appModel.model', newData);\n setArgsAndUiStateQueue.run(() => setBlockArgsAndUiState(newData.args, newData.ui).then(unwrapResult));\n },\n { deep: true },\n );\n\n const updateAppModel = (newData: {\n args: Args;\n ui: UiState;\n }) => {\n debug('updateAppModel', newData);\n appModel.model.args = deepClone(newData.args) as Args;\n appModel.model.ui = deepClone(newData.ui) as UiState;\n };\n\n (async () => {\n window.addEventListener('beforeunload', () => {\n closedRef.value = true;\n platforma.dispose().then(unwrapResult).catch((err) => {\n error('error in dispose', err);\n });\n });\n\n while (!closedRef.value) {\n try {\n const patches = await platforma.getPatches(uTagRef.value).then(unwrapResult);\n\n debug('patches.length', patches.value.length);\n debug('uTagRef.value', uTagRef.value);\n debug('patches.uTag', patches.uTag);\n debug('patches.author', patches.author);\n debug('data.author', data.author);\n\n uTagRef.value = patches.uTag;\n\n if (patches.value.length === 0) {\n await new Promise((resolve) => setTimeout(resolve, patchPoolingDelay));\n continue;\n }\n\n const isAuthorChanged = data.author?.authorId !== patches.author?.authorId;\n\n // Immutable behavior, apply external changes to the snapshot\n if (isAuthorChanged || data.isExternalSnapshot) {\n debug('got external changes, applying them to the snapshot', snapshot.value);\n ignoreUpdates(() => {\n snapshot.value = applyPatch(snapshot.value, patches.value, false, false).newDocument;\n updateAppModel({ args: snapshot.value.args, ui: snapshot.value.ui });\n data.isExternalSnapshot = isAuthorChanged;\n });\n } else {\n // Mutable behavior\n snapshot.value = applyPatch(snapshot.value, patches.value).newDocument;\n }\n\n await new Promise((resolve) => setTimeout(resolve, patchPoolingDelay));\n } catch (err) {\n if (hasAbortError(err)) {\n debug('patches loop aborted');\n closedRef.value = true;\n } else {\n error('error in patches loop', err);\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n }\n }\n })();\n\n const cloneArgs = () => deepClone(appModel.model.args) as Args;\n const cloneUiState = () => deepClone(appModel.model.ui) as UiState;\n const cloneNavigationState = () => deepClone(snapshot.value.navigationState) as Mutable<NavigationState<Href>>;\n\n const methods = {\n cloneArgs,\n cloneUiState,\n cloneNavigationState,\n createArgsModel<T extends Args = Args>(options: StateModelOptions<Args, T> = {}) {\n return createModel<T, Args>({\n get() {\n if (options.transform) {\n return options.transform(snapshot.value.args as Args);\n }\n\n return snapshot.value.args as T;\n },\n validate: options.validate,\n autoSave: true,\n onSave(newArgs) {\n setArgsQueue.run(() => setBlockArgs(newArgs).then(unwrapResult));\n },\n });\n },\n /**\n * defaultUiState is temporarily here, remove it after implementing initialUiState\n */\n createUiModel<T extends UiState = UiState>(options: StateModelOptions<UiState, T> = {}, defaultUiState: () => UiState) {\n return createModel<T, UiState>({\n get() {\n if (options.transform) {\n return options.transform(snapshot.value.ui as UiState);\n }\n\n return (snapshot.value.ui ?? defaultUiState()) as T;\n },\n validate: options.validate,\n autoSave: true,\n onSave(newData) {\n setUiStateQueue.run(() => setBlockUiState(newData).then(unwrapResult));\n },\n });\n },\n /**\n * Retrieves the unwrapped values of outputs for the given keys.\n *\n * @template K - Keys of the outputs to unwrap.\n * @param keys - List of output names.\n * @throws Error if the outputs contain errors.\n * @returns An object with unwrapped output values.\n */\n unwrapOutputs<K extends keyof Outputs>(...keys: K[]): UnwrapOutputs<Outputs, K> {\n const outputs = snapshot.value.outputs as Partial<Readonly<Outputs>>;\n const entries = keys.map((key) => [key, unwrapValueOrErrors(outputs[key])]);\n return Object.fromEntries(entries);\n },\n /**\n * Updates the arguments state by applying a callback.\n *\n * @param cb - Callback to modify the current arguments.\n * @returns A promise resolving after the update is applied.\n */\n updateArgs(cb: (args: Args) => void): Promise<boolean> {\n const newArgs = cloneArgs();\n cb(newArgs);\n debug('updateArgs', newArgs);\n appModel.model.args = newArgs;\n return setArgsQueue.run(() => setBlockArgs(newArgs).then(unwrapResult));\n },\n /**\n * Updates the UI state by applying a callback.\n *\n * @param cb - Callback to modify the current UI state.\n * @returns A promise resolving after the update is applied.\n * @todo Make it mutable since there is already an initial one\n */\n updateUiState(cb: (args: UiState) => UiState): Promise<boolean> {\n const newUiState = cb(cloneUiState());\n debug('updateUiState', newUiState);\n appModel.model.ui = newUiState;\n return setUiStateQueue.run(() => setBlockUiState(newUiState).then(unwrapResult));\n },\n /**\n * Navigates to a specific href by updating the navigation state.\n *\n * @param href - The target href to navigate to.\n * @returns A promise resolving after the navigation state is updated.\n */\n navigateTo(href: Href) {\n const newState = cloneNavigationState();\n newState.href = href;\n return setNavigationStateQueue.run(() => setNavigationState(newState).then(unwrapResult));\n },\n async allSettled() {\n await delay(0);\n return setArgsAndUiStateQueue.allSettled();\n },\n };\n\n const getters = {\n closedRef,\n snapshot,\n queryParams: computed(() => parseQuery<Href>(snapshot.value.navigationState.href as Href)),\n href: computed(() => snapshot.value.navigationState.href),\n hasErrors: computed(() => Object.values(snapshot.value.outputs as Partial<Readonly<Outputs>>).some((v) => !v?.ok)),\n };\n\n return reactive(Object.assign(appModel, methods, getters));\n}\n\nexport type BaseAppV2<\n Args = unknown,\n Outputs extends BlockOutputsBase = BlockOutputsBase,\n UiState = unknown,\n Href extends `/${string}` = `/${string}`,\n> = ReturnType<typeof createAppV2<Args, Outputs, UiState, Href>>;\n"],"names":["patchPoolingDelay","createNextAuthorMarker","marker","uniqueId","stringifyForDebug","v","err","createAppV2","state","platforma","settings","debug","msg","rest","r","error","data","nextAuthorMarker","closedRef","ref","uTagRef","debounceSpan","setArgsQueue","UpdateSerializer","setUiStateQueue","setArgsAndUiStateQueue","setNavigationStateQueue","snapshot","setBlockArgs","args","setBlockUiState","ui","setBlockArgsAndUiState","setNavigationState","outputs","computed","entries","k","vOrErr","outputErrors","MultiError","appModel","reactive","deepClone","ignoreUpdates","watchIgnorable","_newData","newData","unwrapResult","updateAppModel","patches","resolve","isAuthorChanged","_a","_b","applyPatch","hasAbortError","cloneArgs","cloneUiState","cloneNavigationState","methods","options","createModel","newArgs","defaultUiState","keys","key","unwrapValueOrErrors","cb","newUiState","href","newState","delay","getters","parseQuery"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ function s(r, n) {
2
+ if (!r)
3
+ return n;
4
+ const e = r.trim().toLowerCase().match(/^(\d+)(ms|s|m|h)?$/);
5
+ if (!e)
6
+ return n;
7
+ const t = Number(e[1]);
8
+ switch (e[2]) {
9
+ case "ms":
10
+ return t;
11
+ case "s":
12
+ return t * 1e3;
13
+ case "m":
14
+ return t * 6e4;
15
+ case "h":
16
+ return t * 36e5;
17
+ default:
18
+ return t;
19
+ }
20
+ }
21
+ function u(r = 6e4) {
22
+ return s(process.env.TEST_TIMEOUT, r);
23
+ }
24
+ u();
25
+ export {
26
+ u as getTestTimeout
27
+ };
28
+ //# sourceMappingURL=test_timeouts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_timeouts.js","sources":["../../../../../../../lib/util/helpers/src/test_timeouts.ts"],"sourcesContent":["/**\n * Supports values like: \"15000\", \"15s\", \"2m\", \"1h\", \"500ms\".\n */\nfunction parseDuration(value: string | undefined, fallback: number): number {\n if (!value) return fallback;\n const v = value.trim().toLowerCase();\n const m = v.match(/^(\\d+)(ms|s|m|h)?$/);\n if (!m) return fallback;\n\n const n = Number(m[1]);\n const unit = m[2] as 'ms' | 's' | 'm' | 'h' | undefined;\n\n switch (unit) {\n case 'ms': return n;\n case 's': return n * 1_000;\n case 'm': return n * 60_000;\n case 'h': return n * 3_600_000;\n default: return n; // no suffix — treat as milliseconds\n }\n}\n\nexport function getTestTimeout(fallback = 60_000): number {\n return parseDuration(process.env.TEST_TIMEOUT, fallback);\n}\n\nexport const TEST_TIMEOUT = getTestTimeout();\n"],"names":["parseDuration","value","fallback","m","n","getTestTimeout"],"mappings":"AAGA,SAASA,EAAcC,GAA2BC,GAAgB;AAChE,MAAI,CAACD;AAAO,WAAOC;AAEnB,QAAMC,IADIF,EAAM,KAAI,EAAG,YAAW,EACtB,MAAM,oBAAoB;AACtC,MAAI,CAACE;AAAG,WAAOD;AAEf,QAAME,IAAI,OAAOD,EAAE,CAAC,CAAC;AAGrB,UAFaA,EAAE,CAAC,GAEJ;AAAA,IACV,KAAK;AAAM,aAAOC;AAAA,IAClB,KAAK;AAAK,aAAOA,IAAI;AAAA,IACrB,KAAK;AAAK,aAAOA,IAAI;AAAA,IACrB,KAAK;AAAK,aAAOA,IAAI;AAAA,IACrB;AAAS,aAAOA;AAAA;AAEpB;AAEM,SAAUC,EAAeH,IAAW,KAAM;AAC9C,SAAOF,EAAc,QAAQ,IAAI,cAAcE,CAAQ;AACzD;AAE4BG,EAAc;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platforma-sdk/ui-vue",
3
- "version": "1.42.42",
3
+ "version": "1.42.44",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "styles": "dist/index.js",
@@ -26,8 +26,8 @@
26
26
  "d3-format": "^3.1.0",
27
27
  "zod": "~3.23.8",
28
28
  "@milaboratories/biowasm-tools": "1.1.2",
29
- "@milaboratories/uikit": "2.4.8",
30
- "@platforma-sdk/model": "1.42.36"
29
+ "@platforma-sdk/model": "1.42.36",
30
+ "@milaboratories/uikit": "2.4.9"
31
31
  },
32
32
  "devDependencies": {
33
33
  "happy-dom": "^15.11.7",
@@ -42,11 +42,11 @@
42
42
  "yarpm": "^1.2.0",
43
43
  "fast-json-patch": "^3.1.1",
44
44
  "@faker-js/faker": "^9.2.0",
45
- "@milaboratories/ts-configs": "1.0.6",
46
- "@milaboratories/build-configs": "1.0.8",
47
45
  "@milaboratories/eslint-config": "1.0.4",
48
- "@milaboratories/ts-builder": "1.0.5",
49
- "@milaboratories/helpers": "1.6.22"
46
+ "@milaboratories/build-configs": "1.0.8",
47
+ "@milaboratories/ts-configs": "1.0.6",
48
+ "@milaboratories/helpers": "1.7.0",
49
+ "@milaboratories/ts-builder": "1.0.5"
50
50
  },
51
51
  "scripts": {
52
52
  "test": "vitest run --passWithNoTests",