@platforma-sdk/ui-vue 1.40.5 → 1.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/.turbo/turbo-build.log +52 -25
  2. package/.turbo/turbo-type-check.log +1 -1
  3. package/CHANGELOG.md +21 -0
  4. package/dist/AgGridVue/useAgGridOptions.js +54 -53
  5. package/dist/AgGridVue/useAgGridOptions.js.map +1 -1
  6. package/dist/components/BlockLayout.vue.d.ts.map +1 -1
  7. package/dist/components/BlockLayout.vue.js +7 -50
  8. package/dist/components/BlockLayout.vue.js.map +1 -1
  9. package/dist/components/BlockLayout.vue2.js +53 -2
  10. package/dist/components/BlockLayout.vue2.js.map +1 -1
  11. package/dist/components/BlockLayout.vue3.js +9 -0
  12. package/dist/components/BlockLayout.vue3.js.map +1 -0
  13. package/dist/components/NotFound.vue.d.ts.map +1 -1
  14. package/dist/components/NotFound.vue.js +12 -14
  15. package/dist/components/NotFound.vue.js.map +1 -1
  16. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue.d.ts +1 -4
  17. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue.d.ts.map +1 -1
  18. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js +155 -172
  19. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js.map +1 -1
  20. package/dist/components/PlAgDataTable/PlAgRowCount.vue.js +7 -6
  21. package/dist/components/PlAgDataTable/PlAgRowCount.vue.js.map +1 -1
  22. package/dist/components/PlAgDataTable/sources/table-source-v2.d.ts +2 -2
  23. package/dist/components/PlAgDataTable/sources/table-source-v2.d.ts.map +1 -1
  24. package/dist/components/PlAgDataTable/sources/table-source-v2.js +110 -105
  25. package/dist/components/PlAgDataTable/sources/table-source-v2.js.map +1 -1
  26. package/dist/components/PlAgDataTable/types.d.ts +27 -43
  27. package/dist/components/PlAgDataTable/types.d.ts.map +1 -1
  28. package/dist/components/PlAgDataTable/types.js +32 -43
  29. package/dist/components/PlAgDataTable/types.js.map +1 -1
  30. package/dist/components/PlAgRowNumCheckbox/PlAgRowNumCheckbox.vue.js +10 -9
  31. package/dist/components/PlAgRowNumCheckbox/PlAgRowNumCheckbox.vue.js.map +1 -1
  32. package/dist/components/PlAgRowNumHeader.vue.js +3 -2
  33. package/dist/components/PlAgRowNumHeader.vue.js.map +1 -1
  34. package/dist/components/PlAnnotations/components/DynamicForm.vue2.js +10 -10
  35. package/dist/components/PlAnnotations/components/PlAnnotationCreateDialog.vue.d.ts +1 -1
  36. package/dist/components/PlAnnotations/components/PlAnnotationCreateDialog.vue.d.ts.map +1 -1
  37. package/dist/components/PlMultiSequenceAlignment/data.js +51 -51
  38. package/dist/composition/fileContent.js +16 -16
  39. package/dist/defineApp.d.ts +19 -6
  40. package/dist/defineApp.d.ts.map +1 -1
  41. package/dist/defineApp.js +50 -30
  42. package/dist/defineApp.js.map +1 -1
  43. package/dist/internal/UpdateSerializer.d.ts +26 -0
  44. package/dist/internal/UpdateSerializer.d.ts.map +1 -0
  45. package/dist/internal/UpdateSerializer.js +65 -0
  46. package/dist/internal/UpdateSerializer.js.map +1 -0
  47. package/dist/internal/createAppModel.d.ts +1 -1
  48. package/dist/internal/createAppModel.d.ts.map +1 -1
  49. package/dist/internal/createAppModel.js +43 -51
  50. package/dist/internal/createAppModel.js.map +1 -1
  51. package/dist/internal/{createApp.d.ts → createAppV1.d.ts} +4 -4
  52. package/dist/internal/createAppV1.d.ts.map +1 -0
  53. package/dist/internal/{createApp.js → createAppV1.js} +17 -18
  54. package/dist/internal/createAppV1.js.map +1 -0
  55. package/dist/internal/createAppV2.d.ts +56 -0
  56. package/dist/internal/createAppV2.d.ts.map +1 -0
  57. package/dist/internal/createAppV2.js +158 -0
  58. package/dist/internal/createAppV2.js.map +1 -0
  59. package/dist/internal/test-helpers/BlockMock.d.ts +28 -0
  60. package/dist/internal/test-helpers/BlockMock.d.ts.map +1 -0
  61. package/dist/internal/test-helpers/createMockApi.d.ts +4 -0
  62. package/dist/internal/test-helpers/createMockApi.d.ts.map +1 -0
  63. package/dist/internal/test-helpers/utils.d.ts +4 -0
  64. package/dist/internal/test-helpers/utils.d.ts.map +1 -0
  65. package/dist/{types.static-test.d.ts → internal/v1.static-test.d.ts} +3 -3
  66. package/dist/internal/v1.static-test.d.ts.map +1 -0
  67. package/dist/internal/v2.static-test.d.ts +7 -0
  68. package/dist/internal/v2.static-test.d.ts.map +1 -0
  69. package/dist/lib/model/common/dist/index.js +214 -199
  70. package/dist/lib/model/common/dist/index.js.map +1 -1
  71. package/dist/lib/ui/uikit/dist/components/PlAccordion/{ExpandTransition.vue.js → ExpandTransition.vue2.js} +1 -1
  72. package/dist/lib/ui/uikit/dist/components/PlAccordion/ExpandTransition.vue2.js.map +1 -0
  73. package/dist/lib/ui/uikit/dist/components/PlAccordion/PlAccordionSection.vue2.js +1 -1
  74. package/dist/lib/ui/uikit/dist/components/PlDialogModal/PlDialogModal.vue.js.map +1 -1
  75. package/dist/lib/ui/uikit/dist/lib/model/common/dist/index.js +7 -7
  76. package/dist/lib/ui/uikit/dist/sdk/model/dist/index.js +77 -56
  77. package/dist/lib/ui/uikit/dist/sdk/model/dist/index.js.map +1 -1
  78. package/dist/lib/util/helpers/dist/index.js +67 -56
  79. package/dist/lib/util/helpers/dist/index.js.map +1 -1
  80. package/dist/node_modules/.pnpm/fast-json-patch@3.1.1/node_modules/fast-json-patch/index.js +29 -0
  81. package/dist/node_modules/.pnpm/fast-json-patch@3.1.1/node_modules/fast-json-patch/index.js.map +1 -0
  82. package/dist/node_modules/.pnpm/fast-json-patch@3.1.1/node_modules/fast-json-patch/module/core.js +208 -0
  83. package/dist/node_modules/.pnpm/fast-json-patch@3.1.1/node_modules/fast-json-patch/module/core.js.map +1 -0
  84. package/dist/node_modules/.pnpm/fast-json-patch@3.1.1/node_modules/fast-json-patch/module/duplex.js +95 -0
  85. package/dist/node_modules/.pnpm/fast-json-patch@3.1.1/node_modules/fast-json-patch/module/duplex.js.map +1 -0
  86. package/dist/node_modules/.pnpm/fast-json-patch@3.1.1/node_modules/fast-json-patch/module/helpers.js +112 -0
  87. package/dist/node_modules/.pnpm/fast-json-patch@3.1.1/node_modules/fast-json-patch/module/helpers.js.map +1 -0
  88. package/dist/sdk/model/dist/index.js +165 -140
  89. package/dist/sdk/model/dist/index.js.map +1 -1
  90. package/dist/types.d.ts +2 -2
  91. package/dist/types.d.ts.map +1 -1
  92. package/package.json +9 -6
  93. package/src/components/BlockLayout.vue +9 -1
  94. package/src/components/NotFound.vue +1 -3
  95. package/src/components/PlAgDataTable/PlAgDataTableV2.vue +6 -31
  96. package/src/components/PlAgDataTable/sources/table-source-v2.ts +29 -29
  97. package/src/components/PlAgDataTable/types.ts +42 -70
  98. package/src/defineApp.ts +134 -36
  99. package/src/internal/UpdateSerializer.ts +112 -0
  100. package/src/internal/createAppModel.ts +7 -20
  101. package/src/internal/{createApp.ts → createAppV1.ts} +10 -6
  102. package/src/internal/createAppV2.test.ts +158 -0
  103. package/src/internal/createAppV2.ts +309 -0
  104. package/src/internal/test-helpers/BlockMock.ts +144 -0
  105. package/src/internal/test-helpers/createMockApi.ts +92 -0
  106. package/src/internal/test-helpers/utils.ts +65 -0
  107. package/src/{types.static-test.ts → internal/v1.static-test.ts} +5 -9
  108. package/src/internal/v2.static-test.ts +98 -0
  109. package/src/types.ts +2 -2
  110. package/dist/internal/createApp.d.ts.map +0 -1
  111. package/dist/internal/createApp.js.map +0 -1
  112. package/dist/lib/ui/uikit/dist/components/PlAccordion/ExpandTransition.vue.js.map +0 -1
  113. package/dist/types.static-test.d.ts.map +0 -1
