@platforma-sdk/ui-vue 1.64.0 → 1.65.3

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 (63) hide show
  1. package/.turbo/turbo-build.log +25 -25
  2. package/.turbo/turbo-formatter$colon$check.log +2 -2
  3. package/.turbo/turbo-linter$colon$check.log +2 -2
  4. package/.turbo/turbo-types$colon$check.log +1 -1
  5. package/CHANGELOG.md +19 -0
  6. package/dist/components/PlAdvancedFilter/FilterEditor.js.map +1 -1
  7. package/dist/components/PlAdvancedFilter/FilterEditor.style.js.map +1 -1
  8. package/dist/components/PlAdvancedFilter/FilterEditor.vue.d.ts +3 -8
  9. package/dist/components/PlAdvancedFilter/FilterEditor.vue.d.ts.map +1 -1
  10. package/dist/components/PlAdvancedFilter/FilterEditor.vue2.js +164 -151
  11. package/dist/components/PlAdvancedFilter/FilterEditor.vue2.js.map +1 -1
  12. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.js.map +1 -1
  13. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.style.js +8 -7
  14. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.style.js.map +1 -1
  15. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue.css +1 -1
  16. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue.d.ts +24 -8
  17. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue.d.ts.map +1 -1
  18. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue2.js +176 -110
  19. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue2.js.map +1 -1
  20. package/dist/components/PlAdvancedFilter/types.d.ts +2 -0
  21. package/dist/components/PlAdvancedFilter/types.d.ts.map +1 -1
  22. package/dist/components/PlAgDataTable/PlAgDataTableV2.js.map +1 -1
  23. package/dist/components/PlAgDataTable/PlAgDataTableV2.style.js.map +1 -1
  24. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue.d.ts.map +1 -1
  25. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js +116 -109
  26. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js.map +1 -1
  27. package/dist/components/PlAgDataTable/sources/table-source-v2.d.ts +6 -5
  28. package/dist/components/PlAgDataTable/sources/table-source-v2.d.ts.map +1 -1
  29. package/dist/components/PlAgDataTable/sources/table-source-v2.js +26 -26
  30. package/dist/components/PlAgDataTable/sources/table-source-v2.js.map +1 -1
  31. package/dist/components/PlAgDataTable/sources/table-state-v2.d.ts +6 -3
  32. package/dist/components/PlAgDataTable/sources/table-state-v2.d.ts.map +1 -1
  33. package/dist/components/PlAgDataTable/sources/table-state-v2.js +182 -97
  34. package/dist/components/PlAgDataTable/sources/table-state-v2.js.map +1 -1
  35. package/dist/components/PlAnnotations/components/FilterSidebar.js.map +1 -1
  36. package/dist/components/PlAnnotations/components/FilterSidebar.style.js.map +1 -1
  37. package/dist/components/PlAnnotations/components/FilterSidebar.vue.d.ts.map +1 -1
  38. package/dist/components/PlAnnotations/components/FilterSidebar.vue2.js +7 -4
  39. package/dist/components/PlAnnotations/components/FilterSidebar.vue2.js.map +1 -1
  40. package/dist/components/PlTableFilters/PlTableFiltersV2.js.map +1 -1
  41. package/dist/components/PlTableFilters/PlTableFiltersV2.style.js +5 -1
  42. package/dist/components/PlTableFilters/PlTableFiltersV2.style.js.map +1 -1
  43. package/dist/components/PlTableFilters/PlTableFiltersV2.vue.css +1 -1
  44. package/dist/components/PlTableFilters/PlTableFiltersV2.vue.d.ts +7 -9
  45. package/dist/components/PlTableFilters/PlTableFiltersV2.vue.d.ts.map +1 -1
  46. package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js +73 -42
  47. package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js.map +1 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +2 -0
  50. package/dist/index.js.map +1 -1
  51. package/dist/lib/util/helpers/dist/functions.js.map +1 -1
  52. package/dist/lib/util/helpers/dist/objects.js +4 -1
  53. package/dist/lib/util/helpers/dist/objects.js.map +1 -1
  54. package/package.json +7 -6
  55. package/src/components/PlAdvancedFilter/FilterEditor.vue +99 -55
  56. package/src/components/PlAdvancedFilter/PlAdvancedFilter.vue +163 -95
  57. package/src/components/PlAdvancedFilter/types.ts +6 -1
  58. package/src/components/PlAgDataTable/PlAgDataTableV2.vue +24 -6
  59. package/src/components/PlAgDataTable/sources/table-source-v2.ts +11 -9
  60. package/src/components/PlAgDataTable/sources/table-state-v2.ts +249 -64
  61. package/src/components/PlAnnotations/components/FilterSidebar.vue +3 -2
  62. package/src/components/PlTableFilters/PlTableFiltersV2.vue +75 -21
  63. package/src/index.ts +4 -0
@@ -1 +1 @@
1
- ._root_pwh6f_2{flex-direction:column;gap:12px;display:flex}
1
+ ._root_1da3c_2{flex-direction:column;gap:12px;display:flex}._defaultGroupTitle_1da3c_7{align-items:center;gap:4px;display:flex}._restartBtn_1da3c_12{--button-width:24px;--btn-min-width:24px;--button-height:24px;--btn-min-height:24x;width:24px;height:24px;padding:4px}
@@ -1,16 +1,14 @@
1
1
  import { PTableColumnSpec, PlDataTableFiltersWithMeta, PFrameHandle } from '@platforma-sdk/model';
2
2
  import { Nil } from '@milaboratories/helpers';
3
3
  type __VLS_Props = {
4
- pframeHandle: Nil | PFrameHandle;
5
4
  columns: PTableColumnSpec[];
5
+ pframeHandle: Nil | PFrameHandle;
6
+ filters: PlDataTableFiltersWithMeta;
7
+ defaultFilters: Nil | PlDataTableFiltersWithMeta;
8
+ onUpdateFilters: (value: PlDataTableFiltersWithMeta) => void;
9
+ onResetDefaultFilters?: () => void;
10
+ onUpdateDefaultFilters?: (value: PlDataTableFiltersWithMeta) => void;
6
11
  };
7
- type __VLS_PublicProps = {
8
- modelValue: PlDataTableFiltersWithMeta;
9
- } & __VLS_Props;
10
- declare const _default: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
11
- "update:modelValue": (value: PlDataTableFiltersWithMeta) => any;
12
- }, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
13
- "onUpdate:modelValue"?: ((value: PlDataTableFiltersWithMeta) => any) | undefined;
14
- }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
12
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
15
13
  export default _default;
16
14
  //# sourceMappingURL=PlTableFiltersV2.vue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlTableFiltersV2.vue.d.ts","sourceRoot":"","sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"names":[],"mappings":"AAoJA,OAAO,KAAK,EACV,gBAAgB,EAChB,0BAA0B,EAC1B,YAAY,EAGb,MAAM,sBAAsB,CAAC;AAoB9B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAInD,KAAK,WAAW,GAAG;IACjB,YAAY,EAAE,GAAG,GAAG,YAAY,CAAC;IACjC,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B,CAAC;AAqFF,KAAK,iBAAiB,GAAG;IACzB,UAAU,EAAE,0BAA0B,CAAC;CACtC,GAAG,WAAW,CAAC;;;;;;AA8HhB,wBAOG"}