@@ -1,77 +1,69 @@
1
- import { ref as f, watch as p, computed as u, unref as w, reactive as M } from "vue";
2
- import { isJsonEqual as O, deepClone as n, deepPatch as P } from "../lib/util/helpers/dist/index.js";
3
- import { identity as Z, isZodError as q, ensureError as A, formatZodError as J } from "../utils.js";
4
- function x(o, d, E) {
5
- const v = o.validate ?? Z, { autoSave: h } = o, t = f(), a = f(), i = (e) => {
6
- var r;
7
- if (E.deepPatchModel) {
8
- const s = (r = a.value) == null ? void 0 : r.model, l = Object.assign(n(e), d ?? {});
9
- a.value = {
10
- model: s ? P(s, l) : l,
11
- stage: Symbol()
12
- };
13
- } else
14
- a.value = {
15
- model: Object.assign(n(e), d ?? {}),
16
- stage: Symbol()
17
- };
1
+ import { ref as d, watch as m, computed as s, unref as w, reactive as Z } from "vue";
2
+ import { isJsonEqual as _, deepClone as g } from "../lib/util/helpers/dist/index.js";
3
+ 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 = {
7
+ model: Object.assign(g(e), f ?? {}),
8
+ stage: Symbol()
9
+ };
18
10
  };
19
- p(
20
- () => o.get(),
21
- (e) => i(e),
11
+ m(
12
+ () => a.get(),
13
+ (e) => n(e),
22
14
  { immediate: !0 }
23
15
  );
24
- const m = () => {
16
+ const v = () => {
25
17
  var e;
26
- o.onSave(v(n((e = a.value) == null ? void 0 : e.model)));
27
- }, S = () => {
28
- i(o.get()), t.value = void 0;
29
- }, g = (e) => {
30
- const r = A(e);
31
- q(r) ? t.value = Error(J(r)) : t.value = r;
32
- }, b = (e) => {
18
+ return a.onSave(c(g((e = o.value) == null ? void 0 : e.model)));
19
+ }, p = () => {
20
+ n(a.get()), t.value = void 0;
21
+ }, i = (e) => {
22
+ const r = x(e);
23
+ q(r) ? t.value = Error(A(r)) : t.value = r;
24
+ }, S = (e) => {
33
25
  t.value = void 0;
34
26
  try {
35
- v(e), h && m();
27
+ c(e), E && v();
36
28
  } catch (r) {
37
- g(r);
29
+ i(r);
38
30
  }
39
- }, c = u({
31
+ }, l = s({
40
32
  get: () => {
41
33
  var e;
42
- return (e = a.value) == null ? void 0 : e.model;
34
+ return (e = o.value) == null ? void 0 : e.model;
43
35
  },
44
36
  set() {
45
37
  throw Error("Cannot replace base model");
46
38
  }
47
39
  });
48
- p(
49
- [() => ({ args: c.value.args, ui: c.value.ui }), () => {
40
+ m(
41
+ [() => ({ args: l.value.args, ui: l.value.ui }), () => {
50
42
  var e;
51
- return (e = a.value) == null ? void 0 : e.stage;
43
+ return (e = o.value) == null ? void 0 : e.stage;
52
44
  }],
53
- ([e, r], [s, l]) => {
54
- r === l && b(e);
45
+ ([e, r], [u, C]) => {
46
+ r === C && S(e);
55
47
  },
56
48
  { deep: !0 }
57
49
  );
58
- const y = u(() => !t.value), C = u(() => {
59
- var s;
60
- const { args: e, ui: r } = ((s = w(a)) == null ? void 0 : s.model) ?? {};
61
- return !O(o.get(), { args: e, ui: r });
62
- }), j = u(() => t.value ? t.value.message : "");
63
- return M({
64
- model: c,
65
- valid: y,
66
- isChanged: C,
50
+ const h = s(() => !t.value), b = s(() => {
51
+ var u;
52
+ const { args: e, ui: r } = ((u = w(o)) == null ? void 0 : u.model) ?? {};
53
+ return !_(a.get(), { args: e, ui: r });
54
+ }), y = s(() => t.value ? t.value.message : "");
55
+ return Z({
56
+ model: l,
57
+ valid: h,
58
+ isChanged: b,
67
59
  error: t,
68
- errorString: j,
69
- save: m,
70
- revert: S,
71
- setError: g
60
+ errorString: y,
61
+ save: v,
62
+ revert: p,
63
+ setError: i
72
64
  });
73
65
  }
74
66
  export {
75
- x as createAppModel
67
+ k as createAppModel
76
68
  };
77
69
  //# 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, deepPatch, 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 if (settings.deepPatchModel) {\n // deep patch\n const model = local.value?.model;\n const updated = Object.assign(deepClone(v), extended ?? {}) as R;\n local.value = {\n model: model ? deepPatch(model, updated) : updated,\n stage: Symbol(),\n };\n } else {\n // shallow replace\n local.value = {\n model: Object.assign(deepClone(v), extended ?? {}) as R,\n stage: Symbol(),\n };\n }\n };\n\n watch(\n () => options.get(),\n (v) => setSource(v),\n { immediate: true },\n );\n\n const save = () => {\n options.onSave(validate(deepClone(local.value?.model)));\n };\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","model","_a","updated","deepClone","deepPatch","watch","save","revert","setError","cause","err","ensureError","isZodError","formatZodError","setValue","computed","n","newStage","_","oldStage","valid","isChanged","args","ui","unref","isJsonEqual","errorString","reactive"],"mappings":";;;AAKgB,SAAAA,EAIdC,GAA6BC,GAAaC,GAAuD;AAG3F,QAAAC,IAAWH,EAAQ,YAAYI,GAE/B,EAAE,UAAAC,MAAaL,GAEfM,IAAQC,EAAuB,GAE/BC,IAAQD,EAA0C,GAElDE,IAAY,CAACC,MAAS;;AAC1B,QAAIR,EAAS,gBAAgB;AAErBS,YAAAA,KAAQC,IAAAJ,EAAM,UAAN,gBAAAI,EAAa,OACrBC,IAAU,OAAO,OAAOC,EAAUJ,CAAC,GAAGT,KAAY,EAAE;AAC1D,MAAAO,EAAM,QAAQ;AAAA,QACZ,OAAOG,IAAQI,EAAUJ,GAAOE,CAAO,IAAIA;AAAA,QAC3C,OAAO,OAAO;AAAA,MAChB;AAAA,IAAA;AAGA,MAAAL,EAAM,QAAQ;AAAA,QACZ,OAAO,OAAO,OAAOM,EAAUJ,CAAC,GAAGT,KAAY,EAAE;AAAA,QACjD,OAAO,OAAO;AAAA,MAChB;AAAA,EAEJ;AAEA,EAAAe;AAAA,IACE,MAAMhB,EAAQ,IAAI;AAAA,IAClB,CAACU,MAAMD,EAAUC,CAAC;AAAA,IAClB,EAAE,WAAW,GAAK;AAAA,EACpB;AAEA,QAAMO,IAAO,MAAM;;AACjB,IAAAjB,EAAQ,OAAOG,EAASW,GAAUF,IAAAJ,EAAM,UAAN,gBAAAI,EAAa,KAAK,CAAC,CAAC;AAAA,EACxD,GAEMM,IAAS,MAAM;AACT,IAAAT,EAAAT,EAAQ,KAAK,GACvBM,EAAM,QAAQ;AAAA,EAChB,GAEMa,IAAW,CAACC,MAAmB;AAC7B,UAAAC,IAAMC,EAAYF,CAAK;AACzB,IAAAG,EAAWF,CAAG,IAChBf,EAAM,QAAQ,MAAMkB,EAAeH,CAAG,CAAC,IAEvCf,EAAM,QAAQe;AAAA,EAElB,GAEMI,IAAW,CAACf,MAAS;AACzB,IAAAJ,EAAM,QAAQ;AACV,QAAA;AACF,MAAAH,EAASO,CAAC,GACNL,KACGY,EAAA;AAAA,aAEAG,GAAgB;AACvB,MAAAD,EAASC,CAAK;AAAA,IAAA;AAAA,EAElB,GAEMT,IAAQe,EAAY;AAAA,IACxB,KAAK,MAAM;;AACT,cAAOd,IAAAJ,EAAM,UAAN,gBAAAI,EAAa;AAAA,IACtB;AAAA,IACA,MAAM;AACJ,YAAM,MAAM,2BAA2B;AAAA,IAAA;AAAA,EACzC,CACD;AAED,EAAAI;AAAA,IACE,CAAC,OAAO,EAAE,MAAML,EAAM,MAAM,MAAM,IAAIA,EAAM,MAAM,GAAG,IAAI,MAAM;;AAAA,cAAAC,IAAAJ,EAAM,UAAN,gBAAAI,EAAa;AAAA,KAAK;AAAA,IACjF,CAAC,CAACe,GAAGC,CAAQ,GAAG,CAACC,GAAGC,CAAQ,MAAM;AAChC,MAAIF,MAAaE,KACfL,EAASE,CAAM;AAAA,IAEnB;AAAA,IACA,EAAE,MAAM,GAAK;AAAA,EACf;AAEA,QAAMI,IAAQL,EAAS,MAAM,CAACpB,EAAM,KAAK,GAEnC0B,IAAYN,EAAS,MAAM;;AACzB,UAAA,EAAE,MAAAO,GAAM,IAAAC,EAAG,MAAItB,IAAAuB,EAAM3B,CAAK,MAAX,gBAAAI,EAAc,UAAS,CAAC;AACtC,WAAA,CAACwB,EAAYpC,EAAQ,OAAO,EAAE,MAAAiC,GAAM,IAAAC,GAAI;AAAA,EAAA,CAChD,GAEKG,IAAcX,EAAS,MAAOpB,EAAM,QAAQA,EAAM,MAAM,UAAU,EAAG;AAE3E,SAAOgC,EAAS;AAAA,IACd,OAAA3B;AAAA,IACA,OAAAoB;AAAA,IACA,WAAAC;AAAA,IACA,OAAA1B;AAAA,IACA,aAAA+B;AAAA,IACA,MAAApB;AAAA,IACA,QAAAC;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":";;;AAKgB,SAAAA,EAIdC,GAA6BC,GAAaC,GAAwD;AAG5F,QAAAC,IAAWH,EAAQ,YAAYI,GAE/B,EAAE,UAAAC,MAAaL,GAEfM,IAAQC,EAAuB,GAE/BC,IAAQD,EAA0C,GAElDE,IAAY,CAACC,MAAS;AAC1B,IAAAF,EAAM,QAAQ;AAAA,MACZ,OAAO,OAAO,OAAOG,EAAUD,CAAC,GAAGT,KAAY,EAAE;AAAA,MACjD,OAAO,OAAO;AAAA,IAChB;AAAA,EACF;AAEA,EAAAW;AAAA,IACE,MAAMZ,EAAQ,IAAI;AAAA,IAClB,CAACU,MAAMD,EAAUC,CAAC;AAAA,IAClB,EAAE,WAAW,GAAK;AAAA,EACpB;AAEM,QAAAG,IAAO;;AAAM,WAAAb,EAAQ,OAAOG,EAASQ,GAAUG,IAAAN,EAAM,UAAN,gBAAAM,EAAa,KAAK,CAAC,CAAC;AAAA,KAEnEC,IAAS,MAAM;AACT,IAAAN,EAAAT,EAAQ,KAAK,GACvBM,EAAM,QAAQ;AAAA,EAChB,GAEMU,IAAW,CAACC,MAAmB;AAC7B,UAAAC,IAAMC,EAAYF,CAAK;AACzB,IAAAG,EAAWF,CAAG,IAChBZ,EAAM,QAAQ,MAAMe,EAAeH,CAAG,CAAC,IAEvCZ,EAAM,QAAQY;AAAA,EAElB,GAEMI,IAAW,CAACZ,MAAS;AACzB,IAAAJ,EAAM,QAAQ;AACV,QAAA;AACF,MAAAH,EAASO,CAAC,GACNL,KACGQ,EAAA;AAAA,aAEAI,GAAgB;AACvB,MAAAD,EAASC,CAAK;AAAA,IAAA;AAAA,EAElB,GAEMM,IAAQC,EAAY;AAAA,IACxB,KAAK,MAAM;;AACT,cAAOV,IAAAN,EAAM,UAAN,gBAAAM,EAAa;AAAA,IACtB;AAAA,IACA,MAAM;AACJ,YAAM,MAAM,2BAA2B;AAAA,IAAA;AAAA,EACzC,CACD;AAED,EAAAF;AAAA,IACE,CAAC,OAAO,EAAE,MAAMW,EAAM,MAAM,MAAM,IAAIA,EAAM,MAAM,GAAG,IAAI,MAAM;;AAAA,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,GAAK;AAAA,EACf;AAEA,QAAMI,IAAQL,EAAS,MAAM,CAAClB,EAAM,KAAK,GAEnCwB,IAAYN,EAAS,MAAM;;AACzB,UAAA,EAAE,MAAAO,GAAM,IAAAC,EAAG,MAAIlB,IAAAmB,EAAMzB,CAAK,MAAX,gBAAAM,EAAc,UAAS,CAAC;AACtC,WAAA,CAACoB,EAAYlC,EAAQ,OAAO,EAAE,MAAA+B,GAAM,IAAAC,GAAI;AAAA,EAAA,CAChD,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,5 +1,5 @@
1
1
  import { Mutable } from '@milaboratories/helpers';
2
- import { NavigationState, BlockOutputsBase, BlockState, Platforma } from '@platforma-sdk/model';
2
+ import { NavigationState, BlockOutputsBase, BlockState, PlatformaV1 } from '@platforma-sdk/model';
3
3
  import { StateModelOptions, UnwrapOutputs, OptionalResult, OutputValues, OutputErrors, AppSettings } from '../types';
4
4
  /**
5
5
  * Creates an application instance with reactive state management, outputs, and methods for state updates and navigation.
@@ -15,7 +15,7 @@ import { StateModelOptions, UnwrapOutputs, OptionalResult, OutputValues, OutputE
15
15
  *
16
16
  * @returns A reactive application object with methods, getters, and state.
17
17
  */
18
- export declare function createApp<Args = unknown, Outputs extends BlockOutputsBase = BlockOutputsBase, UiState = unknown, Href extends `/${string}` = `/${string}`>(state: BlockState<Args, Outputs, UiState, Href>, platforma: Platforma<Args, Outputs, UiState, Href>, settings: AppSettings): {
18
+ export declare function createAppV1<Args = unknown, Outputs extends BlockOutputsBase = BlockOutputsBase, UiState = unknown, Href extends `/${string}` = `/${string}`>(state: BlockState<Args, Outputs, UiState, Href>, platforma: PlatformaV1<Args, Outputs, UiState, Href>, settings: AppSettings): {
19
19
  model: {
20
20
  args: import('vue').UnwrapRef<Args>;
21
21
  ui: import('vue').UnwrapRef<UiState>;
@@ -49,5 +49,5 @@ export declare function createApp<Args = unknown, Outputs extends BlockOutputsBa
49
49
  href: Href;
50
50
  hasErrors: boolean;
51
51
  };
52
- export type BaseApp<Args = unknown, Outputs extends BlockOutputsBase = BlockOutputsBase, UiState = unknown, Href extends `/${string}` = `/${string}`> = ReturnType<typeof createApp<Args, Outputs, UiState, Href>>;
53
- //# sourceMappingURL=createApp.d.ts.map
52
+ export type BaseAppV1<Args = unknown, Outputs extends BlockOutputsBase = BlockOutputsBase, UiState = unknown, Href extends `/${string}` = `/${string}`> = ReturnType<typeof createAppV1<Args, Outputs, UiState, Href>>;
53
+ //# sourceMappingURL=createAppV1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createAppV1.d.ts","sourceRoot":"","sources":["../../src/internal/createAppV1.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEvG,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAM1H;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CACzB,IAAI,GAAG,OAAO,EACd,OAAO,SAAS,gBAAgB,GAAG,gBAAgB,EACnD,OAAO,GAAG,OAAO,EACjB,IAAI,SAAS,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,EAExC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAC/C,SAAS,EAAE,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EACpD,QAAQ,EAAE,WAAW;;;;;;;;;;;;;;sBAiFH,CAAC,mBAAkB,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC;oBAmB/C,CAAC,qBAAqB,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC,8BAAuB,MAAM,OAAO;iBAqB1F,CAAC,SAAS,MAAM,OAAO,WAAW,CAAC,EAAE,KAAG,cAAc,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBAkC9E,CAAC,SAAS,MAAM,OAAO,WAAW,CAAC,EAAE,KAAG,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC;qBAWhE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI;wBAYjB,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,KAAG,OAAO,CAAC,IAAI,CAAC;gCAUlC,CAAC,IAAI,EAAE,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI;uBAWvD,IAAI;;;;;;;;;;;;EA0CxB;AAED,MAAM,MAAM,SAAS,CACnB,IAAI,GAAG,OAAO,EACd,OAAO,SAAS,gBAAgB,GAAG,gBAAgB,EACnD,OAAO,GAAG,OAAO,EACjB,IAAI,SAAS,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,IACtC,UAAU,CAAC,OAAO,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC"}
@@ -1,28 +1,28 @@
1
1
  import { tap as M, isJsonEqual as n, deepClone as v } from "../lib/util/helpers/dist/index.js";
2
- import { reactive as S, nextTick as h, computed as s, watch as E } from "vue";
2
+ import { reactive as S, nextTick as h, computed as u, watch as E } from "vue";
3
3
  import { createModel as m } from "../createModel.js";
4
4
  import { createAppModel as x } from "./createAppModel.js";
5
5
  import { parseQuery as N } from "../urls.js";
6
6
  import { MultiError as q, unwrapValueOrErrors as T } from "../utils.js";
7
7
  import { useDebounceFn as d } from "../node_modules/.pnpm/@vueuse_shared@13.3.0_vue@3.5.13_typescript@5.6.3_/node_modules/@vueuse/shared/index.js";
8
- function X(i, a, c) {
9
- const g = (e, ...t) => {
10
- c.debug && console.log(`%c>>> %c${e}`, "color: orange; font-weight: bold", "color: orange", ...t);
8
+ function X(i, a, g) {
9
+ const c = (e, ...t) => {
10
+ g.debug && console.log(`%c>>> %c${e}`, "color: orange; font-weight: bold", "color: orange", ...t);
11
11
  }, r = S({
12
12
  args: Object.freeze(i.args),
13
13
  outputs: Object.freeze(i.outputs),
14
14
  ui: Object.freeze(i.ui),
15
15
  navigationState: Object.freeze(i.navigationState)
16
- }), u = c.debounceSpan ?? 200, l = M(c.debounceMaxWait ?? 0, (e) => e < 2e4 ? 2e4 : e < u ? u * 100 : e), b = d((e) => {
16
+ }), s = g.debounceSpan ?? 200, l = M(g.debounceMaxWait ?? 0, (e) => e < 2e4 ? 2e4 : e < s ? s * 100 : e), b = d((e) => {
17
17
  n(e, r.args) || a.setBlockArgs(e);
18
- }, u, { maxWait: l }), j = d((e) => {
18
+ }, s, { maxWait: l }), j = d((e) => {
19
19
  n(e, r.ui) || a.setBlockUiState(e);
20
- }, u, { maxWait: l }), O = d((e, t) => {
20
+ }, s, { maxWait: l }), O = d((e, t) => {
21
21
  (!n(e, r.args) || !n(t, r.ui)) && a.setBlockArgsAndUiState(e, t);
22
- }, u, { maxWait: l });
22
+ }, s, { maxWait: l });
23
23
  a.onStateUpdates(async (e) => {
24
24
  e.forEach((t) => {
25
- t.key === "args" && !n(r.args, t.value) && (r.args = Object.freeze(t.value), g("args patch", r.args)), t.key === "ui" && !n(r.ui, t.value) && (r.ui = Object.freeze(t.value), g("ui patch", r.ui)), t.key === "outputs" && !n(r.outputs, t.value) && (r.outputs = Object.freeze(t.value), g("outputs patch", r.outputs)), t.key === "navigationState" && !n(r.navigationState, t.value) && (r.navigationState = Object.freeze(t.value), g("navigationState patch", r.navigationState));
25
+ t.key === "args" && !n(r.args, t.value) && (r.args = Object.freeze(t.value), c("args patch", r.args)), t.key === "ui" && !n(r.ui, t.value) && (r.ui = Object.freeze(t.value), c("ui patch", r.ui)), t.key === "outputs" && !n(r.outputs, t.value) && (r.outputs = Object.freeze(t.value), c("outputs patch", r.outputs)), t.key === "navigationState" && !n(r.navigationState, t.value) && (r.navigationState = Object.freeze(t.value), c("navigationState patch", r.navigationState));
26
26
  }), await h();
27
27
  });
28
28
  const k = () => v(r.args), A = () => v(r.ui), f = () => v(r.navigationState), w = {
@@ -134,17 +134,17 @@ function X(i, a, c) {
134
134
  const t = f();
135
135
  return t.href = e, a.setNavigationState(t);
136
136
  }
137
- }, U = s(() => {
137
+ }, U = u(() => {
138
138
  const e = Object.entries(r.outputs).map(([t, o]) => [t, o.ok && o.value !== void 0 ? o.value : void 0]);
139
139
  return Object.fromEntries(e);
140
- }), z = s(() => {
140
+ }), z = u(() => {
141
141
  const e = Object.entries(r.outputs).map(([t, o]) => [t, o && !o.ok ? new q(o.errors) : void 0]);
142
142
  return Object.fromEntries(e);
143
143
  }), B = {
144
144
  snapshot: r,
145
- queryParams: s(() => N(r.navigationState.href)),
146
- href: s(() => r.navigationState.href),
147
- hasErrors: s(() => Object.values(r.outputs).some((e) => !(e != null && e.ok)))
145
+ queryParams: u(() => N(r.navigationState.href)),
146
+ href: u(() => r.navigationState.href),
147
+ hasErrors: u(() => Object.values(r.outputs).some((e) => !(e != null && e.ok)))
148
148
  }, y = x(
149
149
  {
150
150
  get() {
@@ -158,12 +158,11 @@ function X(i, a, c) {
158
158
  {
159
159
  outputs: U,
160
160
  outputErrors: z
161
- },
162
- c
161
+ }
163
162
  );
164
163
  return S(Object.assign(y, w, B));
165
164
  }
166
165
  export {
167
- X as createApp
166
+ X as createAppV1
168
167
  };
169
- //# sourceMappingURL=createApp.js.map
168
+ //# sourceMappingURL=createAppV1.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,56 @@
1
+ import { Mutable } from '@milaboratories/helpers';
2
+ import { NavigationState, BlockOutputsBase, BlockState, PlatformaV2, ValueWithUTag, AuthorMarker } from '@platforma-sdk/model';
3
+ import { StateModelOptions, UnwrapOutputs, OutputValues, OutputErrors, AppSettings } from '../types';
4
+ export declare const patchPoolingDelay = 100;
5
+ export declare const createNextAuthorMarker: (marker: AuthorMarker | undefined) => AuthorMarker;
6
+ /**
7
+ * Creates an application instance with reactive state management, outputs, and methods for state updates and navigation.
8
+ *
9
+ * @template Args - The type of arguments used in the application.
10
+ * @template Outputs - The type of block outputs extending `BlockOutputsBase`.
11
+ * @template UiState - The type of the UI state.
12
+ * @template Href - The type of navigation href, defaulting to a string starting with `/`.
13
+ *
14
+ * @param state - Initial state of the application, including args, outputs, UI state, and navigation state.
15
+ * @param platforma - A platform interface for interacting with block states.
16
+ * @param settings - Application settings, such as debug flags.
17
+ *
18
+ * @returns A reactive application object with methods, getters, and state.
19
+ */
20
+ export declare function createAppV2<Args = unknown, Outputs extends BlockOutputsBase = BlockOutputsBase, UiState = unknown, Href extends `/${string}` = `/${string}`>(state: ValueWithUTag<BlockState<Args, Outputs, UiState, Href>>, platforma: PlatformaV2<Args, Outputs, UiState, Href>, settings: AppSettings): {
21
+ model: {
22
+ args: import('vue').UnwrapRef<Args>;
23
+ ui: import('vue').UnwrapRef<UiState>;
24
+ outputs: import('vue').UnwrapRef<OutputValues<Outputs>>;
25
+ outputErrors: import('vue').UnwrapRef<OutputErrors<Outputs>>;
26
+ };
27
+ readonly valid: boolean;
28
+ readonly isChanged: boolean;
29
+ readonly error: Error | undefined;
30
+ readonly errorString: string | undefined;
31
+ readonly save: () => void;
32
+ readonly revert: () => void;
33
+ readonly setError: (cause: unknown) => void;
34
+ cloneArgs: () => Args;
35
+ cloneUiState: () => UiState;
36
+ cloneNavigationState: () => Mutable<NavigationState<Href>>;
37
+ createArgsModel: <T extends Args = Args>(options?: StateModelOptions<Args, T>) => import('..').Model<T>;
38
+ createUiModel: <T extends UiState = UiState>(options: StateModelOptions<UiState, T> | undefined, defaultUiState: () => UiState) => import('..').Model<T>;
39
+ unwrapOutputs: <K extends keyof Outputs>(...keys: K[]) => UnwrapOutputs<Outputs, K>;
40
+ updateArgs: (cb: (args: Args) => void) => Promise<boolean>;
41
+ updateUiState: (cb: (args: UiState) => UiState) => Promise<boolean>;
42
+ navigateTo: (href: Href) => Promise<boolean>;
43
+ allSettled: () => Promise<void>;
44
+ closedRef: boolean;
45
+ snapshot: {
46
+ args: Args;
47
+ outputs: Partial<Outputs>;
48
+ ui: UiState;
49
+ navigationState: NavigationState<Href>;
50
+ };
51
+ queryParams: import('..').ParseQuery<Href>;
52
+ href: Href;
53
+ hasErrors: boolean;
54
+ };
55
+ export type BaseAppV2<Args = unknown, Outputs extends BlockOutputsBase = BlockOutputsBase, UiState = unknown, Href extends `/${string}` = `/${string}`> = ReturnType<typeof createAppV2<Args, Outputs, UiState, Href>>;
56
+ //# sourceMappingURL=createAppV2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createAppV2.d.ts","sourceRoot":"","sources":["../../src/internal/createAppV2.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIpI,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAQ1G,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,eAAO,MAAM,sBAAsB,WAAY,YAAY,GAAG,SAAS,KAAG,YAGxE,CAAC;AAEH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CACzB,IAAI,GAAG,OAAO,EACd,OAAO,SAAS,gBAAgB,GAAG,gBAAgB,EACnD,OAAO,GAAG,OAAO,EACjB,IAAI,SAAS,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,EAExC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAC9D,SAAS,EAAE,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EACpD,QAAQ,EAAE,WAAW;;;;;;;;;;;;;;qBAsJqC,IAAI;wBACH,OAAO;gCACc,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;sBAM5F,CAAC,SAAS,IAAI,mBAAkB,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC;oBAmB5D,CAAC,SAAS,OAAO,qBAAqB,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC,8BAAuB,MAAM,OAAO;oBAwBvG,CAAC,SAAS,MAAM,OAAO,WAAW,CAAC,EAAE,KAAG,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC;qBAWhE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,KAAG,OAAO,CAAC,OAAO,CAAC;wBAcpC,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,KAAG,OAAO,CAAC,OAAO,CAAC;uBAY9C,IAAI;;;;cA5Lf,IAAI;iBACD,OAAO,CAAC,OAAO,CAAC;YACrB,OAAO;yBACM,eAAe,CAAC,IAAI,CAAC;;;;;EA6MzC;AAED,MAAM,MAAM,SAAS,CACnB,IAAI,GAAG,OAAO,EACd,OAAO,SAAS,gBAAgB,GAAG,gBAAgB,EACnD,OAAO,GAAG,OAAO,EACjB,IAAI,SAAS,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,IACtC,UAAU,CAAC,OAAO,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC"}
@@ -0,0 +1,158 @@
1
+ import { uniqueId as B, deepClone as w, delay as $ } from "../lib/util/helpers/dist/index.js";
2
+ import "../sdk/model/dist/index.js";
3
+ import { ref as A, computed as h, reactive as z } from "vue";
4
+ import { createModel as N } from "../createModel.js";
5
+ import { createAppModel as D } from "./createAppModel.js";
6
+ import { parseQuery as L } from "../urls.js";
7
+ import { MultiError as F, unwrapValueOrErrors as G } from "../utils.js";
8
+ import "../node_modules/.pnpm/fast-json-patch@3.1.1/node_modules/fast-json-patch/index.js";
9
+ import { UpdateSerializer as v } from "./UpdateSerializer.js";
10
+ import { unwrapResult as s, hasAbortError as H } from "../lib/model/common/dist/index.js";
11
+ import { applyPatch as O } from "../node_modules/.pnpm/fast-json-patch@3.1.1/node_modules/fast-json-patch/module/core.js";
12
+ const P = 100, K = (n) => ({
13
+ authorId: (n == null ? void 0 : n.authorId) ?? B(),
14
+ localVersion: ((n == null ? void 0 : n.localVersion) ?? 0) + 1
15
+ });
16
+ function ue(n, c, d) {
17
+ const r = (e, ...t) => {
18
+ d.debug && console.log(`%c>>> %c${e}`, "color: orange; font-weight: bold", "color: orange", d.appId, ...t);
19
+ }, b = (e, ...t) => {
20
+ console.error(`%c>>> %c${e}`, "color: red; font-weight: bold", "color: red", d.appId, ...t);
21
+ }, u = {
22
+ isExternalSnapshot: !1,
23
+ author: {
24
+ authorId: B(),
25
+ localVersion: 0
26
+ }
27
+ }, S = () => (u.author = K(u.author), r("nextAuthorMarker", u.author), u.author), p = A(!1), f = A(n.uTag), g = d.debounceSpan ?? 200, y = new v({ debounceSpan: g }), U = new v({ debounceSpan: g }), M = new v({ debounceSpan: g }), Q = new v({ debounceSpan: g }), o = A(n.value), T = async (e) => c.setBlockArgs(e, S()), x = async (e) => c.setBlockUiState(e, S()), V = async (e, t) => c.setBlockArgsAndUiState(e, t, S()), R = async (e) => c.setNavigationState(e);
28
+ (async () => {
29
+ var e, t;
30
+ for (window.addEventListener("beforeunload", () => {
31
+ p.value = !0, c.dispose().then(s).catch((a) => {
32
+ b("error in dispose", a);
33
+ });
34
+ }); !p.value; )
35
+ try {
36
+ const a = await c.getPatches(f.value).then(s);
37
+ if (r("patches", JSON.stringify(a, null, 2)), r("uTagRef.value", f.value), r("patches.uTag", a.uTag), r("patches.author", a.author), r("data.author", u.author), f.value = a.uTag, a.value.length === 0) {
38
+ await new Promise((m) => setTimeout(m, P));
39
+ continue;
40
+ }
41
+ const l = ((e = u.author) == null ? void 0 : e.authorId) !== ((t = a.author) == null ? void 0 : t.authorId);
42
+ l || u.isExternalSnapshot ? (r("got external changes, applying them to the snapshot", JSON.stringify(o.value, null, 2)), o.value = O(o.value, a.value, !1, !1).newDocument, u.isExternalSnapshot = l) : o.value = O(o.value, a.value).newDocument, await new Promise((m) => setTimeout(m, P));
43
+ } catch (a) {
44
+ H(a) ? (r("patches loop aborted"), p.value = !0) : (b("error in patches loop", a), await new Promise((l) => setTimeout(l, 1e3)));
45
+ }
46
+ })();
47
+ const k = h(() => {
48
+ const e = Object.entries(o.value.outputs).map(([t, a]) => [t, a.ok && a.value !== void 0 ? a.value : void 0]);
49
+ return Object.fromEntries(e);
50
+ }), q = h(() => {
51
+ const e = Object.entries(o.value.outputs).map(([t, a]) => [t, a && !a.ok ? new F(a.errors) : void 0]);
52
+ return Object.fromEntries(e);
53
+ }), i = D(
54
+ {
55
+ get() {
56
+ return { args: o.value.args, ui: o.value.ui };
57
+ },
58
+ autoSave: !0,
59
+ onSave(e) {
60
+ r("onSave", e), M.run(() => V(e.args, e.ui).then(s));
61
+ }
62
+ },
63
+ {
64
+ outputs: k,
65
+ outputErrors: q
66
+ }
67
+ ), E = () => w(i.model.args), I = () => w(i.model.ui), j = () => w(o.value.navigationState), C = {
68
+ cloneArgs: E,
69
+ cloneUiState: I,
70
+ cloneNavigationState: j,
71
+ createArgsModel(e = {}) {
72
+ return N({
73
+ get() {
74
+ return e.transform ? e.transform(o.value.args) : o.value.args;
75
+ },
76
+ validate: e.validate,
77
+ autoSave: !0,
78
+ onSave(t) {
79
+ y.run(() => T(t).then(s));
80
+ }
81
+ });
82
+ },
83
+ /**
84
+ * defaultUiState is temporarily here, remove it after implementing initialUiState
85
+ */
86
+ createUiModel(e = {}, t) {
87
+ return N({
88
+ get() {
89
+ return e.transform ? e.transform(o.value.ui) : o.value.ui ?? t();
90
+ },
91
+ validate: e.validate,
92
+ autoSave: !0,
93
+ onSave(a) {
94
+ U.run(() => x(a).then(s));
95
+ }
96
+ });
97
+ },
98
+ /**
99
+ * Retrieves the unwrapped values of outputs for the given keys.
100
+ *
101
+ * @template K - Keys of the outputs to unwrap.
102
+ * @param keys - List of output names.
103
+ * @throws Error if the outputs contain errors.
104
+ * @returns An object with unwrapped output values.
105
+ */
106
+ unwrapOutputs(...e) {
107
+ const t = o.value.outputs, a = e.map((l) => [l, G(t[l])]);
108
+ return Object.fromEntries(a);
109
+ },
110
+ /**
111
+ * Updates the arguments state by applying a callback.
112
+ *
113
+ * @param cb - Callback to modify the current arguments.
114
+ * @returns A promise resolving after the update is applied.
115
+ */
116
+ updateArgs(e) {
117
+ const t = E();
118
+ return e(t), r("updateArgs", t), i.model.args = t, y.run(() => T(t).then(s));
119
+ },
120
+ /**
121
+ * Updates the UI state by applying a callback.
122
+ *
123
+ * @param cb - Callback to modify the current UI state.
124
+ * @returns A promise resolving after the update is applied.
125
+ * @todo Make it mutable since there is already an initial one
126
+ */
127
+ updateUiState(e) {
128
+ const t = e(I());
129
+ return r("updateUiState", t), i.model.ui = t, U.run(() => x(t).then(s));
130
+ },
131
+ /**
132
+ * Navigates to a specific href by updating the navigation state.
133
+ *
134
+ * @param href - The target href to navigate to.
135
+ * @returns A promise resolving after the navigation state is updated.
136
+ */
137
+ navigateTo(e) {
138
+ const t = j();
139
+ return t.href = e, Q.run(() => R(t).then(s));
140
+ },
141
+ async allSettled() {
142
+ return await $(0), M.allSettled();
143
+ }
144
+ }, J = {
145
+ closedRef: p,
146
+ snapshot: o,
147
+ queryParams: h(() => L(o.value.navigationState.href)),
148
+ href: h(() => o.value.navigationState.href),
149
+ hasErrors: h(() => Object.values(o.value.outputs).some((e) => !(e != null && e.ok)))
150
+ };
151
+ return z(Object.assign(i, C, J));
152
+ }
153
+ export {
154
+ ue as createAppV2,
155
+ K as createNextAuthorMarker,
156
+ P as patchPoolingDelay
157
+ };
158
+ //# sourceMappingURL=createAppV2.js.map
@@ -0,0 +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 { createAppModel } from './createAppModel';\nimport { parseQuery } from '../urls';\nimport { MultiError, unwrapValueOrErrors } from '../utils';\nimport { applyPatch } from 'fast-json-patch';\nimport { UpdateSerializer } from './UpdateSerializer';\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\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 type AppModel = {\n args: Args;\n ui: UiState;\n };\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', settings.appId, ...rest);\n }\n };\n\n const error = (msg: string, ...rest: unknown[]) => {\n console.error(`%c>>> %c${msg}`, 'color: red; font-weight: bold', 'color: red', settings.appId, ...rest);\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 (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', JSON.stringify(patches, null, 2));\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', JSON.stringify(snapshot.value, null, 2));\n snapshot.value = applyPatch(snapshot.value, patches.value, false, false).newDocument;\n data.isExternalSnapshot = isAuthorChanged;\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 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 = createAppModel(\n {\n get() {\n return { args: snapshot.value.args, ui: snapshot.value.ui } as AppModel;\n },\n autoSave: true,\n onSave(newData: AppModel) {\n debug('onSave', newData);\n setArgsAndUiStateQueue.run(() => setBlockArgsAndUiState(newData.args, newData.ui).then(unwrapResult));\n },\n },\n {\n outputs,\n outputErrors,\n },\n settings,\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","createAppV2","state","platforma","settings","debug","msg","rest","error","data","nextAuthorMarker","closedRef","ref","uTagRef","debounceSpan","setArgsQueue","UpdateSerializer","setUiStateQueue","setArgsAndUiStateQueue","setNavigationStateQueue","snapshot","setBlockArgs","args","setBlockUiState","ui","setBlockArgsAndUiState","setNavigationState","unwrapResult","err","patches","resolve","isAuthorChanged","_a","_b","applyPatch","hasAbortError","outputs","computed","entries","k","vOrErr","outputErrors","MultiError","appModel","createAppModel","newData","cloneArgs","deepClone","cloneUiState","cloneNavigationState","methods","options","createModel","newArgs","defaultUiState","keys","key","unwrapValueOrErrors","cb","newUiState","href","newState","delay","getters","parseQuery","v","reactive"],"mappings":";;;;;;;;;;;AAcO,MAAMA,IAAoB,KAEpBC,IAAyB,CAACC,OAAoD;AAAA,EACzF,WAAUA,KAAA,gBAAAA,EAAQ,aAAYC,EAAS;AAAA,EACvC,gBAAeD,KAAA,gBAAAA,EAAQ,iBAAgB,KAAK;AAC9C;AAgBgB,SAAAE,GAMdC,GACAC,GACAC,GACA;AAMM,QAAAC,IAAQ,CAACC,MAAgBC,MAAoB;AACjD,IAAIH,EAAS,SACH,QAAA,IAAI,WAAWE,CAAG,IAAI,oCAAoC,iBAAiBF,EAAS,OAAO,GAAGG,CAAI;AAAA,EAE9G,GAEMC,IAAQ,CAACF,MAAgBC,MAAoB;AACzC,YAAA,MAAM,WAAWD,CAAG,IAAI,iCAAiC,cAAcF,EAAS,OAAO,GAAGG,CAAI;AAAA,EACxG,GAEME,IAAO;AAAA,IACX,oBAAoB;AAAA,IACpB,QAAQ;AAAA,MACN,UAAUT,EAAS;AAAA,MACnB,cAAc;AAAA,IAAA;AAAA,EAElB,GAEMU,IAAmB,OAClBD,EAAA,SAASX,EAAuBW,EAAK,MAAM,GAC1CJ,EAAA,oBAAoBI,EAAK,MAAM,GAC9BA,EAAK,SAGRE,IAAYC,EAAI,EAAK,GAErBC,IAAUD,EAAIV,EAAM,IAAI,GAExBY,IAAeV,EAAS,gBAAgB,KAExCW,IAAe,IAAIC,EAAiB,EAAE,cAAAF,GAAc,GACpDG,IAAkB,IAAID,EAAiB,EAAE,cAAAF,GAAc,GACvDI,IAAyB,IAAIF,EAAiB,EAAE,cAAAF,GAAc,GAC9DK,IAA0B,IAAIH,EAAiB,EAAE,cAAAF,GAAc,GAI/DM,IAAWR,EAKdV,EAAM,KAAK,GAORmB,IAAe,OAAOC,MACnBnB,EAAU,aAAamB,GAAMZ,EAAA,CAAkB,GAGlDa,IAAkB,OAAOC,MACtBrB,EAAU,gBAAgBqB,GAAId,EAAA,CAAkB,GAGnDe,IAAyB,OAAOH,GAAYE,MACzCrB,EAAU,uBAAuBmB,GAAME,GAAId,GAAkB,GAGhEgB,IAAqB,OAAOxB,MACzBC,EAAU,mBAAmBD,CAAK;AAG3C,GAAC,YAAY;;AAQJ,SAPA,OAAA,iBAAiB,gBAAgB,MAAM;AAC5C,MAAAS,EAAU,QAAQ,IAClBR,EAAU,UAAU,KAAKwB,CAAY,EAAE,MAAM,CAACC,MAAQ;AACpD,QAAApB,EAAM,oBAAoBoB,CAAG;AAAA,MAAA,CAC9B;AAAA,IAAA,CACF,GAEM,CAACjB,EAAU;AACZ,UAAA;AACI,cAAAkB,IAAU,MAAM1B,EAAU,WAAWU,EAAQ,KAAK,EAAE,KAAKc,CAAY;AAUvE,YARJtB,EAAM,WAAW,KAAK,UAAUwB,GAAS,MAAM,CAAC,CAAC,GAC3CxB,EAAA,iBAAiBQ,EAAQ,KAAK,GAC9BR,EAAA,gBAAgBwB,EAAQ,IAAI,GAC5BxB,EAAA,kBAAkBwB,EAAQ,MAAM,GAChCxB,EAAA,eAAeI,EAAK,MAAM,GAEhCI,EAAQ,QAAQgB,EAAQ,MAEpBA,EAAQ,MAAM,WAAW,GAAG;AAC9B,gBAAM,IAAI,QAAQ,CAACC,MAAY,WAAWA,GAASjC,CAAiB,CAAC;AACrE;AAAA,QAAA;AAGF,cAAMkC,MAAkBC,IAAAvB,EAAK,WAAL,gBAAAuB,EAAa,gBAAaC,IAAAJ,EAAQ,WAAR,gBAAAI,EAAgB;AAG9D,QAAAF,KAAmBtB,EAAK,sBAC1BJ,EAAM,uDAAuD,KAAK,UAAUe,EAAS,OAAO,MAAM,CAAC,CAAC,GAC3FA,EAAA,QAAQc,EAAWd,EAAS,OAAOS,EAAQ,OAAO,IAAO,EAAK,EAAE,aACzEpB,EAAK,qBAAqBsB,KAG1BX,EAAS,QAAQc,EAAWd,EAAS,OAAOS,EAAQ,KAAK,EAAE,aAG7D,MAAM,IAAI,QAAQ,CAACC,MAAY,WAAWA,GAASjC,CAAiB,CAAC;AAAA,eAC9D+B,GAAK;AACR,QAAAO,EAAcP,CAAG,KACnBvB,EAAM,sBAAsB,GAC5BM,EAAU,QAAQ,OAElBH,EAAM,yBAAyBoB,CAAG,GAClC,MAAM,IAAI,QAAQ,CAACE,MAAY,WAAWA,GAAS,GAAI,CAAC;AAAA,MAC1D;AAAA,EAEJ,GACC;AAEG,QAAAM,IAAUC,EAAgC,MAAM;AAC9C,UAAAC,IAAU,OAAO,QAAQlB,EAAS,MAAM,OAAqC,EAAE,IAAI,CAAC,CAACmB,GAAGC,CAAM,MAAM,CAACD,GAAGC,EAAO,MAAMA,EAAO,UAAU,SAAYA,EAAO,QAAQ,MAAS,CAAC;AAC1K,WAAA,OAAO,YAAYF,CAAO;AAAA,EAAA,CAClC,GAEKG,IAAeJ,EAAgC,MAAM;AACnD,UAAAC,IAAU,OAAO,QAAQlB,EAAS,MAAM,OAAqC,EAAE,IAAI,CAAC,CAACmB,GAAGC,CAAM,MAAM,CAACD,GAAGC,KAAU,CAACA,EAAO,KAAK,IAAIE,EAAWF,EAAO,MAAM,IAAI,MAAS,CAAC;AACxK,WAAA,OAAO,YAAYF,CAAO;AAAA,EAAA,CAClC,GAEKK,IAAWC;AAAA,IACf;AAAA,MACE,MAAM;AACG,eAAA,EAAE,MAAMxB,EAAS,MAAM,MAAM,IAAIA,EAAS,MAAM,GAAG;AAAA,MAC5D;AAAA,MACA,UAAU;AAAA,MACV,OAAOyB,GAAmB;AACxB,QAAAxC,EAAM,UAAUwC,CAAO,GACA3B,EAAA,IAAI,MAAMO,EAAuBoB,EAAQ,MAAMA,EAAQ,EAAE,EAAE,KAAKlB,CAAY,CAAC;AAAA,MAAA;AAAA,IAExG;AAAA,IACA;AAAA,MACE,SAAAS;AAAA,MACA,cAAAK;AAAA,IAAA;AAAA,EAGJ,GAEMK,IAAY,MAAMC,EAAUJ,EAAS,MAAM,IAAI,GAC/CK,IAAe,MAAMD,EAAUJ,EAAS,MAAM,EAAE,GAChDM,IAAuB,MAAMF,EAAU3B,EAAS,MAAM,eAAe,GAErE8B,IAAU;AAAA,IACd,WAAAJ;AAAA,IACA,cAAAE;AAAA,IACA,sBAAAC;AAAA,IACA,gBAAuCE,IAAsC,IAAI;AAC/E,aAAOC,EAAqB;AAAA,QAC1B,MAAM;AACJ,iBAAID,EAAQ,YACHA,EAAQ,UAAU/B,EAAS,MAAM,IAAY,IAG/CA,EAAS,MAAM;AAAA,QACxB;AAAA,QACA,UAAU+B,EAAQ;AAAA,QAClB,UAAU;AAAA,QACV,OAAOE,GAAS;AACd,UAAAtC,EAAa,IAAI,MAAMM,EAAagC,CAAO,EAAE,KAAK1B,CAAY,CAAC;AAAA,QAAA;AAAA,MACjE,CACD;AAAA,IACH;AAAA;AAAA;AAAA;AAAA,IAIA,cAA2CwB,IAAyC,CAAC,GAAGG,GAA+B;AACrH,aAAOF,EAAwB;AAAA,QAC7B,MAAM;AACJ,iBAAID,EAAQ,YACHA,EAAQ,UAAU/B,EAAS,MAAM,EAAa,IAG/CA,EAAS,MAAM,MAAMkC,EAAe;AAAA,QAC9C;AAAA,QACA,UAAUH,EAAQ;AAAA,QAClB,UAAU;AAAA,QACV,OAAON,GAAS;AACd,UAAA5B,EAAgB,IAAI,MAAMM,EAAgBsB,CAAO,EAAE,KAAKlB,CAAY,CAAC;AAAA,QAAA;AAAA,MACvE,CACD;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,iBAA0C4B,GAAsC;AACxEnB,YAAAA,IAAUhB,EAAS,MAAM,SACzBkB,IAAUiB,EAAK,IAAI,CAACC,MAAQ,CAACA,GAAKC,EAAoBrB,EAAQoB,CAAG,CAAC,CAAC,CAAC;AACnE,aAAA,OAAO,YAAYlB,CAAO;AAAA,IACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,WAAWoB,GAA4C;AACrD,YAAML,IAAUP,EAAU;AAC1B,aAAAY,EAAGL,CAAO,GACVhD,EAAM,cAAcgD,CAAO,GAC3BV,EAAS,MAAM,OAAOU,GACftC,EAAa,IAAI,MAAMM,EAAagC,CAAO,EAAE,KAAK1B,CAAY,CAAC;AAAA,IACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,cAAc+B,GAAkD;AACxD,YAAAC,IAAaD,EAAGV,GAAc;AACpC,aAAA3C,EAAM,iBAAiBsD,CAAU,GACjChB,EAAS,MAAM,KAAKgB,GACb1C,EAAgB,IAAI,MAAMM,EAAgBoC,CAAU,EAAE,KAAKhC,CAAY,CAAC;AAAA,IACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,WAAWiC,GAAY;AACrB,YAAMC,IAAWZ,EAAqB;AACtC,aAAAY,EAAS,OAAOD,GACTzC,EAAwB,IAAI,MAAMO,EAAmBmC,CAAQ,EAAE,KAAKlC,CAAY,CAAC;AAAA,IAC1F;AAAA,IACA,MAAM,aAAa;AACjB,mBAAMmC,EAAM,CAAC,GACN5C,EAAuB,WAAW;AAAA,IAAA;AAAA,EAE7C,GAEM6C,IAAU;AAAA,IACd,WAAApD;AAAA,IACA,UAAAS;AAAA,IACA,aAAaiB,EAAS,MAAM2B,EAAiB5C,EAAS,MAAM,gBAAgB,IAAY,CAAC;AAAA,IACzF,MAAMiB,EAAS,MAAMjB,EAAS,MAAM,gBAAgB,IAAI;AAAA,IACxD,WAAWiB,EAAS,MAAM,OAAO,OAAOjB,EAAS,MAAM,OAAqC,EAAE,KAAK,CAAC6C,MAAM,EAACA,KAAA,QAAAA,EAAG,GAAE,CAAC;AAAA,EACnH;AAEA,SAAOC,EAAS,OAAO,OAAOvB,GAAUO,GAASa,CAAO,CAAC;AAC3D;"}
@@ -0,0 +1,28 @@
1
+ import { BlockOutputsBase, BlockState, NavigationState, AuthorMarker, ValueWithUTagAndAuthor, ResultOrError, BlockApiV2, ValueWithUTag } from '@platforma-sdk/model';
2
+ import { Operation } from 'fast-json-patch';
3
+ export declare class BlockStateMock<Args = unknown, Outputs extends BlockOutputsBase = BlockOutputsBase, UiState = unknown, Href extends `/${string}` = `/${string}`> {
4
+ args: Args;
5
+ outputs: Outputs;
6
+ ui: UiState;
7
+ href: Href;
8
+ author: AuthorMarker;
9
+ uTag: string;
10
+ constructor(args: Args, outputs: Outputs, ui: UiState, href: Href, author?: AuthorMarker, uTag?: string);
11
+ setState(_state: Partial<BlockStateMock<Args, Outputs, UiState, Href>>): void;
12
+ }
13
+ export declare abstract class BlockMock<Args = unknown, Outputs extends BlockOutputsBase = BlockOutputsBase, UiState = unknown, Href extends `/${string}` = `/${string}`> implements BlockApiV2<Args, Outputs, UiState, Href> {
14
+ #private;
15
+ state: BlockStateMock<Args, Outputs, UiState, Href>;
16
+ constructor(state: BlockStateMock<Args, Outputs, UiState, Href>);
17
+ get uTag(): string;
18
+ setBlockArgs(args: Args, author?: AuthorMarker): Promise<ResultOrError<void, Error>>;
19
+ setBlockUiState(ui: UiState, author?: AuthorMarker): Promise<ResultOrError<void, Error>>;
20
+ setBlockArgsAndUiState(args: Args, ui: UiState, author?: AuthorMarker): Promise<ResultOrError<void, Error>>;
21
+ setNavigationState(navigationState: NavigationState<Href>): Promise<ResultOrError<void, Error>>;
22
+ loadBlockState(): Promise<ResultOrError<ValueWithUTag<BlockState<Args, Outputs, UiState, Href>>>>;
23
+ getPatches(uTag: string): Promise<ResultOrError<ValueWithUTagAndAuthor<Operation[]>>>;
24
+ private doUpdate;
25
+ abstract process(): Promise<void>;
26
+ }
27
+ export type InferState<B> = B extends BlockMock<infer S> ? S : never;
28
+ //# sourceMappingURL=BlockMock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockMock.d.ts","sourceRoot":"","sources":["../../../src/internal/test-helpers/BlockMock.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,sBAAsB,EAE3B,KAAK,aAAa,EAEnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAW,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEtE,qBAAa,cAAc,CACzB,IAAI,GAAG,OAAO,EACd,OAAO,SAAS,gBAAgB,GAAG,gBAAgB,EACnD,OAAO,GAAG,OAAO,EACjB,IAAI,SAAS,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE;IAG/B,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,OAAO;IAChB,EAAE,EAAE,OAAO;IACX,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,YAAY;IACpB,IAAI,EAAE,MAAM;gBALZ,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,IAAI,EACV,MAAM,GAAE,YAAoD,EAC5D,IAAI,GAAE,MAAmB;IAGlC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;CAUvE;AAED,8BAAsB,SAAS,CAC7B,IAAI,GAAG,OAAO,EACd,OAAO,SAAS,gBAAgB,GAAG,gBAAgB,EACnD,OAAO,GAAG,OAAO,EACjB,IAAI,SAAS,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,CACxC,YAAW,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;;IAO1C,KAAK,EAAE,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;gBAAnD,KAAK,EAAE,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;IAO5D,IAAI,IAAI,IAAI,MAAM,CAEjB;IAEK,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,YAAY;IAO9C,eAAe,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,YAAY;IAOlD,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,YAAY;IAYrE,kBAAkB,CAAC,eAAe,EAAE,eAAe,CAAC,IAAI,CAAC;IAOzD,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAiBjG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,sBAAsB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAsB7E,QAAQ;IAItB,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAClC;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { PlatformaV2, BlockOutputsBase } from '@platforma-sdk/model';
2
+ import { BlockMock } from './BlockMock';
3
+ export declare function createMockApi<Args, Outputs extends BlockOutputsBase, UiState = unknown, Href extends `/${string}` = `/${string}`>(block: BlockMock<Args, Outputs, UiState, Href>): PlatformaV2<Args, Outputs, UiState, Href>;
4
+ //# sourceMappingURL=createMockApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createMockApi.d.ts","sourceRoot":"","sources":["../../../src/internal/test-helpers/createMockApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,WAAW,EACX,gBAAgB,EAYjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAK7C,wBAAgB,aAAa,CAC3B,IAAI,EACJ,OAAO,SAAS,gBAAgB,EAChC,OAAO,GAAG,OAAO,EACjB,IAAI,SAAS,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,EACxC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CA+D3F"}
@@ -0,0 +1,4 @@
1
+ import { ListFilesResult } from '@platforma-sdk/model';
2
+ export declare const capitalizeFirstLetter: (str: string) => string;
3
+ export declare const getLsFilesResult: (path: string) => ListFilesResult;
4
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/internal/test-helpers/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAA0B,eAAe,EAAW,MAAM,sBAAsB,CAAC;AAE7F,eAAO,MAAM,qBAAqB,QAAS,MAAM,WAEhD,CAAC;AAIF,eAAO,MAAM,gBAAgB,SAAU,MAAM,KAAG,eAsD/C,CAAC"}