1
+ {"version":3,"file":"PlTableFiltersV2.vue.d.ts","sourceRoot":"","sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"names":[],"mappings":"AA0MA,OAAO,KAAK,EACV,gBAAgB,EAChB,0BAA0B,EAC1B,YAAY,EAGb,MAAM,sBAAsB,CAAC;AAoB9B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAGnD,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,YAAY,EAAE,GAAG,GAAG,YAAY,CAAC;IACjC,OAAO,EAAE,0BAA0B,CAAC;IACpC,cAAc,EAAE,GAAG,GAAG,0BAA0B,CAAC;IACjD,eAAe,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;IAC7D,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;CACtE,CAAC;;AAqRF,wBAMG"}
@@ -1,31 +1,38 @@
1
1
  import e from "../PlAdvancedFilter/PlAdvancedFilter.js";
2
2
  import "../PlAdvancedFilter/index.js";
3
- import { Fragment as t, Teleport as n, computed as r, createBlock as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, createTextVNode as c, createVNode as l, defineComponent as u, mergeModels as d, normalizeClass as f, onMounted as p, openBlock as m, ref as h, unref as g, useModel as _, withCtx as v, withModifiers as y } from "vue";
4
- import { Annotation as b, Domain as x, canonicalizeJson as S, getPTableColumnId as C, getUniqueSourceValuesWithLabels as w, parseJson as T, readAnnotation as E, readDomain as D } from "@platforma-sdk/model";
5
- import { PlBtnGhost as O, PlSlideModal as k, usePlBlockPageTitleTeleportTarget as A } from "@milaboratories/uikit";
6
- import { isNil as j } from "es-toolkit";
3
+ import { Fragment as t, Teleport as n, computed as r, createBlock as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, createTextVNode as c, createVNode as l, defineComponent as u, normalizeClass as d, openBlock as f, ref as p, unref as m, withCtx as h, withModifiers as g } from "vue";
4
+ import { Annotation as _, Domain as v, canonicalizeJson as y, getPTableColumnId as b, getUniqueSourceValuesWithLabels as x, parseJson as S, readAnnotation as C, readDomain as w } from "@platforma-sdk/model";
5
+ import { PlBtnGhost as T, PlSlideModal as E, usePlBlockPageTitleTeleportTarget as D } from "@milaboratories/uikit";
6
+ import { isFunction as O, isNil as k } from "es-toolkit";
7
7
  //#region src/components/PlTableFilters/PlTableFiltersV2.vue?vue&type=script&setup=true&lang.ts
8
- var M = /* @__PURE__ */ u({
8
+ var A = { key: 1 }, j = /* @__PURE__ */ u({
9
9
  __name: "PlTableFiltersV2",
10
- props: /* @__PURE__ */ d({
10
+ props: {
11
+ columns: {},
11
12
  pframeHandle: {},
12
- columns: {}
13
- }, {
14
- modelValue: { required: !0 },
15
- modelModifiers: {}
16
- }),
17
- emits: ["update:modelValue"],
13
+ filters: {},
14
+ defaultFilters: {},
15
+ onUpdateFilters: { type: Function },
16
+ onResetDefaultFilters: { type: Function },
17
+ onUpdateDefaultFilters: { type: Function }
18
+ },
18
19
  setup(u) {
19
- let d = _(u, "modelValue"), M = u, N = h(!1);
20
- p(() => {
21
- N.value = !0;
22
- });
23
- let P = A("PlTableFiltersV2"), F = h(!1), I = r(() => d.value.filters.length > 0);
24
- function L(e) {
25
- return S(C(e));
26
- }
27
- let R = r(() => M.columns.map((e, t) => {
28
- let n = L(e), r = E(e.spec, b.Label)?.trim() ?? `Unlabeled ${e.type} ${t}`, i = D(e.spec, x.Alphabet) ?? E(e.spec, b.Alphabet);
20
+ let j = u, M = D("PlTableFiltersV2"), N = p(!1), P = r(() => j.filters.filters.length > 0), F = r(() => !k(j.defaultFilters) && j.defaultFilters.filters.length > 0), I = r(() => k(j.defaultFilters) || j.defaultFilters?.filters.length === 0 ? j.filters : {
21
+ ...j.filters,
22
+ filters: [...j.defaultFilters?.filters ?? [], ...j.filters.filters]
23
+ }), L = (e) => {
24
+ let t = e;
25
+ if (k(j.defaultFilters)) return j.onUpdateFilters(t);
26
+ let [n, ...r] = t.filters;
27
+ j.onUpdateFilters({
28
+ ...t,
29
+ filters: r
30
+ }), j.onUpdateDefaultFilters?.({
31
+ ...j.defaultFilters,
32
+ filters: [n]
33
+ });
34
+ }, R = r(() => j.columns.map((e, t) => {
35
+ let n = V(e), r = C(e.spec, _.Label)?.trim() ?? `Unlabeled ${e.type} ${t}`, i = w(e.spec, v.Alphabet) ?? C(e.spec, _.Alphabet);
29
36
  return {
30
37
  id: n,
31
38
  label: r,
@@ -49,10 +56,10 @@ var M = /* @__PURE__ */ u({
49
56
  "notEqual"
50
57
  ];
51
58
  function B(e) {
52
- if (j(M.pframeHandle)) return console.warn("PFrame handle is not available, cannot fetch suggest options"), [];
53
- let t = e.columnId, n = T(t);
59
+ if (k(j.pframeHandle)) return console.warn("PFrame handle is not available, cannot fetch suggest options"), [];
60
+ let t = e.columnId, n = S(t);
54
61
  if (n.type !== "column") throw Error("ColumnId should be of type 'column' for suggest options");
55
- return w(M.pframeHandle, {
62
+ return x(j.pframeHandle, {
56
63
  columnId: n.id,
57
64
  axisIdx: e.axisIdx,
58
65
  limit: 100,
@@ -60,35 +67,59 @@ var M = /* @__PURE__ */ u({
60
67
  searchQueryValue: e.searchType === "value" ? e.searchStr : void 0
61
68
  }).then((e) => e.values);
62
69
  }
63
- return (r, u) => (m(), o(t, null, [N.value && g(P) ? (m(), i(n, {
70
+ function V(e) {
71
+ return y(b(e));
72
+ }
73
+ return (r, u) => (f(), o(t, null, [m(M) ? (f(), i(n, {
64
74
  key: 0,
65
- to: g(P)
66
- }, [l(g(O), {
67
- icon: I.value ? "filter-on" : "filter",
68
- onClick: u[0] ||= y((e) => F.value = !0, ["stop"])
75
+ to: m(M)
76
+ }, [l(m(T), {
77
+ icon: P.value || F.value ? "filter-on" : "filter",
78
+ onClick: u[0] ||= g((e) => N.value = !0, ["stop"])
69
79
  }, {
70
- default: v(() => [...u[3] ||= [c(" Filters ", -1)]]),
80
+ default: h(() => [...u[3] ||= [c(" Filters ", -1)]]),
71
81
  _: 1
72
- }, 8, ["icon"])], 8, ["to"])) : a("", !0), l(g(k), {
73
- modelValue: F.value,
74
- "onUpdate:modelValue": u[2] ||= (e) => F.value = e,
82
+ }, 8, ["icon"])], 8, ["to"])) : a("", !0), l(m(E), {
83
+ modelValue: N.value,
84
+ "onUpdate:modelValue": u[2] ||= (e) => N.value = e,
75
85
  "close-on-outside-click": !1
76
86
  }, {
77
- title: v(() => [...u[4] ||= [c("Manage Filters", -1)]]),
78
- default: v(() => [s("div", { class: f(r.$style.root) }, [l(g(e), {
79
- filters: d.value,
80
- "onUpdate:filters": u[1] ||= (e) => d.value = e,
81
- items: R.value,
87
+ title: h(() => [...u[4] ||= [c("Manage Filters", -1)]]),
88
+ default: h(() => [s("div", { class: d(r.$style.root) }, [l(m(e), {
89
+ filters: I.value,
90
+ options: R.value,
82
91
  "supported-filters": z,
83
92
  "get-suggest-options": B,
93
+ "is-pinned": (e, t) => F.value && t === 0,
94
+ "is-removable": (e, t) => F.value ? t > 0 : !0,
95
+ "is-draggable": (e, t) => F.value ? t > 0 : !0,
84
96
  "enable-dnd": !1,
85
- "enable-add-group-button": !0
86
- }, null, 8, ["filters", "items"])], 2)]),
97
+ "enable-toggling": !0,
98
+ "enable-add-group-button": !0,
99
+ onUpdateFilters: L
100
+ }, {
101
+ "group-title": h(({ index: e }) => [F.value && e === 0 ? (f(), o("div", {
102
+ key: 0,
103
+ class: d(r.$style.defaultGroupTitle)
104
+ }, [u[5] ||= c(" Default Group ", -1), m(O)(j.onResetDefaultFilters) ? (f(), i(m(T), {
105
+ key: 0,
106
+ icon: "restart",
107
+ class: d(r.$style.restartBtn),
108
+ onClick: u[1] ||= g((e) => j.onResetDefaultFilters(), ["stop"])
109
+ }, null, 8, ["class"])) : a("", !0)], 2)) : (f(), o("div", A, "Custom Group"))]),
110
+ _: 1
111
+ }, 8, [
112
+ "filters",
113
+ "options",
114
+ "is-pinned",
115
+ "is-removable",
116
+ "is-draggable"
117
+ ])], 2)]),
87
118
  _: 1
88
119
  }, 8, ["modelValue"])], 64));
89
120
  }
90
121
  });
91
122
  //#endregion
92
- export { M as default };
123
+ export { j as default };
93
124
 
94
125
  //# sourceMappingURL=PlTableFiltersV2.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlTableFiltersV2.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type {\n PTableColumnSpec,\n PlDataTableFiltersWithMeta,\n PFrameHandle,\n PTableColumnId,\n CanonicalizedJson,\n} from \"@platforma-sdk/model\";\nimport {\n canonicalizeJson,\n Annotation,\n Domain,\n readAnnotation,\n readDomain,\n getUniqueSourceValuesWithLabels,\n parseJson,\n getPTableColumnId,\n} from \"@platforma-sdk/model\";\nimport { computed, onMounted, ref } from \"vue\";\nimport { PlBtnGhost, PlSlideModal, usePlBlockPageTitleTeleportTarget } from \"@milaboratories/uikit\";\nimport {\n PlAdvancedFilter,\n PlAdvancedFilterComponent,\n PlAdvancedFilterSupportedFilters,\n type PlAdvancedFilterItem,\n} from \"../PlAdvancedFilter\";\nimport type { PlAdvancedFilterColumnId } from \"../PlAdvancedFilter/types\";\nimport type { Nil } from \"@milaboratories/helpers\";\nimport { isNil } from \"es-toolkit\";\n\nconst model = defineModel<PlDataTableFiltersWithMeta>({ required: true });\nconst props = defineProps<{\n pframeHandle: Nil | PFrameHandle;\n columns: PTableColumnSpec[];\n}>();\n\n// Teleport for \"Filters\" button\nconst mounted = ref(false);\nonMounted(() => {\n mounted.value = true;\n});\nconst teleportTarget = usePlBlockPageTitleTeleportTarget(\"PlTableFiltersV2\");\nconst showManager = ref(false);\n\n// Check if any filters are active\nconst filtersOn = computed(() => {\n return model.value.filters.length > 0;\n});\n\nfunction makeFilterColumnId(spec: PTableColumnSpec): CanonicalizedJson<PTableColumnId> {\n return canonicalizeJson<PTableColumnId>(getPTableColumnId(spec));\n}\n\nconst items = computed<PlAdvancedFilterItem[]>(() => {\n return props.columns.map((col, idx) => {\n const id = makeFilterColumnId(col);\n const label =\n readAnnotation(col.spec, Annotation.Label)?.trim() ?? `Unlabeled ${col.type} ${idx}`;\n const alphabet =\n readDomain(col.spec, Domain.Alphabet) ?? readAnnotation(col.spec, Annotation.Alphabet);\n return {\n id,\n label,\n spec: col.spec,\n alphabet: alphabet ?? undefined,\n };\n });\n});\n\n// Supported filters (same set as FilterSidebar)\nconst supportedFilters = [\n \"isNA\",\n \"isNotNA\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"patternEquals\",\n \"patternNotEquals\",\n \"patternContainSubsequence\",\n \"patternNotContainSubsequence\",\n \"patternMatchesRegularExpression\",\n \"patternFuzzyContainSubsequence\",\n \"equal\",\n \"notEqual\",\n] as (typeof PlAdvancedFilterSupportedFilters)[number][];\n\n// getSuggestOptions - provide discrete values from column annotations\nfunction handleSuggestOptions(params: {\n columnId: PlAdvancedFilterColumnId;\n axisIdx?: number;\n searchStr: string;\n searchType: \"value\" | \"label\";\n}) {\n if (isNil(props.pframeHandle)) {\n console.warn(\"PFrame handle is not available, cannot fetch suggest options\");\n return [];\n }\n\n const strId = params.columnId as CanonicalizedJson<PTableColumnId>;\n const tableColumnId = parseJson<PTableColumnId>(strId);\n\n if (tableColumnId.type !== \"column\") {\n throw new Error(\"ColumnId should be of type 'column' for suggest options\");\n }\n\n return getUniqueSourceValuesWithLabels(props.pframeHandle, {\n columnId: tableColumnId.id,\n axisIdx: params.axisIdx,\n limit: 100,\n searchQuery: params.searchType === \"label\" ? params.searchStr : undefined,\n searchQueryValue: params.searchType === \"value\" ? params.searchStr : undefined,\n }).then((v) => v.values);\n}\n</script>\n\n<template>\n <Teleport v-if=\"mounted && teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost :icon=\"filtersOn ? 'filter-on' : 'filter'\" @click.stop=\"showManager = true\">\n Filters\n </PlBtnGhost>\n </Teleport>\n\n <PlSlideModal v-model=\"showManager\" :close-on-outside-click=\"false\">\n <template #title>Manage Filters</template>\n\n <div :class=\"$style.root\">\n <PlAdvancedFilterComponent\n v-model:filters=\"model as PlAdvancedFilter\"\n :items=\"items\"\n :supported-filters=\"supportedFilters\"\n :get-suggest-options=\"handleSuggestOptions\"\n :enable-dnd=\"false\"\n :enable-add-group-button=\"true\"\n />\n </div>\n </PlSlideModal>\n</template>\n\n<style module>\n.root {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;EA8BA,IAAM,IAAQ,EAAuC,GAAA,aAAoB,EACnE,IAAQ,GAMR,IAAU,EAAI,GAAM;AAC1B,UAAgB;AACd,KAAQ,QAAQ;IAChB;EACF,IAAM,IAAiB,EAAkC,mBAAmB,EACtE,IAAc,EAAI,GAAM,EAGxB,IAAY,QACT,EAAM,MAAM,QAAQ,SAAS,EACpC;EAEF,SAAS,EAAmB,GAA2D;AACrF,UAAO,EAAiC,EAAkB,EAAK,CAAC;;EAGlE,IAAM,IAAQ,QACL,EAAM,QAAQ,KAAK,GAAK,MAAQ;GACrC,IAAM,IAAK,EAAmB,EAAI,EAC5B,IACJ,EAAe,EAAI,MAAM,EAAW,MAAM,EAAE,MAAM,IAAI,aAAa,EAAI,KAAK,GAAG,KAC3E,IACJ,EAAW,EAAI,MAAM,EAAO,SAAS,IAAI,EAAe,EAAI,MAAM,EAAW,SAAS;AACxF,UAAO;IACL;IACA;IACA,MAAM,EAAI;IACV,UAAU,KAAY,KAAA;IACvB;IACD,CACF,EAGI,IAAmB;GACvB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EAGD,SAAS,EAAqB,GAK3B;AACD,OAAI,EAAM,EAAM,aAAa,CAE3B,QADA,QAAQ,KAAK,+DAA+D,EACrE,EAAE;GAGX,IAAM,IAAQ,EAAO,UACf,IAAgB,EAA0B,EAAM;AAEtD,OAAI,EAAc,SAAS,SACzB,OAAU,MAAM,0DAA0D;AAG5E,UAAO,EAAgC,EAAM,cAAc;IACzD,UAAU,EAAc;IACxB,SAAS,EAAO;IAChB,OAAO;IACP,aAAa,EAAO,eAAe,UAAU,EAAO,YAAY,KAAA;IAChE,kBAAkB,EAAO,eAAe,UAAU,EAAO,YAAY,KAAA;IACtE,CAAC,CAAC,MAAM,MAAM,EAAE,OAAO;;qCAKR,EAAA,SAAW,EAAA,EAAc,IAAA,GAAA,EAAzC,EAIW,GAAA;;GAJiC,IAAI,EAAA,EAAc;MAC5D,EAEa,EAAA,EAAA,EAAA;GAFA,MAAM,EAAA,QAAS,cAAA;GAA4B,SAAK,AAAA,EAAA,OAAA,GAAA,MAAO,EAAA,QAAW,IAAA,CAAA,OAAA,CAAA;;oBAE/E,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAFwF,aAExF,GAAA,CAAA,CAAA,CAAA;;6CAGF,EAae,EAAA,EAAA,EAAA;eAbQ,EAAA;4CAAW,QAAA;GAAG,0BAAwB;;GAChD,OAAK,QAAe,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAAd,kBAAc,GAAA,CAAA,CAAA,CAAA;oBAWzB,CATN,EASM,OAAA,EATA,OAAK,EAAEA,EAAAA,OAAO,KAAI,EAAA,EAAA,CACtB,EAOE,EAAA,EAAA,EAAA;IANQ,SAAS,EAAA;0CAAA,QAAK;IACrB,OAAO,EAAA;IACP,qBAAmB;IACnB,uBAAqB;IACrB,cAAY;IACZ,2BAAyB"}
1
+ {"version":3,"file":"PlTableFiltersV2.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type {\n PTableColumnSpec,\n PlDataTableFiltersWithMeta,\n PFrameHandle,\n PTableColumnId,\n CanonicalizedJson,\n} from \"@platforma-sdk/model\";\nimport {\n canonicalizeJson,\n Annotation,\n Domain,\n readAnnotation,\n readDomain,\n getUniqueSourceValuesWithLabels,\n parseJson,\n getPTableColumnId,\n} from \"@platforma-sdk/model\";\nimport { computed, ref } from \"vue\";\nimport { PlBtnGhost, PlSlideModal, usePlBlockPageTitleTeleportTarget } from \"@milaboratories/uikit\";\nimport {\n PlAdvancedFilter,\n PlAdvancedFilterComponent,\n PlAdvancedFilterSupportedFilters,\n type PlAdvancedFilterItem,\n} from \"../PlAdvancedFilter\";\nimport type { PlAdvancedFilterColumnId } from \"../PlAdvancedFilter/types\";\nimport type { Nil } from \"@milaboratories/helpers\";\nimport { isFunction, isNil } from \"es-toolkit\";\n\nconst props = defineProps<{\n columns: PTableColumnSpec[];\n pframeHandle: Nil | PFrameHandle;\n filters: PlDataTableFiltersWithMeta;\n defaultFilters: Nil | PlDataTableFiltersWithMeta;\n onUpdateFilters: (value: PlDataTableFiltersWithMeta) => void;\n onResetDefaultFilters?: () => void;\n onUpdateDefaultFilters?: (value: PlDataTableFiltersWithMeta) => void;\n}>();\n\nconst teleportTarget = usePlBlockPageTitleTeleportTarget(\"PlTableFiltersV2\");\nconst showManager = ref(false);\nconst hasFilters = computed(() => props.filters.filters.length > 0);\nconst hasDefaultFilters = computed(\n () => !isNil(props.defaultFilters) && props.defaultFilters.filters.length > 0,\n);\nconst filters = computed<PlDataTableFiltersWithMeta>(() => {\n if (isNil(props.defaultFilters) || props.defaultFilters?.filters.length === 0) {\n return props.filters;\n }\n\n return {\n ...props.filters,\n filters: [...(props.defaultFilters?.filters ?? []), ...props.filters.filters],\n };\n});\nconst onUpdateFilters = (_value: PlAdvancedFilter) => {\n const value = _value as PlDataTableFiltersWithMeta;\n\n if (isNil(props.defaultFilters)) {\n return props.onUpdateFilters(value);\n }\n\n const [defaults, ...rest] = value.filters;\n props.onUpdateFilters({ ...value, filters: rest });\n props.onUpdateDefaultFilters?.({ ...props.defaultFilters, filters: [defaults] });\n};\n\nconst options = computed<PlAdvancedFilterItem[]>(() => {\n return props.columns.map((col, idx) => {\n const id = makeFilterColumnId(col);\n const label =\n readAnnotation(col.spec, Annotation.Label)?.trim() ?? `Unlabeled ${col.type} ${idx}`;\n const alphabet =\n readDomain(col.spec, Domain.Alphabet) ?? readAnnotation(col.spec, Annotation.Alphabet);\n return {\n id,\n label,\n spec: col.spec,\n alphabet: alphabet ?? undefined,\n };\n });\n});\n\n// Supported filters (same set as FilterSidebar)\nconst supportedFilters = [\n \"isNA\",\n \"isNotNA\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"patternEquals\",\n \"patternNotEquals\",\n \"patternContainSubsequence\",\n \"patternNotContainSubsequence\",\n \"patternMatchesRegularExpression\",\n \"patternFuzzyContainSubsequence\",\n \"equal\",\n \"notEqual\",\n] as (typeof PlAdvancedFilterSupportedFilters)[number][];\n\n// getSuggestOptions - provide discrete values from column annotations\nfunction handleSuggestOptions(params: {\n columnId: PlAdvancedFilterColumnId;\n axisIdx?: number;\n searchStr: string;\n searchType: \"value\" | \"label\";\n}) {\n if (isNil(props.pframeHandle)) {\n console.warn(\"PFrame handle is not available, cannot fetch suggest options\");\n return [];\n }\n\n const strId = params.columnId as CanonicalizedJson<PTableColumnId>;\n const tableColumnId = parseJson<PTableColumnId>(strId);\n\n if (tableColumnId.type !== \"column\") {\n throw new Error(\"ColumnId should be of type 'column' for suggest options\");\n }\n\n return getUniqueSourceValuesWithLabels(props.pframeHandle, {\n columnId: tableColumnId.id,\n axisIdx: params.axisIdx,\n limit: 100,\n searchQuery: params.searchType === \"label\" ? params.searchStr : undefined,\n searchQueryValue: params.searchType === \"value\" ? params.searchStr : undefined,\n }).then((v) => v.values);\n}\n\nfunction makeFilterColumnId(spec: PTableColumnSpec): CanonicalizedJson<PTableColumnId> {\n return canonicalizeJson<PTableColumnId>(getPTableColumnId(spec));\n}\n</script>\n\n<template>\n <Teleport v-if=\"teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost\n :icon=\"hasFilters || hasDefaultFilters ? 'filter-on' : 'filter'\"\n @click.stop=\"showManager = true\"\n >\n Filters\n </PlBtnGhost>\n </Teleport>\n\n <PlSlideModal v-model=\"showManager\" :close-on-outside-click=\"false\">\n <template #title>Manage Filters</template>\n\n <div :class=\"$style.root\">\n <PlAdvancedFilterComponent\n :filters=\"filters as PlAdvancedFilter\"\n :options=\"options\"\n :supported-filters=\"supportedFilters\"\n :get-suggest-options=\"handleSuggestOptions\"\n :is-pinned=\"(_, index) => hasDefaultFilters && index === 0\"\n :is-removable=\"(_, index) => (hasDefaultFilters ? index > 0 : true)\"\n :is-draggable=\"(_, index) => (hasDefaultFilters ? index > 0 : true)\"\n :enable-dnd=\"false\"\n :enable-toggling=\"true\"\n :enable-add-group-button=\"true\"\n @update-filters=\"onUpdateFilters\"\n >\n <template #group-title=\"{ index }\">\n <div v-if=\"hasDefaultFilters && index === 0\" :class=\"$style.defaultGroupTitle\">\n Default Group\n <PlBtnGhost\n v-if=\"isFunction(props.onResetDefaultFilters)\"\n icon=\"restart\"\n :class=\"$style.restartBtn\"\n @click.stop=\"props.onResetDefaultFilters()\"\n />\n </div>\n <div v-else>Custom Group</div>\n </template>\n </PlAdvancedFilterComponent>\n </div>\n </PlSlideModal>\n</template>\n\n<style module>\n.root {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n.defaultGroupTitle {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.restartBtn {\n width: 24px;\n height: 24px;\n padding: 4px;\n --button-width: 24px;\n --btn-min-width: 24px;\n --button-height: 24px;\n --btn-min-height: 24x;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EA8BA,IAAM,IAAQ,GAUR,IAAiB,EAAkC,mBAAmB,EACtE,IAAc,EAAI,GAAM,EACxB,IAAa,QAAe,EAAM,QAAQ,QAAQ,SAAS,EAAE,EAC7D,IAAoB,QAClB,CAAC,EAAM,EAAM,eAAe,IAAI,EAAM,eAAe,QAAQ,SAAS,EAC7E,EACK,IAAU,QACV,EAAM,EAAM,eAAe,IAAI,EAAM,gBAAgB,QAAQ,WAAW,IACnE,EAAM,UAGR;GACL,GAAG,EAAM;GACT,SAAS,CAAC,GAAI,EAAM,gBAAgB,WAAW,EAAE,EAAG,GAAG,EAAM,QAAQ,QAAQ;GAC9E,CACD,EACI,KAAmB,MAA6B;GACpD,IAAM,IAAQ;AAEd,OAAI,EAAM,EAAM,eAAe,CAC7B,QAAO,EAAM,gBAAgB,EAAM;GAGrC,IAAM,CAAC,GAAU,GAAG,KAAQ,EAAM;AAElC,GADA,EAAM,gBAAgB;IAAE,GAAG;IAAO,SAAS;IAAM,CAAC,EAClD,EAAM,yBAAyB;IAAE,GAAG,EAAM;IAAgB,SAAS,CAAC,EAAS;IAAE,CAAC;KAG5E,IAAU,QACP,EAAM,QAAQ,KAAK,GAAK,MAAQ;GACrC,IAAM,IAAK,EAAmB,EAAI,EAC5B,IACJ,EAAe,EAAI,MAAM,EAAW,MAAM,EAAE,MAAM,IAAI,aAAa,EAAI,KAAK,GAAG,KAC3E,IACJ,EAAW,EAAI,MAAM,EAAO,SAAS,IAAI,EAAe,EAAI,MAAM,EAAW,SAAS;AACxF,UAAO;IACL;IACA;IACA,MAAM,EAAI;IACV,UAAU,KAAY,KAAA;IACvB;IACD,CACF,EAGI,IAAmB;GACvB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EAGD,SAAS,EAAqB,GAK3B;AACD,OAAI,EAAM,EAAM,aAAa,CAE3B,QADA,QAAQ,KAAK,+DAA+D,EACrE,EAAE;GAGX,IAAM,IAAQ,EAAO,UACf,IAAgB,EAA0B,EAAM;AAEtD,OAAI,EAAc,SAAS,SACzB,OAAU,MAAM,0DAA0D;AAG5E,UAAO,EAAgC,EAAM,cAAc;IACzD,UAAU,EAAc;IACxB,SAAS,EAAO;IAChB,OAAO;IACP,aAAa,EAAO,eAAe,UAAU,EAAO,YAAY,KAAA;IAChE,kBAAkB,EAAO,eAAe,UAAU,EAAO,YAAY,KAAA;IACtE,CAAC,CAAC,MAAM,MAAM,EAAE,OAAO;;EAG1B,SAAS,EAAmB,GAA2D;AACrF,UAAO,EAAiC,EAAkB,EAAK,CAAC;;qCAKhD,EAAA,EAAc,IAAA,GAAA,EAA9B,EAOW,GAAA;;GAPsB,IAAI,EAAA,EAAc;MACjD,EAKa,EAAA,EAAA,EAAA;GAJV,MAAM,EAAA,SAAc,EAAA,QAAiB,cAAA;GACrC,SAAK,AAAA,EAAA,OAAA,GAAA,MAAO,EAAA,QAAW,IAAA,CAAA,OAAA,CAAA;;oBAG1B,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAFC,aAED,GAAA,CAAA,CAAA,CAAA;;6CAGF,EA+Be,EAAA,EAAA,EAAA;eA/BQ,EAAA;4CAAW,QAAA;GAAG,0BAAwB;;GAChD,OAAK,QAAe,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAAd,kBAAc,GAAA,CAAA,CAAA,CAAA;oBA6BzB,CA3BN,EA2BM,OAAA,EA3BA,OAAK,EAAEA,EAAAA,OAAO,KAAI,EAAA,EAAA,CACtB,EAyB4B,EAAA,EAAA,EAAA;IAxBzB,SAAS,EAAA;IACT,SAAS,EAAA;IACT,qBAAmB;IACnB,uBAAqB;IACrB,cAAY,GAAG,MAAU,EAAA,SAAqB,MAAK;IACnD,iBAAe,GAAG,MAAW,EAAA,QAAoB,IAAK,IAAA;IACtD,iBAAe,GAAG,MAAW,EAAA,QAAoB,IAAK,IAAA;IACtD,cAAY;IACZ,mBAAiB;IACjB,2BAAyB;IACT;;IAEN,eAAW,GASd,EATkB,eAAK,CAClB,EAAA,SAAqB,MAAK,KAAA,GAAA,EAArC,EAQM,OAAA;;KARwC,OAAK,EAAEA,EAAAA,OAAO,kBAAiB;mBAAE,mBAE7E,GAAA,EACQ,EAAA,EAAU,CAAC,EAAM,sBAAqB,IAAA,GAAA,EAD9C,EAKE,EAAA,EAAA,EAAA;;KAHA,MAAK;KACJ,OAAK,EAAEA,EAAAA,OAAO,WAAU;KACxB,SAAK,AAAA,EAAA,OAAA,GAAA,MAAO,EAAM,uBAAqB,EAAA,CAAA,OAAA,CAAA;sDAG5C,EAA8B,OAAA,GAAlB,eAAY,EAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,OAAO,CAAC"}
package/dist/index.js CHANGED
@@ -36,7 +36,9 @@ import { objectHash as Q } from "./objectHash.js";
36
36
  import { computedResult as $ } from "./computedResult.js";
37
37
  import { ReactiveFileContent as te } from "./composition/fileContent.js";
38
38
  import "./lib.js";
39
+ import { setAutoFreeze as ne } from "immer";
39
40
  export * from "@milaboratories/uikit";
41
+ ne(!1);
40
42
  //#endregion
41
43
  export { j as AgGridTheme, g as BlockLayout, T as DeferredCircular, e as MultiError, S as PlAdvancedFilterComponent, C as PlAdvancedFilterSupportedFilters, I as PlAgCellFile, P as PlAgCellProgress, z as PlAgCellStatusTag, R as PlAgChartHistogramCell, L as PlAgChartStackedBarCell, E as PlAgColumnHeader, _ as PlAgCsvExporter, v as PlAgDataTableRowNumberColId, M as PlAgDataTableV2, x as PlAgGridColumnManager, k as PlAgOverlayLoading, A as PlAgOverlayNoRows, D as PlAgTextAndButtonCell, K as PlAnnotations, q as PlAnnotationsModal, J as PlBtnExportArchive, M as PlDataTableV2, w as PlTableFiltersV2, te as ReactiveFileContent, t as UnresolvedError, Z as activateAgGrid, y as autoSizeRowNumberColumn, $ as computedResult, F as createAgGridColDef, u as createModel, O as defaultMainMenuItems, d as defineApp, f as defineAppV3, X as defineStore, V as deselectAll, n as ensureError, ee as ensureNodeVisible, r as ensureOutputHasStableFlag, i as formatZodError, H as getSelectedRowsCount, U as getTotalRowsCount, a as identity, o as isDefined, W as isSelectionEnabled, s as isZodError, b as makeRowNumberColDef, Q as objectHash, p as pluginDataKey, G as selectAll, c as unwrapOutput, B as useAgGridOptions, m as useFeatureFlags, N as usePlDataTableSettingsV2, Y as usePlugin, h as useSdkPlugin, l as wrapOptionalResult };
42
44
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export * from \"./lib\";\n"],"mappings":""}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { setAutoFreeze } from \"immer\";\n\nsetAutoFreeze(false);\n\nexport * from \"./lib\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,GAAc,GAAM"}
@@ -1 +1 @@
1
- {"version":3,"file":"functions.js","names":[],"sources":["../../../../../../../lib/util/helpers/src/functions.ts"],"sourcesContent":["import type { AnyFunction } from \"./types\";\n\nexport function isFunction(value: unknown): value is AnyFunction {\n return typeof value === \"function\";\n}\n\n/**\n * A utility class that ensures asynchronous locks, allowing only one task to proceed at a time.\n */\nexport class AwaitLock {\n private acquired = false;\n private resolvers: (() => void)[] = [];\n\n acquireAsync(): Promise<void> {\n if (!this.acquired) {\n this.acquired = true;\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n this.resolvers.push(resolve);\n });\n }\n\n release(): void {\n if (!this.acquired) {\n throw new Error(\"Cannot release not acquired lock\");\n }\n\n if (this.resolvers.length) {\n this.resolvers.shift()?.();\n } else {\n this.acquired = false;\n }\n }\n}\n\n/**\n * A utility to add a timeout to a promise, rejecting the promise if the timeout is exceeded.\n */\nexport function promiseTimeout<T>(prom: PromiseLike<T>, ms: number): Promise<T> {\n return Promise.race<T>([\n prom,\n new Promise((_r, reject) => setTimeout(() => reject(Error(`Timeout exceeded ${ms}`)), ms)),\n ]);\n}\n\n/**\n * Debounce utility: delays the execution of a function until a certain time has passed since the last call.\n * @param callback\n * @param ms\n * @param immediate (if first call is required)\n * @returns\n */\nexport function debounce<F extends AnyFunction>(\n callback: F,\n ms: number,\n immediate?: boolean,\n): (...args: Parameters<F>) => void {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n return function (this: unknown, ...args: Parameters<F>) {\n const i = immediate && !timeout;\n if (i) {\n callback.apply(this, args);\n }\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n timeout = undefined;\n if (!i) {\n callback.apply(this, args);\n }\n }, ms);\n };\n}\n\n/**\n * Throttle utility: ensures a function is called at most once every `ms` milliseconds.\n * @param callback\n * @param ms milliseconds\n * @param trailing (ensure last call)\n * @returns\n */\nexport function throttle<F extends AnyFunction>(\n callback: F,\n ms: number,\n trailing = true,\n): (...args: Parameters<F>) => void {\n let t = 0,\n call: AnyFunction | null;\n return function (this: unknown, ...args: Parameters<F>) {\n call = () => {\n callback.apply(this, args);\n t = new Date().getTime() + ms;\n call = null;\n if (trailing) {\n setTimeout(() => {\n call?.();\n }, ms);\n }\n };\n if (new Date().getTime() > t) call();\n };\n}\n\n/**\n * Memoization utility: caches results of function calls based on their arguments to avoid redundant calculations.\n */\nexport const memoize = <F extends AnyFunction>(fn: F) => {\n const cache = new Map();\n return function (...args: Parameters<F>): ReturnType<F> {\n const key = JSON.stringify(args);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return cache.has(key)\n ? cache.get(key)\n : cache.set(key, fn.call(null, ...args)) && cache.get(key);\n };\n};\n\n/**\n * Function wrapper utility: executes a function before the main function is called.\n */\nexport const wrapFunction = <T extends unknown[], U>(fn: (...args: T) => U, before: () => void) => {\n return (...args: T): U => {\n before();\n return fn(...args);\n };\n};\n\n/**\n * Function piping utility: allows chaining of functions by passing the result of one as input to another\n */\nexport function pipe<A, B>(cb: (a: A) => B) {\n const fn = (a: A) => cb(a);\n\n fn.pipe = <C>(next: (b: B) => C) => pipe((a: A) => next(cb(a)));\n\n return fn;\n}\n\n/**\n * Ensures that only one request can be processed at a time.\n */\nexport function exclusiveRequest<A, R>(request: (...args: A[]) => Promise<R>) {\n let counter = 0n;\n let ongoingOperation: Promise<R> | undefined;\n\n return async function (...params: A[]): Promise<\n | {\n ok: false;\n }\n | {\n ok: true;\n value: R;\n }\n > {\n const myId = ++counter;\n\n try {\n await ongoingOperation;\n } catch {\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 (counter !== myId) {\n return {\n ok: false,\n };\n }\n\n const promise = request(...params);\n\n ongoingOperation = promise;\n\n const value = await promise;\n\n return {\n ok: true,\n value,\n };\n };\n}\n\nexport function tryDo<R1>(fn: () => R1): R1 | undefined;\nexport function tryDo<R1, R2>(fn: () => R1, fallback: (cause: unknown) => R2): R1 | R2;\nexport function tryDo(fn: () => unknown, fallback?: (cause: unknown) => unknown) {\n try {\n return fn();\n } catch (cause: unknown) {\n return fallback?.(cause);\n }\n}\n"],"mappings":";AAwCA,SAAgB,EAAkB,GAAsB,GAAwB;AAC9E,QAAO,QAAQ,KAAQ,CACrB,GACA,IAAI,SAAS,GAAI,MAAW,iBAAiB,EAAO,MAAM,oBAAoB,IAAK,CAAC,EAAE,EAAG,CAAC,CAC3F,CAAC"}
1
+ {"version":3,"file":"functions.js","names":[],"sources":["../../../../../../../lib/util/helpers/src/functions.ts"],"sourcesContent":["import type { AnyFunction } from \"./types\";\n\nexport function isFunction(value: unknown): value is AnyFunction {\n return typeof value === \"function\";\n}\n\n/**\n * A utility class that ensures asynchronous locks, allowing only one task to proceed at a time.\n */\nexport class AwaitLock {\n private acquired = false;\n private resolvers: (() => void)[] = [];\n\n acquireAsync(): Promise<void> {\n if (!this.acquired) {\n this.acquired = true;\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n this.resolvers.push(resolve);\n });\n }\n\n release(): void {\n if (!this.acquired) {\n throw new Error(\"Cannot release not acquired lock\");\n }\n\n if (this.resolvers.length) {\n this.resolvers.shift()?.();\n } else {\n this.acquired = false;\n }\n }\n}\n\n/**\n * A utility to add a timeout to a promise, rejecting the promise if the timeout is exceeded.\n */\nexport function promiseTimeout<T>(prom: PromiseLike<T>, ms: number): Promise<T> {\n return Promise.race<T>([\n prom,\n new Promise((_r, reject) => setTimeout(() => reject(Error(`Timeout exceeded ${ms}`)), ms)),\n ]);\n}\n\n/**\n * Debounce utility: delays the execution of a function until a certain time has passed since the last call.\n * @param callback\n * @param ms\n * @param immediate (if first call is required)\n * @returns\n */\nexport function debounce<F extends AnyFunction>(\n callback: F,\n ms: number,\n immediate?: boolean,\n): (...args: Parameters<F>) => void {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n return function (this: unknown, ...args: Parameters<F>) {\n const i = immediate && !timeout;\n if (i) {\n callback.apply(this, args);\n }\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n timeout = undefined;\n if (!i) {\n callback.apply(this, args);\n }\n }, ms);\n };\n}\n\n/**\n * Throttle utility: ensures a function is called at most once every `ms` milliseconds.\n * @param callback\n * @param ms milliseconds\n * @param trailing (ensure last call)\n * @returns\n */\nexport function throttle<F extends AnyFunction>(\n callback: F,\n ms: number,\n trailing = true,\n): (...args: Parameters<F>) => void {\n let t = 0,\n call: AnyFunction | null;\n return function (this: unknown, ...args: Parameters<F>) {\n call = () => {\n callback.apply(this, args);\n t = new Date().getTime() + ms;\n call = null;\n if (trailing) {\n setTimeout(() => {\n call?.();\n }, ms);\n }\n };\n if (new Date().getTime() > t) call();\n };\n}\n\n/**\n * Memoization utility: caches results of function calls based on their arguments to avoid redundant calculations.\n */\nexport const memoize = <F extends AnyFunction>(fn: F) => {\n const cache = new Map();\n return function (...args: Parameters<F>): ReturnType<F> {\n const key = JSON.stringify(args);\n return cache.has(key)\n ? cache.get(key)\n : cache.set(key, fn.call(null, ...args)) && cache.get(key);\n };\n};\n\n/**\n * Function wrapper utility: executes a function before the main function is called.\n */\nexport const wrapFunction = <T extends unknown[], U>(fn: (...args: T) => U, before: () => void) => {\n return (...args: T): U => {\n before();\n return fn(...args);\n };\n};\n\n/**\n * Function piping utility: allows chaining of functions by passing the result of one as input to another\n */\nexport function pipe<A, B>(cb: (a: A) => B) {\n const fn = (a: A) => cb(a);\n\n fn.pipe = <C>(next: (b: B) => C) => pipe((a: A) => next(cb(a)));\n\n return fn;\n}\n\n/**\n * Ensures that only one request can be processed at a time.\n */\nexport function exclusiveRequest<A, R>(request: (...args: A[]) => Promise<R>) {\n let counter = 0n;\n let ongoingOperation: Promise<R> | undefined;\n\n return async function (...params: A[]): Promise<\n | {\n ok: false;\n }\n | {\n ok: true;\n value: R;\n }\n > {\n const myId = ++counter;\n\n try {\n await ongoingOperation;\n } catch {\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 (counter !== myId) {\n return {\n ok: false,\n };\n }\n\n const promise = request(...params);\n\n ongoingOperation = promise;\n\n const value = await promise;\n\n return {\n ok: true,\n value,\n };\n };\n}\n\nexport function tryDo<R1>(fn: () => R1): R1 | undefined;\nexport function tryDo<R1, R2>(fn: () => R1, fallback: (cause: unknown) => R2): R1 | R2;\nexport function tryDo(fn: () => unknown, fallback?: (cause: unknown) => unknown) {\n try {\n return fn();\n } catch (cause: unknown) {\n return fallback?.(cause);\n }\n}\n"],"mappings":";AAwCA,SAAgB,EAAkB,GAAsB,GAAwB;AAC9E,QAAO,QAAQ,KAAQ,CACrB,GACA,IAAI,SAAS,GAAI,MAAW,iBAAiB,EAAO,MAAM,oBAAoB,IAAK,CAAC,EAAE,EAAG,CAAC,CAC3F,CAAC"}
@@ -32,7 +32,10 @@ function o(e) {
32
32
  }), t;
33
33
  } else return e;
34
34
  }
35
+ function s(e, t) {
36
+ return e[t];
37
+ }
35
38
  //#endregion
36
- export { o as deepClone, e as isArray, a as isJsonEqual, t as isNonPrimitive, n as isObject, r as isPlainObject };
39
+ export { o as deepClone, s as getField, e as isArray, a as isJsonEqual, t as isNonPrimitive, n as isObject, r as isPlainObject };
37
40
 
38
41
  //# sourceMappingURL=objects.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"objects.js","names":[],"sources":["../../../../../../../lib/util/helpers/src/objects.ts"],"sourcesContent":["/**/\n\nimport type { PartialBy, PlainObject } from \"./types\";\nimport { isNil } from \"./utils\";\n\n/**\n * Alias to Array.isArray\n */\nexport const isArray = Array.isArray;\n\n//\nexport function isNonPrimitive<V, T extends PlainObject<V> | V[]>(obj: T | unknown): obj is T {\n return obj !== null && typeof obj === \"object\";\n}\n\nexport function isObject(value: unknown): value is object {\n return typeof value === \"object\" && value !== null;\n}\n\n/**\n * Checks if the given value is a plain object.\n *\n * A plain object is defined as an object created by the `{}` literal,\n * an object created with `Object.create(null)`, or an object with a\n * prototype that resolves to `Object.prototype`.\n *\n * @param value - The value to check.\n * @returns `true` if the value is a plain object, otherwise `false`.\n *\n * @example\n * ```typescript\n * isPlainObject({}); // true\n * isPlainObject(Object.create(null)); // true\n * isPlainObject(new Date()); // false\n * isPlainObject(null); // false\n * isPlainObject([]); // false\n * ```\n */\nexport function isPlainObject(value: unknown): value is PlainObject {\n if (!isObject(value)) {\n return false;\n }\n\n const prototype: unknown = Object.getPrototypeOf(value);\n\n return (\n prototype === null ||\n prototype === Object.prototype ||\n Object.getPrototypeOf(prototype) === null\n );\n}\n\nexport function map<U, T extends Record<string, unknown>>(\n obj: T,\n callback: (curr: T[keyof T], key: keyof T) => U,\n) {\n const keys = Object.keys(obj) as Array<keyof T>;\n\n return keys.map((key: keyof T) => {\n return callback(obj[key], key);\n });\n}\n\nfunction definedKeysSize(obj: PlainObject) {\n return Object.values(obj).reduce((length: number, v) => {\n return v !== undefined ? length + 1 : length;\n }, 0);\n}\n\n/**\n * Performs a deep equality check between two values, `a` and `b`, to determine if they are JSON-equivalent.\n *\n * JSON equivalence means that the two values are strictly equal in structure and content, including arrays and plain objects.\n * Non-primitive values that are neither arrays nor plain objects will throw an error.\n *\n * @param a - The first value to compare.\n * @param b - The second value to compare.\n * @returns `true` if the values are JSON-equivalent, otherwise `false`.\n *\n * @throws If the values are non-primitive and not arrays or plain objects.\n *\n * @example\n * ```typescript\n * isJsonEqual(1, 1); // true\n * isJsonEqual({ a: 1 }, { a: 1 }); // true\n * isJsonEqual([1, 2], [1, 2]); // true\n * isJsonEqual({ a: 1 }, { a: 2 }); // false\n * isJsonEqual([1, 2], [2, 1]); // false\n * isJsonEqual(new Date(), new Date()); // Error\n * ```\n */\nexport function isJsonEqual(a: unknown, b: unknown): boolean {\n if (!(isNonPrimitive(a) && isNonPrimitive(b))) {\n return a === b;\n }\n\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) {\n return false;\n } else {\n return [...a.keys()].every((k) => isJsonEqual(a[k], b[k]));\n }\n }\n\n if (isPlainObject(a) && isPlainObject(b)) {\n if (definedKeysSize(a) !== definedKeysSize(b)) {\n return false;\n }\n\n return Object.keys(a).every((k) => isJsonEqual(a[k], b[k]));\n }\n\n throw Error(`Cannot compare a ${String(a)} and b ${String(b)}`);\n}\n\n/**\n * Alias to isJsonEqual function\n * @deprecated change to isJsonEqual\n */\nexport const deepEqual = isJsonEqual;\n\nexport function deepClone<T>(obj: T): T {\n if (Array.isArray(obj)) {\n const copy: any[] = [];\n for (let i = 0; i < obj.length; i++) {\n copy[i] = deepClone(obj[i]) as unknown;\n }\n return copy as T;\n } else if (isPlainObject(obj)) {\n const copy: Record<string, any> = {};\n Object.keys(obj).forEach((k) => {\n copy[k] = deepClone(obj[k]);\n });\n return copy as T;\n } else {\n return obj;\n }\n}\n\nexport function shallowClone<T>(obj: T): T {\n if (isNil(obj)) return obj;\n if (Array.isArray(obj)) return obj.slice() as T;\n if (isPlainObject(obj)) return Object.assign({}, obj) as T;\n if (obj instanceof Map) return new Map(obj) as T;\n if (obj instanceof Set) return new Set(obj) as T;\n throw Error(`Not implemented clone strategy for ${JSON.stringify(obj)}`);\n}\n\nexport function shallowDiff<T>(to: T, from: T): Partial<T> {\n const diff: Partial<T> = {};\n\n for (const key in from) {\n if (from[key] !== to[key]) {\n diff[key] = to[key];\n }\n }\n\n return diff;\n}\n\nexport function bindMethods<O extends Record<string, unknown>>(obj: O) {\n Object.entries(obj).forEach(([key, m]) => {\n if (m instanceof Function) {\n //\n obj[key as keyof O] = m.bind(obj);\n }\n });\n\n return obj;\n}\n\nexport function setProp<O, K extends keyof O>(obj: O, key: K, value: O[K]) {\n obj[key] = value;\n return obj;\n}\n\nexport function getProp<O, K extends keyof O>(obj: O, key: K): O[K] {\n return obj[key];\n}\n\nexport function shiftProp<O, K extends keyof O>(obj: O, key: K): [O[K], Omit<O, K>] {\n obj = { ...obj };\n const val = obj[key];\n delete obj[key];\n return [val, obj];\n}\n\nexport function pick<T, K extends keyof T>(obj: T, ...keys: K[]): Pick<T, K> {\n return Object.assign({}, ...keys.map((k) => ({ [k]: obj[k] }))) as Pick<T, K>;\n}\n\nexport function pickValues<T, K extends keyof T>(obj: T, ...keys: K[]) {\n return keys.map((k) => obj[k]);\n}\n\nexport function omit<T, K extends keyof T>(obj: T, ...keys: K[]): Omit<T, K> {\n const o = Object.assign({}, obj) as PartialBy<T, K>;\n keys.forEach((k) => delete o[k]);\n return o;\n}\n\n/**\n * Performs a deep patch of the target object or array using the source object or array.\n *\n * This function recursively merges properties of the source into the target:\n * - If a property in both target and source is a plain object, they are recursively merged.\n * - If a property in both target and source is an array of the same length, the arrays are recursively patched element by element.\n * - Otherwise, the property value in the target is replaced by the corresponding value from the source.\n *\n * The patch is applied in-place to the target object or array, which is also returned for convenience.\n *\n * @typeParam T - The type of the target and source, which must be either a plain object or an array.\n * @param target - The target object or array to be patched. This object/array is modified in-place.\n * @param source - The source object or array providing the new values for the patch.\n * @returns The modified target object or array.\n *\n * @example\n * ```typescript\n * const target = { a: { b: 1 }, c: [1, 2] };\n * const source = { a: { b: 2 }, c: [3, 4], d: 5 };\n * const result = deepPatch(target, source);\n * // target is now: { a: { b: 2 }, c: [3, 4], d: 5 }\n * // result is the same reference as target.\n *\n * const targetArray = [{ a: 1 }, { b: 2 }];\n * const sourceArray = [{ a: 2 }, { b: 3 }];\n * const resultArray = deepPatch(targetArray, sourceArray);\n * // targetArray is now: [{ a: 2 }, { b: 3 }]\n * ```\n */\nexport function deepPatch<T extends PlainObject | unknown[]>(target: T, source: T) {\n const sk = new Set<keyof T>([\n ...(Object.keys(target) as (keyof T)[]),\n ...(Object.keys(source) as (keyof T)[]),\n ]);\n\n sk.forEach((key) => {\n const t = target[key];\n const s = source[key];\n if (isPlainObject(t) && isPlainObject(s)) {\n deepPatch(t, s);\n } else if (isArray(t) && isArray(s) && t.length === s.length) {\n deepPatch(t, s);\n } else {\n target[key] = s;\n }\n });\n\n return target;\n}\n"],"mappings":";AAQA,IAAa,IAAU,MAAM;AAG7B,SAAgB,EAAkD,GAA4B;AAC5F,QAAuB,OAAO,KAAQ,cAA/B;;AAGT,SAAgB,EAAS,GAAiC;AACxD,QAAO,OAAO,KAAU,cAAY;;AAsBtC,SAAgB,EAAc,GAAsC;AAClE,KAAI,CAAC,EAAS,EAAM,CAClB,QAAO;CAGT,IAAM,IAAqB,OAAO,eAAe,EAAM;AAEvD,QACE,MAAc,QACd,MAAc,OAAO,aACrB,OAAO,eAAe,EAAU,KAAK;;AAezC,SAAS,EAAgB,GAAkB;AACzC,QAAO,OAAO,OAAO,EAAI,CAAC,QAAQ,GAAgB,MACzC,MAAM,KAAA,IAAyB,IAAb,IAAS,GACjC,EAAE;;AAyBP,SAAgB,EAAY,GAAY,GAAqB;AAC3D,KAAI,EAAE,EAAe,EAAE,IAAI,EAAe,EAAE,EAC1C,QAAO,MAAM;AAGf,KAAI,EAAQ,EAAE,IAAI,EAAQ,EAAE,CAIxB,QAHE,EAAE,WAAW,EAAE,SAGV,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,OAAO,MAAM,EAAY,EAAE,IAAI,EAAE,GAAG,CAAC,GAFnD;AAMX,KAAI,EAAc,EAAE,IAAI,EAAc,EAAE,CAKtC,QAJI,EAAgB,EAAE,KAAK,EAAgB,EAAE,GAItC,OAAO,KAAK,EAAE,CAAC,OAAO,MAAM,EAAY,EAAE,IAAI,EAAE,GAAG,CAAC,GAHlD;AAMX,OAAM,MAAM,oBAAoB,OAAO,EAAE,CAAC,SAAS,OAAO,EAAE,GAAG;;AASjE,SAAgB,EAAa,GAAW;AACtC,KAAI,MAAM,QAAQ,EAAI,EAAE;EACtB,IAAM,IAAc,EAAE;AACtB,OAAK,IAAI,IAAI,GAAG,IAAI,EAAI,QAAQ,IAC9B,GAAK,KAAK,EAAU,EAAI,GAAG;AAE7B,SAAO;YACE,EAAc,EAAI,EAAE;EAC7B,IAAM,IAA4B,EAAE;AAIpC,SAHA,OAAO,KAAK,EAAI,CAAC,SAAS,MAAM;AAC9B,KAAK,KAAK,EAAU,EAAI,GAAG;IAC3B,EACK;OAEP,QAAO"}
1
+ {"version":3,"file":"objects.js","names":[],"sources":["../../../../../../../lib/util/helpers/src/objects.ts"],"sourcesContent":["/**/\n\nimport type { PartialBy, PlainObject, UnionToIntersection } from \"./types\";\nimport { isNil } from \"./utils\";\n\n/**\n * Alias to Array.isArray\n */\nexport const isArray = Array.isArray;\n\n//\nexport function isNonPrimitive<V, T extends PlainObject<V> | V[]>(obj: T | unknown): obj is T {\n return obj !== null && typeof obj === \"object\";\n}\n\nexport function isObject(value: unknown): value is object {\n return typeof value === \"object\" && value !== null;\n}\n\n/**\n * Checks if the given value is a plain object.\n *\n * A plain object is defined as an object created by the `{}` literal,\n * an object created with `Object.create(null)`, or an object with a\n * prototype that resolves to `Object.prototype`.\n *\n * @param value - The value to check.\n * @returns `true` if the value is a plain object, otherwise `false`.\n *\n * @example\n * ```typescript\n * isPlainObject({}); // true\n * isPlainObject(Object.create(null)); // true\n * isPlainObject(new Date()); // false\n * isPlainObject(null); // false\n * isPlainObject([]); // false\n * ```\n */\nexport function isPlainObject(value: unknown): value is PlainObject {\n if (!isObject(value)) {\n return false;\n }\n\n const prototype: unknown = Object.getPrototypeOf(value);\n\n return (\n prototype === null ||\n prototype === Object.prototype ||\n Object.getPrototypeOf(prototype) === null\n );\n}\n\nexport function map<U, T extends Record<string, unknown>>(\n obj: T,\n callback: (curr: T[keyof T], key: keyof T) => U,\n) {\n const keys = Object.keys(obj) as Array<keyof T>;\n\n return keys.map((key: keyof T) => {\n return callback(obj[key], key);\n });\n}\n\nfunction definedKeysSize(obj: PlainObject) {\n return Object.values(obj).reduce((length: number, v) => {\n return v !== undefined ? length + 1 : length;\n }, 0);\n}\n\n/**\n * Performs a deep equality check between two values, `a` and `b`, to determine if they are JSON-equivalent.\n *\n * JSON equivalence means that the two values are strictly equal in structure and content, including arrays and plain objects.\n * Non-primitive values that are neither arrays nor plain objects will throw an error.\n *\n * @param a - The first value to compare.\n * @param b - The second value to compare.\n * @returns `true` if the values are JSON-equivalent, otherwise `false`.\n *\n * @throws If the values are non-primitive and not arrays or plain objects.\n *\n * @example\n * ```typescript\n * isJsonEqual(1, 1); // true\n * isJsonEqual({ a: 1 }, { a: 1 }); // true\n * isJsonEqual([1, 2], [1, 2]); // true\n * isJsonEqual({ a: 1 }, { a: 2 }); // false\n * isJsonEqual([1, 2], [2, 1]); // false\n * isJsonEqual(new Date(), new Date()); // Error\n * ```\n */\nexport function isJsonEqual(a: unknown, b: unknown): boolean {\n if (!(isNonPrimitive(a) && isNonPrimitive(b))) {\n return a === b;\n }\n\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) {\n return false;\n } else {\n return [...a.keys()].every((k) => isJsonEqual(a[k], b[k]));\n }\n }\n\n if (isPlainObject(a) && isPlainObject(b)) {\n if (definedKeysSize(a) !== definedKeysSize(b)) {\n return false;\n }\n\n return Object.keys(a).every((k) => isJsonEqual(a[k], b[k]));\n }\n\n throw Error(`Cannot compare a ${String(a)} and b ${String(b)}`);\n}\n\n/**\n * Alias to isJsonEqual function\n * @deprecated change to isJsonEqual\n */\nexport const deepEqual = isJsonEqual;\n\nexport function deepClone<T>(obj: T): T {\n if (Array.isArray(obj)) {\n const copy: any[] = [];\n for (let i = 0; i < obj.length; i++) {\n copy[i] = deepClone(obj[i]) as unknown;\n }\n return copy as T;\n } else if (isPlainObject(obj)) {\n const copy: Record<string, any> = {};\n Object.keys(obj).forEach((k) => {\n copy[k] = deepClone(obj[k]);\n });\n return copy as T;\n } else {\n return obj;\n }\n}\n\nexport function shallowClone<T>(obj: T): T {\n if (isNil(obj)) return obj;\n if (Array.isArray(obj)) return obj.slice() as T;\n if (isPlainObject(obj)) return Object.assign({}, obj) as T;\n if (obj instanceof Map) return new Map(obj) as T;\n if (obj instanceof Set) return new Set(obj) as T;\n throw Error(`Not implemented clone strategy for ${JSON.stringify(obj)}`);\n}\n\nexport function shallowDiff<T>(to: T, from: T): Partial<T> {\n const diff: Partial<T> = {};\n\n for (const key in from) {\n if (from[key] !== to[key]) {\n diff[key] = to[key];\n }\n }\n\n return diff;\n}\n\nexport function bindMethods<O extends Record<string, unknown>>(obj: O) {\n Object.entries(obj).forEach(([key, m]) => {\n if (m instanceof Function) {\n //\n obj[key as keyof O] = m.bind(obj);\n }\n });\n\n return obj;\n}\n\nexport function setProp<O, K extends keyof O>(obj: O, key: K, value: O[K]) {\n obj[key] = value;\n return obj;\n}\n\nexport function getProp<O, K extends keyof O>(obj: O, key: K): O[K] {\n return obj[key];\n}\n\nexport function shiftProp<O, K extends keyof O>(obj: O, key: K): [O[K], Omit<O, K>] {\n obj = { ...obj };\n const val = obj[key];\n delete obj[key];\n return [val, obj];\n}\n\nexport function pick<T, K extends keyof T>(obj: T, ...keys: K[]): Pick<T, K> {\n return Object.assign({}, ...keys.map((k) => ({ [k]: obj[k] }))) as Pick<T, K>;\n}\n\nexport function pickValues<T, K extends keyof T>(obj: T, ...keys: K[]) {\n return keys.map((k) => obj[k]);\n}\n\nexport function omit<T, K extends keyof T>(obj: T, ...keys: K[]): Omit<T, K> {\n const o = Object.assign({}, obj) as PartialBy<T, K>;\n keys.forEach((k) => delete o[k]);\n return o;\n}\n\n/**\n * Performs a deep patch of the target object or array using the source object or array.\n *\n * This function recursively merges properties of the source into the target:\n * - If a property in both target and source is a plain object, they are recursively merged.\n * - If a property in both target and source is an array of the same length, the arrays are recursively patched element by element.\n * - Otherwise, the property value in the target is replaced by the corresponding value from the source.\n *\n * The patch is applied in-place to the target object or array, which is also returned for convenience.\n *\n * @typeParam T - The type of the target and source, which must be either a plain object or an array.\n * @param target - The target object or array to be patched. This object/array is modified in-place.\n * @param source - The source object or array providing the new values for the patch.\n * @returns The modified target object or array.\n *\n * @example\n * ```typescript\n * const target = { a: { b: 1 }, c: [1, 2] };\n * const source = { a: { b: 2 }, c: [3, 4], d: 5 };\n * const result = deepPatch(target, source);\n * // target is now: { a: { b: 2 }, c: [3, 4], d: 5 }\n * // result is the same reference as target.\n *\n * const targetArray = [{ a: 1 }, { b: 2 }];\n * const sourceArray = [{ a: 2 }, { b: 3 }];\n * const resultArray = deepPatch(targetArray, sourceArray);\n * // targetArray is now: [{ a: 2 }, { b: 3 }]\n * ```\n */\nexport function deepPatch<T extends PlainObject | unknown[]>(target: T, source: T) {\n const sk = new Set<keyof T>([\n ...(Object.keys(target) as (keyof T)[]),\n ...(Object.keys(source) as (keyof T)[]),\n ]);\n\n sk.forEach((key) => {\n const t = target[key];\n const s = source[key];\n if (isPlainObject(t) && isPlainObject(s)) {\n deepPatch(t, s);\n } else if (isArray(t) && isArray(s) && t.length === s.length) {\n deepPatch(t, s);\n } else {\n target[key] = s;\n }\n });\n\n return target;\n}\n\n/**\n * Reads a property from a union-typed object where the key may exist only on some members of the union.\n *\n * `K` is constrained to keys of the union's intersection, so any key present on at least one union\n * member is accepted. The return type resolves to `T[K]` when `K` is a key of `T`, otherwise `undefined`\n * — matching the runtime behavior of reading a missing property.\n *\n * @param obj - source object (may be a union of shapes)\n * @param prop - property name, must be a key of at least one union member\n * @returns the property value if present, otherwise `undefined`\n */\nexport function getField<T extends object, K extends keyof UnionToIntersection<T>>(\n obj: T,\n prop: K,\n): K extends keyof T ? T[K] : undefined {\n // @ts-expect-error - we want this to be a compile-time error when prop is not in T, but at runtime we just return undefined\n return obj[prop];\n}\n"],"mappings":";AAQA,IAAa,IAAU,MAAM;AAG7B,SAAgB,EAAkD,GAA4B;AAC5F,QAAuB,OAAO,KAAQ,cAA/B;;AAGT,SAAgB,EAAS,GAAiC;AACxD,QAAO,OAAO,KAAU,cAAY;;AAsBtC,SAAgB,EAAc,GAAsC;AAClE,KAAI,CAAC,EAAS,EAAM,CAClB,QAAO;CAGT,IAAM,IAAqB,OAAO,eAAe,EAAM;AAEvD,QACE,MAAc,QACd,MAAc,OAAO,aACrB,OAAO,eAAe,EAAU,KAAK;;AAezC,SAAS,EAAgB,GAAkB;AACzC,QAAO,OAAO,OAAO,EAAI,CAAC,QAAQ,GAAgB,MACzC,MAAM,KAAA,IAAyB,IAAb,IAAS,GACjC,EAAE;;AAyBP,SAAgB,EAAY,GAAY,GAAqB;AAC3D,KAAI,EAAE,EAAe,EAAE,IAAI,EAAe,EAAE,EAC1C,QAAO,MAAM;AAGf,KAAI,EAAQ,EAAE,IAAI,EAAQ,EAAE,CAIxB,QAHE,EAAE,WAAW,EAAE,SAGV,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,OAAO,MAAM,EAAY,EAAE,IAAI,EAAE,GAAG,CAAC,GAFnD;AAMX,KAAI,EAAc,EAAE,IAAI,EAAc,EAAE,CAKtC,QAJI,EAAgB,EAAE,KAAK,EAAgB,EAAE,GAItC,OAAO,KAAK,EAAE,CAAC,OAAO,MAAM,EAAY,EAAE,IAAI,EAAE,GAAG,CAAC,GAHlD;AAMX,OAAM,MAAM,oBAAoB,OAAO,EAAE,CAAC,SAAS,OAAO,EAAE,GAAG;;AASjE,SAAgB,EAAa,GAAW;AACtC,KAAI,MAAM,QAAQ,EAAI,EAAE;EACtB,IAAM,IAAc,EAAE;AACtB,OAAK,IAAI,IAAI,GAAG,IAAI,EAAI,QAAQ,IAC9B,GAAK,KAAK,EAAU,EAAI,GAAG;AAE7B,SAAO;YACE,EAAc,EAAI,EAAE;EAC7B,IAAM,IAA4B,EAAE;AAIpC,SAHA,OAAO,KAAK,EAAI,CAAC,SAAS,MAAM;AAC9B,KAAK,KAAK,EAAU,EAAI,GAAG;IAC3B,EACK;OAEP,QAAO;;AA+HX,SAAgB,EACd,GACA,GACsC;AAEtC,QAAO,EAAI"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platforma-sdk/ui-vue",
3
- "version": "1.64.0",
3
+ "version": "1.65.3",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "exports": {
@@ -22,13 +22,14 @@
22
22
  "d3-format": "^3.1.0",
23
23
  "es-toolkit": "^1.39.10",
24
24
  "fast-json-patch": "^3.1.1",
25
+ "immer": "11.1.4",
25
26
  "lru-cache": "^11.2.2",
26
27
  "vue": "^3.5.24",
27
28
  "zod": "~3.25.76",
28
29
  "@milaboratories/pf-spec-driver": "1.2.5",
29
- "@milaboratories/uikit": "2.11.9",
30
+ "@milaboratories/uikit": "2.12.1",
30
31
  "@milaboratories/pl-model-common": "1.31.2",
31
- "@platforma-sdk/model": "1.64.0"
32
+ "@platforma-sdk/model": "1.65.3"
32
33
  },
33
34
  "devDependencies": {
34
35
  "@faker-js/faker": "^9.2.0",
@@ -42,10 +43,10 @@
42
43
  "typescript": "~5.9.3",
43
44
  "vite": "^8.0.6",
44
45
  "vitest": "^4.1.3",
45
- "@milaboratories/helpers": "1.14.1",
46
- "@milaboratories/ts-builder": "1.3.1",
46
+ "@milaboratories/build-configs": "2.0.0",
47
+ "@milaboratories/ts-builder": "1.3.2",
47
48
  "@milaboratories/ts-configs": "1.2.3",
48
- "@milaboratories/build-configs": "2.0.0"
49
+ "@milaboratories/helpers": "1.14.1"
49
50
  },
50
51
  "scripts": {
51
52
  "dev": "ts-builder serve --target browser-lib",