@platforma-sdk/model 1.65.10 → 1.67.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 (151) hide show
  1. package/dist/block_model.cjs +8 -11
  2. package/dist/block_model.cjs.map +1 -1
  3. package/dist/block_model.d.ts.map +1 -1
  4. package/dist/block_model.js +8 -10
  5. package/dist/block_model.js.map +1 -1
  6. package/dist/block_state_util.cjs +2 -1
  7. package/dist/block_state_util.cjs.map +1 -1
  8. package/dist/block_state_util.js +2 -1
  9. package/dist/block_state_util.js.map +1 -1
  10. package/dist/columns/column_collection_builder.cjs +62 -75
  11. package/dist/columns/column_collection_builder.cjs.map +1 -1
  12. package/dist/columns/column_collection_builder.d.ts +17 -23
  13. package/dist/columns/column_collection_builder.d.ts.map +1 -1
  14. package/dist/columns/column_collection_builder.js +63 -76
  15. package/dist/columns/column_collection_builder.js.map +1 -1
  16. package/dist/columns/column_selector.cjs.map +1 -1
  17. package/dist/columns/column_selector.d.ts +1 -1
  18. package/dist/columns/column_selector.js.map +1 -1
  19. package/dist/columns/column_snapshot.cjs.map +1 -1
  20. package/dist/columns/column_snapshot.d.ts +4 -4
  21. package/dist/columns/column_snapshot.d.ts.map +1 -1
  22. package/dist/columns/column_snapshot.js.map +1 -1
  23. package/dist/columns/ctx_column_sources.cjs.map +1 -1
  24. package/dist/columns/ctx_column_sources.d.ts +1 -1
  25. package/dist/columns/ctx_column_sources.d.ts.map +1 -1
  26. package/dist/columns/ctx_column_sources.js.map +1 -1
  27. package/dist/columns/index.cjs +2 -2
  28. package/dist/columns/index.d.ts +1 -1
  29. package/dist/columns/index.js +2 -2
  30. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs +2 -2
  31. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs.map +1 -1
  32. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js +2 -2
  33. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js.map +1 -1
  34. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs +17 -18
  35. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs.map +1 -1
  36. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js +17 -18
  37. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js.map +1 -1
  38. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs +99 -91
  39. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -1
  40. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +17 -17
  41. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts.map +1 -1
  42. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js +102 -94
  43. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -1
  44. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs +32 -23
  45. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs.map +1 -1
  46. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts +6 -6
  47. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts.map +1 -1
  48. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js +33 -24
  49. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js.map +1 -1
  50. package/dist/components/PlDataTable/createPlDataTable/index.cjs.map +1 -1
  51. package/dist/components/PlDataTable/createPlDataTable/index.d.ts +2 -3
  52. package/dist/components/PlDataTable/createPlDataTable/index.d.ts.map +1 -1
  53. package/dist/components/PlDataTable/createPlDataTable/index.js.map +1 -1
  54. package/dist/components/PlDataTable/createPlDataTable/utils.cjs +133 -16
  55. package/dist/components/PlDataTable/createPlDataTable/utils.cjs.map +1 -1
  56. package/dist/components/PlDataTable/createPlDataTable/utils.d.ts +8 -6
  57. package/dist/components/PlDataTable/createPlDataTable/utils.d.ts.map +1 -1
  58. package/dist/components/PlDataTable/createPlDataTable/utils.js +130 -17
  59. package/dist/components/PlDataTable/createPlDataTable/utils.js.map +1 -1
  60. package/dist/components/PlDataTable/labels.cjs +1 -2
  61. package/dist/components/PlDataTable/labels.cjs.map +1 -1
  62. package/dist/components/PlDataTable/labels.js +1 -2
  63. package/dist/components/PlDataTable/labels.js.map +1 -1
  64. package/dist/components/PlDatasetSelector/build_dataset_options.cjs +41 -0
  65. package/dist/components/PlDatasetSelector/build_dataset_options.cjs.map +1 -0
  66. package/dist/components/PlDatasetSelector/build_dataset_options.d.ts +19 -0
  67. package/dist/components/PlDatasetSelector/build_dataset_options.d.ts.map +1 -0
  68. package/dist/components/PlDatasetSelector/build_dataset_options.js +41 -0
  69. package/dist/components/PlDatasetSelector/build_dataset_options.js.map +1 -0
  70. package/dist/components/PlDatasetSelector/filter_discovery.cjs +60 -0
  71. package/dist/components/PlDatasetSelector/filter_discovery.cjs.map +1 -0
  72. package/dist/components/PlDatasetSelector/filter_discovery.d.ts +31 -0
  73. package/dist/components/PlDatasetSelector/filter_discovery.d.ts.map +1 -0
  74. package/dist/components/PlDatasetSelector/filter_discovery.js +56 -0
  75. package/dist/components/PlDatasetSelector/filter_discovery.js.map +1 -0
  76. package/dist/components/PlDatasetSelector/index.cjs +2 -0
  77. package/dist/components/PlDatasetSelector/index.d.ts +2 -0
  78. package/dist/components/PlDatasetSelector/index.js +2 -0
  79. package/dist/components/index.cjs +3 -0
  80. package/dist/components/index.d.ts +2 -0
  81. package/dist/components/index.js +3 -0
  82. package/dist/filters/distill.cjs +73 -30
  83. package/dist/filters/distill.cjs.map +1 -1
  84. package/dist/filters/distill.d.ts.map +1 -1
  85. package/dist/filters/distill.js +73 -30
  86. package/dist/filters/distill.js.map +1 -1
  87. package/dist/index.cjs +29 -19
  88. package/dist/index.d.ts +10 -6
  89. package/dist/index.js +12 -8
  90. package/dist/labels/derive_distinct_tooltips.cjs +85 -0
  91. package/dist/labels/derive_distinct_tooltips.cjs.map +1 -0
  92. package/dist/labels/derive_distinct_tooltips.d.ts +17 -0
  93. package/dist/labels/derive_distinct_tooltips.d.ts.map +1 -0
  94. package/dist/labels/derive_distinct_tooltips.js +84 -0
  95. package/dist/labels/derive_distinct_tooltips.js.map +1 -0
  96. package/dist/labels/index.cjs +1 -0
  97. package/dist/labels/index.d.ts +2 -1
  98. package/dist/labels/index.js +1 -0
  99. package/dist/package.cjs +1 -1
  100. package/dist/package.js +1 -1
  101. package/dist/render/api.cjs +8 -13
  102. package/dist/render/api.cjs.map +1 -1
  103. package/dist/render/api.d.ts +8 -11
  104. package/dist/render/api.d.ts.map +1 -1
  105. package/dist/render/api.js +8 -13
  106. package/dist/render/api.js.map +1 -1
  107. package/dist/services/get_services.cjs +19 -0
  108. package/dist/services/get_services.cjs.map +1 -0
  109. package/dist/services/get_services.d.ts +7 -0
  110. package/dist/services/get_services.d.ts.map +1 -0
  111. package/dist/services/get_services.js +19 -0
  112. package/dist/services/get_services.js.map +1 -0
  113. package/dist/services/index.cjs +1 -0
  114. package/dist/services/index.d.ts +2 -1
  115. package/dist/services/index.js +1 -0
  116. package/dist/services/service_bridge.cjs +4 -4
  117. package/dist/services/service_bridge.cjs.map +1 -1
  118. package/dist/services/service_bridge.d.ts +4 -4
  119. package/dist/services/service_bridge.d.ts.map +1 -1
  120. package/dist/services/service_bridge.js +4 -4
  121. package/dist/services/service_bridge.js.map +1 -1
  122. package/package.json +6 -6
  123. package/src/block_model.ts +8 -11
  124. package/src/block_state_util.ts +2 -1
  125. package/src/columns/column_collection_builder.test.ts +75 -30
  126. package/src/columns/column_collection_builder.ts +96 -133
  127. package/src/columns/column_selector.ts +1 -1
  128. package/src/columns/column_snapshot.ts +7 -4
  129. package/src/columns/ctx_column_sources.ts +1 -3
  130. package/src/components/PlDataTable/createPlDataTable/createPTableDefV2.ts +2 -2
  131. package/src/components/PlDataTable/createPlDataTable/createPTableDefV3.ts +44 -21
  132. package/src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts +202 -218
  133. package/src/components/PlDataTable/createPlDataTable/discoverColumns.ts +69 -56
  134. package/src/components/PlDataTable/createPlDataTable/index.ts +6 -7
  135. package/src/components/PlDataTable/createPlDataTable/utils.test.ts +97 -1
  136. package/src/components/PlDataTable/createPlDataTable/utils.ts +190 -35
  137. package/src/components/PlDataTable/labels.ts +3 -7
  138. package/src/components/PlDatasetSelector/build_dataset_options.ts +56 -0
  139. package/src/components/PlDatasetSelector/filter_discovery.test.ts +156 -0
  140. package/src/components/PlDatasetSelector/filter_discovery.ts +77 -0
  141. package/src/components/PlDatasetSelector/index.ts +2 -0
  142. package/src/components/index.ts +1 -0
  143. package/src/filters/distill.test.ts +91 -0
  144. package/src/filters/distill.ts +102 -46
  145. package/src/labels/derive_distinct_tooltips.test.ts +233 -0
  146. package/src/labels/derive_distinct_tooltips.ts +130 -0
  147. package/src/labels/index.ts +1 -0
  148. package/src/render/api.ts +15 -50
  149. package/src/services/get_services.ts +28 -0
  150. package/src/services/index.ts +1 -0
  151. package/src/services/service_bridge.ts +5 -5
@@ -0,0 +1,56 @@
1
+ import { deriveDistinctLabels } from "../../labels/derive_distinct_labels.js";
2
+ import { Annotation } from "@milaboratories/pl-model-common";
3
+ import canonicalize from "canonicalize";
4
+ //#region src/components/PlDatasetSelector/filter_discovery.ts
5
+ /**
6
+ * Matches columns annotated `pl7.app/isSubset: "true"` whose axes ⊆ anchor axes.
7
+ *
8
+ * The axes-subset constraint is enforced by `mode: "enrichment"`, which sets
9
+ * `allowFloatingHitAxes: false` — every axis of the matched column must be
10
+ * present in the anchor's axes. See `matchingModeToConstraints()` in
11
+ * `column_collection_builder.ts`.
12
+ */
13
+ function findFilterColumns(collection) {
14
+ return collection.findColumns({
15
+ mode: "enrichment",
16
+ include: { annotations: { [Annotation.IsSubset]: "true" } }
17
+ });
18
+ }
19
+ /**
20
+ * Derive labeled options from filter column matches, for use in DatasetOption.filters.
21
+ *
22
+ * @param matches - from findFilterColumns()
23
+ * @param refsByObjectId - from {@link buildRefMap}
24
+ * @param labelOptions - forwarded to deriveDistinctLabels()
25
+ */
26
+ function filterMatchesToOptions(matches, refsByObjectId, labelOptions) {
27
+ if (matches.length === 0) return [];
28
+ const flattened = matches.flatMap((m) => m.variants.map((v) => ({
29
+ match: m,
30
+ variant: v
31
+ })));
32
+ const labels = deriveDistinctLabels(flattened.map(({ match, variant }) => ({
33
+ spec: match.column.spec,
34
+ linkerPath: variant.path.map((p) => ({ spec: p.linker.spec }))
35
+ })), labelOptions);
36
+ return flattened.map(({ match }, i) => {
37
+ const ref = refsByObjectId.get(match.column.id);
38
+ if (ref === void 0) throw new Error(`no PlRef found for filter column ${match.column.spec.name} (id: ${match.column.id})`);
39
+ return {
40
+ ref,
41
+ label: labels[i]
42
+ };
43
+ });
44
+ }
45
+ /**
46
+ * Usage: `buildRefMap(ctx.resultPool.getSpecs().entries)`
47
+ */
48
+ function buildRefMap(entries) {
49
+ const map = /* @__PURE__ */ new Map();
50
+ for (const entry of entries) map.set(canonicalize(entry.ref), entry.ref);
51
+ return map;
52
+ }
53
+ //#endregion
54
+ export { buildRefMap, filterMatchesToOptions, findFilterColumns };
55
+
56
+ //# sourceMappingURL=filter_discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter_discovery.js","names":[],"sources":["../../../src/components/PlDatasetSelector/filter_discovery.ts"],"sourcesContent":["import { Annotation } from \"@milaboratories/pl-model-common\";\nimport type { Option, PlRef, PObjectId } from \"@milaboratories/pl-model-common\";\nimport canonicalize from \"canonicalize\";\nimport type {\n AnchoredColumnCollection,\n ColumnMatch,\n} from \"../../columns/column_collection_builder\";\nimport {\n deriveDistinctLabels,\n type DeriveLabelsOptions,\n type Entry,\n} from \"../../labels/derive_distinct_labels\";\n\n/**\n * Matches columns annotated `pl7.app/isSubset: \"true\"` whose axes ⊆ anchor axes.\n *\n * The axes-subset constraint is enforced by `mode: \"enrichment\"`, which sets\n * `allowFloatingHitAxes: false` — every axis of the matched column must be\n * present in the anchor's axes. See `matchingModeToConstraints()` in\n * `column_collection_builder.ts`.\n */\nexport function findFilterColumns(collection: AnchoredColumnCollection): ColumnMatch[] {\n return collection.findColumns({\n mode: \"enrichment\",\n include: {\n annotations: { [Annotation.IsSubset]: \"true\" },\n },\n });\n}\n\n/**\n * Derive labeled options from filter column matches, for use in DatasetOption.filters.\n *\n * @param matches - from findFilterColumns()\n * @param refsByObjectId - from {@link buildRefMap}\n * @param labelOptions - forwarded to deriveDistinctLabels()\n */\nexport function filterMatchesToOptions(\n matches: ColumnMatch[],\n refsByObjectId: ReadonlyMap<PObjectId, PlRef>,\n labelOptions?: DeriveLabelsOptions,\n): Option[] {\n if (matches.length === 0) return [];\n\n // Each ColumnMatch can be reached via multiple variants (different linker\n // paths / qualifications). We emit one Option per variant so the user can\n // pick a specific path — `deriveDistinctLabels` disambiguates labels by\n // path.\n const flattened = matches.flatMap((m) => m.variants.map((v) => ({ match: m, variant: v })));\n\n const entries: Entry[] = flattened.map(({ match, variant }) => ({\n spec: match.column.spec,\n linkerPath: variant.path.map((p) => ({ spec: p.linker.spec })),\n }));\n\n const labels = deriveDistinctLabels(entries, labelOptions);\n\n return flattened.map(({ match }, i) => {\n const ref = refsByObjectId.get(match.column.id);\n if (ref === undefined)\n throw new Error(\n `no PlRef found for filter column ${match.column.spec.name} (id: ${match.column.id})`,\n );\n return { ref, label: labels[i] };\n });\n}\n\n/**\n * Usage: `buildRefMap(ctx.resultPool.getSpecs().entries)`\n */\nexport function buildRefMap(entries: readonly { readonly ref: PlRef }[]): Map<PObjectId, PlRef> {\n const map = new Map<PObjectId, PlRef>();\n for (const entry of entries) {\n map.set(canonicalize(entry.ref)! as PObjectId, entry.ref);\n }\n return map;\n}\n"],"mappings":";;;;;;;;;;;;AAqBA,SAAgB,kBAAkB,YAAqD;AACrF,QAAO,WAAW,YAAY;EAC5B,MAAM;EACN,SAAS,EACP,aAAa,GAAG,WAAW,WAAW,QAAQ,EAC/C;EACF,CAAC;;;;;;;;;AAUJ,SAAgB,uBACd,SACA,gBACA,cACU;AACV,KAAI,QAAQ,WAAW,EAAG,QAAO,EAAE;CAMnC,MAAM,YAAY,QAAQ,SAAS,MAAM,EAAE,SAAS,KAAK,OAAO;EAAE,OAAO;EAAG,SAAS;EAAG,EAAE,CAAC;CAO3F,MAAM,SAAS,qBALU,UAAU,KAAK,EAAE,OAAO,eAAe;EAC9D,MAAM,MAAM,OAAO;EACnB,YAAY,QAAQ,KAAK,KAAK,OAAO,EAAE,MAAM,EAAE,OAAO,MAAM,EAAE;EAC/D,EAAE,EAE0C,aAAa;AAE1D,QAAO,UAAU,KAAK,EAAE,SAAS,MAAM;EACrC,MAAM,MAAM,eAAe,IAAI,MAAM,OAAO,GAAG;AAC/C,MAAI,QAAQ,KAAA,EACV,OAAM,IAAI,MACR,oCAAoC,MAAM,OAAO,KAAK,KAAK,QAAQ,MAAM,OAAO,GAAG,GACpF;AACH,SAAO;GAAE;GAAK,OAAO,OAAO;GAAI;GAChC;;;;;AAMJ,SAAgB,YAAY,SAAoE;CAC9F,MAAM,sBAAM,IAAI,KAAuB;AACvC,MAAK,MAAM,SAAS,QAClB,KAAI,IAAI,aAAa,MAAM,IAAI,EAAgB,MAAM,IAAI;AAE3D,QAAO"}
@@ -0,0 +1,2 @@
1
+ require("./filter_discovery.cjs");
2
+ require("./build_dataset_options.cjs");
@@ -0,0 +1,2 @@
1
+ import { buildRefMap, filterMatchesToOptions, findFilterColumns } from "./filter_discovery.js";
2
+ import { BuildDatasetOptions, buildDatasetOptions } from "./build_dataset_options.js";
@@ -0,0 +1,2 @@
1
+ import "./filter_discovery.js";
2
+ import "./build_dataset_options.js";
@@ -1,6 +1,9 @@
1
1
  require("../pframe_utils/axes.cjs");
2
2
  require("./PFrameForGraphs.cjs");
3
3
  require("./PlAnnotations/filters_ui.cjs");
4
+ require("./PlDatasetSelector/filter_discovery.cjs");
5
+ require("./PlDatasetSelector/build_dataset_options.cjs");
6
+ require("./PlDatasetSelector/index.cjs");
4
7
  require("./PlDataTable/state-migration.cjs");
5
8
  require("./PlDataTable/createPlDataTableSheet.cjs");
6
9
  require("./PlDataTable/createPlDataTable/utils.cjs");
@@ -2,6 +2,8 @@ import { AxesVault, enrichCompatible, getAvailableWithLinkersAxes } from "../pfr
2
2
  import { createPFrameForGraphs, isHiddenFromGraphColumn, isHiddenFromUIColumn } from "./PFrameForGraphs.js";
3
3
  import { AndFilter, AnnotationFilter, AnnotationMode, AnnotationScript, AnnotationScript2, AnnotationStep, IsNA, Log10, NotFilter, NumericalComparisonFilter, OrFilter, PatternFilter, PatternPredicate, PatternPredicateContainSubsequence, PatternPredicateEquals, SortedCumulativeSum, TransformedColumn, ValueRank } from "./PlAnnotations/filter.js";
4
4
  import { AnnotationScriptUi, AnnotationStepUi, AnyForm, FilterUi, FilterUiOfType, FilterUiType, FormField, TypeField, TypeFieldRecord, TypeForm, TypeToLiteral, compileAnnotationScript, compileFilter, compileFilters, unreachable } from "./PlAnnotations/filters_ui.js";
5
+ import { buildRefMap, filterMatchesToOptions, findFilterColumns } from "./PlDatasetSelector/filter_discovery.js";
6
+ import { BuildDatasetOptions, buildDatasetOptions } from "./PlDatasetSelector/build_dataset_options.js";
5
7
  import { PTableParamsV2, PlDataTableFilterMeta, PlDataTableFilterSpecLeaf, PlDataTableFilters, PlDataTableFiltersWithMeta, PlDataTableGridStateCore, PlDataTableModel, PlDataTableSheet, PlDataTableSheetState, PlDataTableStateV2CacheEntry, PlDataTableStateV2Normalized, PlTableColumnId, PlTableColumnIdJson } from "./PlDataTable/typesV5.js";
6
8
  import { PlDataTableStateV2, createDefaultPTableParams, createPlDataTableStateV2, upgradePlDataTableStateV2 } from "./PlDataTable/state-migration.js";
7
9
  import { createPlDataTableSheet } from "./PlDataTable/createPlDataTableSheet.js";
@@ -1,6 +1,9 @@
1
1
  import "../pframe_utils/axes.js";
2
2
  import "./PFrameForGraphs.js";
3
3
  import "./PlAnnotations/filters_ui.js";
4
+ import "./PlDatasetSelector/filter_discovery.js";
5
+ import "./PlDatasetSelector/build_dataset_options.js";
6
+ import "./PlDatasetSelector/index.js";
4
7
  import "./PlDataTable/state-migration.js";
5
8
  import "./PlDataTable/createPlDataTableSheet.js";
6
9
  import "./PlDataTable/createPlDataTable/utils.js";
@@ -1,37 +1,8 @@
1
1
  require("../_virtual/_rolldown/runtime.cjs");
2
2
  const require_traverse = require("./traverse.cjs");
3
+ let _milaboratories_helpers = require("@milaboratories/helpers");
3
4
  let es_toolkit_compat = require("es-toolkit/compat");
4
5
  //#region src/filters/distill.ts
5
- const KNOWN_LEAF_KEYS = new Set([
6
- "n",
7
- "x",
8
- "rhs",
9
- "type",
10
- "value",
11
- "column",
12
- "minDiff",
13
- "maxEdits",
14
- "wildcard",
15
- "replacement",
16
- "substitutionsOnly"
17
- ]);
18
- /** Returns true if the leaf is filled — type is defined and no required fields are undefined. */
19
- function isFilledLeaf(node) {
20
- if (node.type == null) return false;
21
- return !Object.values(node).some((value) => {
22
- switch (typeof value) {
23
- case "number":
24
- case "boolean": return false;
25
- case "string": return value.trim() === "";
26
- default: return (0, es_toolkit_compat.isEmpty)(value);
27
- }
28
- });
29
- }
30
- function distillLeaf(node) {
31
- const result = {};
32
- for (const [key, value] of Object.entries(node)) if (KNOWN_LEAF_KEYS.has(key)) result[key] = value;
33
- return result;
34
- }
35
6
  /**
36
7
  * Strips non-FilterSpec metadata (whitelist approach) and removes
37
8
  * unfilled leaves (type is undefined or any required field is undefined).
@@ -63,6 +34,78 @@ function distillFilterSpec(filter) {
63
34
  }
64
35
  });
65
36
  }
37
+ function distillLeaf(node) {
38
+ const result = {};
39
+ for (const [key, value] of Object.entries(node)) if (KNOWN_LEAF_KEYS.has(key)) result[key] = value;
40
+ return result;
41
+ }
42
+ /** Returns true if the leaf is filled — type is defined and every required field per-type is filled. */
43
+ function isFilledLeaf(node) {
44
+ if ((0, _milaboratories_helpers.isNil)(node.type)) return false;
45
+ const required = REQUIRED_KEYS_BY_TYPE[node.type];
46
+ const record = node;
47
+ return required.every((key) => isFilledValue(record[key]));
48
+ }
49
+ /**
50
+ * Returns true if the value is considered "filled":
51
+ * - primitives (number, boolean): always true
52
+ * - string: non-empty after trim
53
+ * - array: non-empty AND every item is filled
54
+ * - plain object: non-empty AND every field value is filled
55
+ * - null/undefined: false
56
+ */
57
+ function isFilledValue(value) {
58
+ if ((0, _milaboratories_helpers.isNil)(value)) return false;
59
+ switch (typeof value) {
60
+ case "number":
61
+ case "boolean": return true;
62
+ case "string": return value.trim() !== "";
63
+ default:
64
+ if ((0, es_toolkit_compat.isEmpty)(value)) return false;
65
+ if (Array.isArray(value)) return value.every(isFilledValue);
66
+ return Object.values(value).every(isFilledValue);
67
+ }
68
+ }
69
+ const KNOWN_LEAF_KEYS = new Set([
70
+ "n",
71
+ "x",
72
+ "rhs",
73
+ "type",
74
+ "value",
75
+ "column",
76
+ "minDiff",
77
+ "maxEdits",
78
+ "wildcard",
79
+ "replacement",
80
+ "substitutionsOnly"
81
+ ]);
82
+ /** Required fields per leaf type. Optional fields (e.g. minDiff, maxEdits) excluded. */
83
+ const REQUIRED_KEYS_BY_TYPE = {
84
+ isNA: ["column"],
85
+ isNotNA: ["column"],
86
+ ifNa: ["column", "replacement"],
87
+ patternEquals: ["column", "value"],
88
+ patternNotEquals: ["column", "value"],
89
+ patternContainSubsequence: ["column", "value"],
90
+ patternNotContainSubsequence: ["column", "value"],
91
+ patternMatchesRegularExpression: ["column", "value"],
92
+ patternFuzzyContainSubsequence: ["column", "value"],
93
+ inSet: ["column", "value"],
94
+ notInSet: ["column", "value"],
95
+ topN: ["column", "n"],
96
+ bottomN: ["column", "n"],
97
+ equal: ["column", "x"],
98
+ notEqual: ["column", "x"],
99
+ lessThan: ["column", "x"],
100
+ greaterThan: ["column", "x"],
101
+ lessThanOrEqual: ["column", "x"],
102
+ greaterThanOrEqual: ["column", "x"],
103
+ equalToColumn: ["column", "rhs"],
104
+ lessThanColumn: ["column", "rhs"],
105
+ greaterThanColumn: ["column", "rhs"],
106
+ lessThanColumnOrEqual: ["column", "rhs"],
107
+ greaterThanColumnOrEqual: ["column", "rhs"]
108
+ };
66
109
  //#endregion
67
110
  exports.distillFilterSpec = distillFilterSpec;
68
111
 
@@ -1 +1 @@
1
- {"version":3,"file":"distill.cjs","names":["traverseFilterSpec"],"sources":["../../src/filters/distill.ts"],"sourcesContent":["import { DistributiveKeys, UnionToTuples } from \"@milaboratories/helpers\";\nimport {\n RootFilterSpec,\n type FilterSpec,\n type FilterSpecLeaf,\n} from \"@milaboratories/pl-model-common\";\nimport { traverseFilterSpec } from \"./traverse\";\nimport { InferFilterSpecLeaf } from \"@milaboratories/pl-model-common\";\nimport { isEmpty } from \"es-toolkit/compat\";\n\n/** All possible field names that can appear in any FilterSpecLeaf variant. */\ntype FilterSpecLeafKey = DistributiveKeys<FilterSpecLeaf<string>>;\n\n/** Compile-time check: every key in the tuple is a valid leaf key (via satisfies). */\nconst KNOWN_LEAF_KEYS_TUPLE: UnionToTuples<FilterSpecLeafKey> = [\n \"n\",\n \"x\",\n \"rhs\",\n \"type\",\n \"value\",\n \"column\",\n \"minDiff\",\n \"maxEdits\",\n \"wildcard\",\n \"replacement\",\n \"substitutionsOnly\",\n];\nconst KNOWN_LEAF_KEYS: Set<FilterSpecLeafKey> = new Set(KNOWN_LEAF_KEYS_TUPLE);\n\n/** Returns true if the leaf is filled type is defined and no required fields are undefined. */\nfunction isFilledLeaf<T>(node: FilterSpecLeaf<T>): boolean {\n if (node.type == null) return false;\n return !Object.values(node).some((value) => {\n switch (typeof value) {\n case \"number\":\n case \"boolean\":\n return false;\n case \"string\":\n return value.trim() === \"\";\n default: // undefined, null, empty objects/arrays\n return isEmpty(value);\n }\n });\n}\n\nfunction distillLeaf<T>(node: FilterSpecLeaf<T>): FilterSpecLeaf<T> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(node)) {\n if (KNOWN_LEAF_KEYS.has(key as FilterSpecLeafKey)) {\n result[key] = value;\n }\n }\n return result as FilterSpecLeaf<T>;\n}\n\n/**\n * Strips non-FilterSpec metadata (whitelist approach) and removes\n * unfilled leaves (type is undefined or any required field is undefined).\n */\nexport function distillFilterSpec<\n FS extends FilterSpec<FilterSpecLeaf<unknown>, unknown, unknown>,\n R extends FS extends RootFilterSpec<FilterSpecLeaf<unknown>, unknown, unknown>\n ? RootFilterSpec<InferFilterSpecLeaf<FS>>\n : FilterSpec<InferFilterSpecLeaf<FS>>,\n>(filter: null | undefined | FS): null | R {\n if (filter == null) return null;\n return traverseFilterSpec<FS, null | R>(filter, {\n leaf: (leaf) => {\n const distilled = distillLeaf(leaf);\n return isFilledLeaf(distilled) ? (distilled as R) : null;\n },\n and: (results) => {\n const filtered = results.filter((f): f is NonNullable<typeof f> => f !== null);\n return filtered.length === 0 ? null : ({ type: \"and\", filters: filtered } as R);\n },\n or: (results) => {\n const filtered = results.filter((f): f is NonNullable<typeof f> => f !== null);\n return filtered.length === 0 ? null : ({ type: \"or\", filters: filtered } as R);\n },\n not: (result) => (result === null ? null : ({ type: \"not\", filter: result } as R)),\n });\n}\n"],"mappings":";;;;AA2BA,MAAM,kBAA0C,IAAI,IAbY;CAC9D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAC6E;;AAG9E,SAAS,aAAgB,MAAkC;AACzD,KAAI,KAAK,QAAQ,KAAM,QAAO;AAC9B,QAAO,CAAC,OAAO,OAAO,KAAK,CAAC,MAAM,UAAU;AAC1C,UAAQ,OAAO,OAAf;GACE,KAAK;GACL,KAAK,UACH,QAAO;GACT,KAAK,SACH,QAAO,MAAM,MAAM,KAAK;GAC1B,QACE,SAAA,GAAA,kBAAA,SAAe,MAAM;;GAEzB;;AAGJ,SAAS,YAAe,MAA4C;CAClE,MAAM,SAAkC,EAAE;AAC1C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,CAC7C,KAAI,gBAAgB,IAAI,IAAyB,CAC/C,QAAO,OAAO;AAGlB,QAAO;;;;;;AAOT,SAAgB,kBAKd,QAAyC;AACzC,KAAI,UAAU,KAAM,QAAO;AAC3B,QAAOA,iBAAAA,mBAAiC,QAAQ;EAC9C,OAAO,SAAS;GACd,MAAM,YAAY,YAAY,KAAK;AACnC,UAAO,aAAa,UAAU,GAAI,YAAkB;;EAEtD,MAAM,YAAY;GAChB,MAAM,WAAW,QAAQ,QAAQ,MAAkC,MAAM,KAAK;AAC9E,UAAO,SAAS,WAAW,IAAI,OAAQ;IAAE,MAAM;IAAO,SAAS;IAAU;;EAE3E,KAAK,YAAY;GACf,MAAM,WAAW,QAAQ,QAAQ,MAAkC,MAAM,KAAK;AAC9E,UAAO,SAAS,WAAW,IAAI,OAAQ;IAAE,MAAM;IAAM,SAAS;IAAU;;EAE1E,MAAM,WAAY,WAAW,OAAO,OAAQ;GAAE,MAAM;GAAO,QAAQ;GAAQ;EAC5E,CAAC"}
1
+ {"version":3,"file":"distill.cjs","names":["traverseFilterSpec"],"sources":["../../src/filters/distill.ts"],"sourcesContent":["import { DistributiveKeys, isNil, UnionToTuples } from \"@milaboratories/helpers\";\nimport {\n RootFilterSpec,\n type FilterSpec,\n type FilterSpecLeaf,\n} from \"@milaboratories/pl-model-common\";\nimport { traverseFilterSpec } from \"./traverse\";\nimport { InferFilterSpecLeaf } from \"@milaboratories/pl-model-common\";\nimport { isEmpty } from \"es-toolkit/compat\";\n\n/**\n * Strips non-FilterSpec metadata (whitelist approach) and removes\n * unfilled leaves (type is undefined or any required field is undefined).\n */\nexport function distillFilterSpec<\n FS extends FilterSpec<FilterSpecLeaf<unknown>, unknown, unknown>,\n R extends FS extends RootFilterSpec<FilterSpecLeaf<unknown>, unknown, unknown>\n ? RootFilterSpec<InferFilterSpecLeaf<FS>>\n : FilterSpec<InferFilterSpecLeaf<FS>>,\n>(filter: null | undefined | FS): null | R {\n if (filter == null) return null;\n return traverseFilterSpec<FS, null | R>(filter, {\n leaf: (leaf) => {\n const distilled = distillLeaf(leaf);\n return isFilledLeaf(distilled) ? (distilled as R) : null;\n },\n and: (results) => {\n const filtered = results.filter((f): f is NonNullable<typeof f> => f !== null);\n return filtered.length === 0 ? null : ({ type: \"and\", filters: filtered } as R);\n },\n or: (results) => {\n const filtered = results.filter((f): f is NonNullable<typeof f> => f !== null);\n return filtered.length === 0 ? null : ({ type: \"or\", filters: filtered } as R);\n },\n not: (result) => (result === null ? null : ({ type: \"not\", filter: result } as R)),\n });\n}\n\nfunction distillLeaf<T>(node: FilterSpecLeaf<T>): FilterSpecLeaf<T> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(node)) {\n if (KNOWN_LEAF_KEYS.has(key as FilterSpecLeafKey)) {\n result[key] = value;\n }\n }\n return result as FilterSpecLeaf<T>;\n}\n\n/** Returns true if the leaf is filled type is defined and every required field per-type is filled. */\nfunction isFilledLeaf<T>(node: FilterSpecLeaf<T>): boolean {\n if (isNil(node.type)) return false;\n const required = REQUIRED_KEYS_BY_TYPE[node.type];\n const record = node as Record<string, unknown>;\n return required.every((key) => isFilledValue(record[key]));\n}\n\n/**\n * Returns true if the value is considered \"filled\":\n * - primitives (number, boolean): always true\n * - string: non-empty after trim\n * - array: non-empty AND every item is filled\n * - plain object: non-empty AND every field value is filled\n * - null/undefined: false\n */\nfunction isFilledValue(value: unknown): boolean {\n if (isNil(value)) return false;\n switch (typeof value) {\n case \"number\":\n case \"boolean\":\n return true;\n case \"string\":\n return value.trim() !== \"\";\n default:\n if (isEmpty(value)) return false;\n if (Array.isArray(value)) return value.every(isFilledValue);\n return Object.values(value as Record<string, unknown>).every(isFilledValue);\n }\n}\n\n/** All possible field names that can appear in any FilterSpecLeaf variant. */\ntype FilterSpecLeafKey = DistributiveKeys<FilterSpecLeaf<string>>;\n\n/** Leaf type discriminators (excludes the placeholder `undefined` variant). */\ntype FilterSpecLeafType = Exclude<FilterSpecLeaf<unknown>, { type: undefined }>[\"type\"];\n\ntype LeafOfType<T extends FilterSpecLeafType> = Extract<FilterSpecLeaf<unknown>, { type: T }>;\n\ntype RequiredKeys<O> = { [K in keyof O]-?: {} extends Pick<O, K> ? never : K }[keyof O];\n\n/** Required field keys of a given leaf variant (excluding the `type` discriminator). */\ntype RequiredLeafKeys<T extends FilterSpecLeafType> = Exclude<RequiredKeys<LeafOfType<T>>, \"type\">;\n\n/** Exact per-type shape — adding a key not required by that variant becomes a type error. */\ntype RequiredKeysByType = { readonly [T in FilterSpecLeafType]: readonly RequiredLeafKeys<T>[] };\n\n/** Compile-time check: every key in the tuple is a valid leaf key (via satisfies). */\nconst KNOWN_LEAF_KEYS_TUPLE: UnionToTuples<FilterSpecLeafKey> = [\n \"n\",\n \"x\",\n \"rhs\",\n \"type\",\n \"value\",\n \"column\",\n \"minDiff\",\n \"maxEdits\",\n \"wildcard\",\n \"replacement\",\n \"substitutionsOnly\",\n];\nconst KNOWN_LEAF_KEYS: Set<FilterSpecLeafKey> = new Set(KNOWN_LEAF_KEYS_TUPLE);\n\n/** Required fields per leaf type. Optional fields (e.g. minDiff, maxEdits) excluded. */\nconst REQUIRED_KEYS_BY_TYPE = {\n isNA: [\"column\"],\n isNotNA: [\"column\"],\n ifNa: [\"column\", \"replacement\"],\n patternEquals: [\"column\", \"value\"],\n patternNotEquals: [\"column\", \"value\"],\n patternContainSubsequence: [\"column\", \"value\"],\n patternNotContainSubsequence: [\"column\", \"value\"],\n patternMatchesRegularExpression: [\"column\", \"value\"],\n patternFuzzyContainSubsequence: [\"column\", \"value\"],\n inSet: [\"column\", \"value\"],\n notInSet: [\"column\", \"value\"],\n topN: [\"column\", \"n\"],\n bottomN: [\"column\", \"n\"],\n equal: [\"column\", \"x\"],\n notEqual: [\"column\", \"x\"],\n lessThan: [\"column\", \"x\"],\n greaterThan: [\"column\", \"x\"],\n lessThanOrEqual: [\"column\", \"x\"],\n greaterThanOrEqual: [\"column\", \"x\"],\n equalToColumn: [\"column\", \"rhs\"],\n lessThanColumn: [\"column\", \"rhs\"],\n greaterThanColumn: [\"column\", \"rhs\"],\n lessThanColumnOrEqual: [\"column\", \"rhs\"],\n greaterThanColumnOrEqual: [\"column\", \"rhs\"],\n} as const satisfies RequiredKeysByType;\n"],"mappings":";;;;;;;;;AAcA,SAAgB,kBAKd,QAAyC;AACzC,KAAI,UAAU,KAAM,QAAO;AAC3B,QAAOA,iBAAAA,mBAAiC,QAAQ;EAC9C,OAAO,SAAS;GACd,MAAM,YAAY,YAAY,KAAK;AACnC,UAAO,aAAa,UAAU,GAAI,YAAkB;;EAEtD,MAAM,YAAY;GAChB,MAAM,WAAW,QAAQ,QAAQ,MAAkC,MAAM,KAAK;AAC9E,UAAO,SAAS,WAAW,IAAI,OAAQ;IAAE,MAAM;IAAO,SAAS;IAAU;;EAE3E,KAAK,YAAY;GACf,MAAM,WAAW,QAAQ,QAAQ,MAAkC,MAAM,KAAK;AAC9E,UAAO,SAAS,WAAW,IAAI,OAAQ;IAAE,MAAM;IAAM,SAAS;IAAU;;EAE1E,MAAM,WAAY,WAAW,OAAO,OAAQ;GAAE,MAAM;GAAO,QAAQ;GAAQ;EAC5E,CAAC;;AAGJ,SAAS,YAAe,MAA4C;CAClE,MAAM,SAAkC,EAAE;AAC1C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,CAC7C,KAAI,gBAAgB,IAAI,IAAyB,CAC/C,QAAO,OAAO;AAGlB,QAAO;;;AAIT,SAAS,aAAgB,MAAkC;AACzD,MAAA,GAAA,wBAAA,OAAU,KAAK,KAAK,CAAE,QAAO;CAC7B,MAAM,WAAW,sBAAsB,KAAK;CAC5C,MAAM,SAAS;AACf,QAAO,SAAS,OAAO,QAAQ,cAAc,OAAO,KAAK,CAAC;;;;;;;;;;AAW5D,SAAS,cAAc,OAAyB;AAC9C,MAAA,GAAA,wBAAA,OAAU,MAAM,CAAE,QAAO;AACzB,SAAQ,OAAO,OAAf;EACE,KAAK;EACL,KAAK,UACH,QAAO;EACT,KAAK,SACH,QAAO,MAAM,MAAM,KAAK;EAC1B;AACE,QAAA,GAAA,kBAAA,SAAY,MAAM,CAAE,QAAO;AAC3B,OAAI,MAAM,QAAQ,MAAM,CAAE,QAAO,MAAM,MAAM,cAAc;AAC3D,UAAO,OAAO,OAAO,MAAiC,CAAC,MAAM,cAAc;;;AAkCjF,MAAM,kBAA0C,IAAI,IAbY;CAC9D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAC6E;;AAG9E,MAAM,wBAAwB;CAC5B,MAAM,CAAC,SAAS;CAChB,SAAS,CAAC,SAAS;CACnB,MAAM,CAAC,UAAU,cAAc;CAC/B,eAAe,CAAC,UAAU,QAAQ;CAClC,kBAAkB,CAAC,UAAU,QAAQ;CACrC,2BAA2B,CAAC,UAAU,QAAQ;CAC9C,8BAA8B,CAAC,UAAU,QAAQ;CACjD,iCAAiC,CAAC,UAAU,QAAQ;CACpD,gCAAgC,CAAC,UAAU,QAAQ;CACnD,OAAO,CAAC,UAAU,QAAQ;CAC1B,UAAU,CAAC,UAAU,QAAQ;CAC7B,MAAM,CAAC,UAAU,IAAI;CACrB,SAAS,CAAC,UAAU,IAAI;CACxB,OAAO,CAAC,UAAU,IAAI;CACtB,UAAU,CAAC,UAAU,IAAI;CACzB,UAAU,CAAC,UAAU,IAAI;CACzB,aAAa,CAAC,UAAU,IAAI;CAC5B,iBAAiB,CAAC,UAAU,IAAI;CAChC,oBAAoB,CAAC,UAAU,IAAI;CACnC,eAAe,CAAC,UAAU,MAAM;CAChC,gBAAgB,CAAC,UAAU,MAAM;CACjC,mBAAmB,CAAC,UAAU,MAAM;CACpC,uBAAuB,CAAC,UAAU,MAAM;CACxC,0BAA0B,CAAC,UAAU,MAAM;CAC5C"}
@@ -1 +1 @@
1
- {"version":3,"file":"distill.d.ts","names":[],"sources":["../../src/filters/distill.ts"],"mappings":";;;;AA2DA;;;iBAAgB,iBAAA,YACH,UAAA,CAAW,cAAA,yCACZ,EAAA,SAAW,cAAA,CAAe,cAAA,+BAChC,cAAA,CAAe,mBAAA,CAAoB,EAAA,KACnC,UAAA,CAAW,mBAAA,CAAoB,EAAA,IAAA,CACnC,MAAA,qBAA2B,EAAA,UAAY,CAAA"}
1
+ {"version":3,"file":"distill.d.ts","names":[],"sources":["../../src/filters/distill.ts"],"mappings":";;;;AAcA;;;iBAAgB,iBAAA,YACH,UAAA,CAAW,cAAA,yCACZ,EAAA,SAAW,cAAA,CAAe,cAAA,+BAChC,cAAA,CAAe,mBAAA,CAAoB,EAAA,KACnC,UAAA,CAAW,mBAAA,CAAoB,EAAA,IAAA,CACnC,MAAA,qBAA2B,EAAA,UAAY,CAAA"}
@@ -1,36 +1,7 @@
1
1
  import { traverseFilterSpec } from "./traverse.js";
2
+ import { isNil } from "@milaboratories/helpers";
2
3
  import { isEmpty } from "es-toolkit/compat";
3
4
  //#region src/filters/distill.ts
4
- const KNOWN_LEAF_KEYS = new Set([
5
- "n",
6
- "x",
7
- "rhs",
8
- "type",
9
- "value",
10
- "column",
11
- "minDiff",
12
- "maxEdits",
13
- "wildcard",
14
- "replacement",
15
- "substitutionsOnly"
16
- ]);
17
- /** Returns true if the leaf is filled — type is defined and no required fields are undefined. */
18
- function isFilledLeaf(node) {
19
- if (node.type == null) return false;
20
- return !Object.values(node).some((value) => {
21
- switch (typeof value) {
22
- case "number":
23
- case "boolean": return false;
24
- case "string": return value.trim() === "";
25
- default: return isEmpty(value);
26
- }
27
- });
28
- }
29
- function distillLeaf(node) {
30
- const result = {};
31
- for (const [key, value] of Object.entries(node)) if (KNOWN_LEAF_KEYS.has(key)) result[key] = value;
32
- return result;
33
- }
34
5
  /**
35
6
  * Strips non-FilterSpec metadata (whitelist approach) and removes
36
7
  * unfilled leaves (type is undefined or any required field is undefined).
@@ -62,6 +33,78 @@ function distillFilterSpec(filter) {
62
33
  }
63
34
  });
64
35
  }
36
+ function distillLeaf(node) {
37
+ const result = {};
38
+ for (const [key, value] of Object.entries(node)) if (KNOWN_LEAF_KEYS.has(key)) result[key] = value;
39
+ return result;
40
+ }
41
+ /** Returns true if the leaf is filled — type is defined and every required field per-type is filled. */
42
+ function isFilledLeaf(node) {
43
+ if (isNil(node.type)) return false;
44
+ const required = REQUIRED_KEYS_BY_TYPE[node.type];
45
+ const record = node;
46
+ return required.every((key) => isFilledValue(record[key]));
47
+ }
48
+ /**
49
+ * Returns true if the value is considered "filled":
50
+ * - primitives (number, boolean): always true
51
+ * - string: non-empty after trim
52
+ * - array: non-empty AND every item is filled
53
+ * - plain object: non-empty AND every field value is filled
54
+ * - null/undefined: false
55
+ */
56
+ function isFilledValue(value) {
57
+ if (isNil(value)) return false;
58
+ switch (typeof value) {
59
+ case "number":
60
+ case "boolean": return true;
61
+ case "string": return value.trim() !== "";
62
+ default:
63
+ if (isEmpty(value)) return false;
64
+ if (Array.isArray(value)) return value.every(isFilledValue);
65
+ return Object.values(value).every(isFilledValue);
66
+ }
67
+ }
68
+ const KNOWN_LEAF_KEYS = new Set([
69
+ "n",
70
+ "x",
71
+ "rhs",
72
+ "type",
73
+ "value",
74
+ "column",
75
+ "minDiff",
76
+ "maxEdits",
77
+ "wildcard",
78
+ "replacement",
79
+ "substitutionsOnly"
80
+ ]);
81
+ /** Required fields per leaf type. Optional fields (e.g. minDiff, maxEdits) excluded. */
82
+ const REQUIRED_KEYS_BY_TYPE = {
83
+ isNA: ["column"],
84
+ isNotNA: ["column"],
85
+ ifNa: ["column", "replacement"],
86
+ patternEquals: ["column", "value"],
87
+ patternNotEquals: ["column", "value"],
88
+ patternContainSubsequence: ["column", "value"],
89
+ patternNotContainSubsequence: ["column", "value"],
90
+ patternMatchesRegularExpression: ["column", "value"],
91
+ patternFuzzyContainSubsequence: ["column", "value"],
92
+ inSet: ["column", "value"],
93
+ notInSet: ["column", "value"],
94
+ topN: ["column", "n"],
95
+ bottomN: ["column", "n"],
96
+ equal: ["column", "x"],
97
+ notEqual: ["column", "x"],
98
+ lessThan: ["column", "x"],
99
+ greaterThan: ["column", "x"],
100
+ lessThanOrEqual: ["column", "x"],
101
+ greaterThanOrEqual: ["column", "x"],
102
+ equalToColumn: ["column", "rhs"],
103
+ lessThanColumn: ["column", "rhs"],
104
+ greaterThanColumn: ["column", "rhs"],
105
+ lessThanColumnOrEqual: ["column", "rhs"],
106
+ greaterThanColumnOrEqual: ["column", "rhs"]
107
+ };
65
108
  //#endregion
66
109
  export { distillFilterSpec };
67
110
 
@@ -1 +1 @@
1
- {"version":3,"file":"distill.js","names":[],"sources":["../../src/filters/distill.ts"],"sourcesContent":["import { DistributiveKeys, UnionToTuples } from \"@milaboratories/helpers\";\nimport {\n RootFilterSpec,\n type FilterSpec,\n type FilterSpecLeaf,\n} from \"@milaboratories/pl-model-common\";\nimport { traverseFilterSpec } from \"./traverse\";\nimport { InferFilterSpecLeaf } from \"@milaboratories/pl-model-common\";\nimport { isEmpty } from \"es-toolkit/compat\";\n\n/** All possible field names that can appear in any FilterSpecLeaf variant. */\ntype FilterSpecLeafKey = DistributiveKeys<FilterSpecLeaf<string>>;\n\n/** Compile-time check: every key in the tuple is a valid leaf key (via satisfies). */\nconst KNOWN_LEAF_KEYS_TUPLE: UnionToTuples<FilterSpecLeafKey> = [\n \"n\",\n \"x\",\n \"rhs\",\n \"type\",\n \"value\",\n \"column\",\n \"minDiff\",\n \"maxEdits\",\n \"wildcard\",\n \"replacement\",\n \"substitutionsOnly\",\n];\nconst KNOWN_LEAF_KEYS: Set<FilterSpecLeafKey> = new Set(KNOWN_LEAF_KEYS_TUPLE);\n\n/** Returns true if the leaf is filled type is defined and no required fields are undefined. */\nfunction isFilledLeaf<T>(node: FilterSpecLeaf<T>): boolean {\n if (node.type == null) return false;\n return !Object.values(node).some((value) => {\n switch (typeof value) {\n case \"number\":\n case \"boolean\":\n return false;\n case \"string\":\n return value.trim() === \"\";\n default: // undefined, null, empty objects/arrays\n return isEmpty(value);\n }\n });\n}\n\nfunction distillLeaf<T>(node: FilterSpecLeaf<T>): FilterSpecLeaf<T> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(node)) {\n if (KNOWN_LEAF_KEYS.has(key as FilterSpecLeafKey)) {\n result[key] = value;\n }\n }\n return result as FilterSpecLeaf<T>;\n}\n\n/**\n * Strips non-FilterSpec metadata (whitelist approach) and removes\n * unfilled leaves (type is undefined or any required field is undefined).\n */\nexport function distillFilterSpec<\n FS extends FilterSpec<FilterSpecLeaf<unknown>, unknown, unknown>,\n R extends FS extends RootFilterSpec<FilterSpecLeaf<unknown>, unknown, unknown>\n ? RootFilterSpec<InferFilterSpecLeaf<FS>>\n : FilterSpec<InferFilterSpecLeaf<FS>>,\n>(filter: null | undefined | FS): null | R {\n if (filter == null) return null;\n return traverseFilterSpec<FS, null | R>(filter, {\n leaf: (leaf) => {\n const distilled = distillLeaf(leaf);\n return isFilledLeaf(distilled) ? (distilled as R) : null;\n },\n and: (results) => {\n const filtered = results.filter((f): f is NonNullable<typeof f> => f !== null);\n return filtered.length === 0 ? null : ({ type: \"and\", filters: filtered } as R);\n },\n or: (results) => {\n const filtered = results.filter((f): f is NonNullable<typeof f> => f !== null);\n return filtered.length === 0 ? null : ({ type: \"or\", filters: filtered } as R);\n },\n not: (result) => (result === null ? null : ({ type: \"not\", filter: result } as R)),\n });\n}\n"],"mappings":";;;AA2BA,MAAM,kBAA0C,IAAI,IAbY;CAC9D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAC6E;;AAG9E,SAAS,aAAgB,MAAkC;AACzD,KAAI,KAAK,QAAQ,KAAM,QAAO;AAC9B,QAAO,CAAC,OAAO,OAAO,KAAK,CAAC,MAAM,UAAU;AAC1C,UAAQ,OAAO,OAAf;GACE,KAAK;GACL,KAAK,UACH,QAAO;GACT,KAAK,SACH,QAAO,MAAM,MAAM,KAAK;GAC1B,QACE,QAAO,QAAQ,MAAM;;GAEzB;;AAGJ,SAAS,YAAe,MAA4C;CAClE,MAAM,SAAkC,EAAE;AAC1C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,CAC7C,KAAI,gBAAgB,IAAI,IAAyB,CAC/C,QAAO,OAAO;AAGlB,QAAO;;;;;;AAOT,SAAgB,kBAKd,QAAyC;AACzC,KAAI,UAAU,KAAM,QAAO;AAC3B,QAAO,mBAAiC,QAAQ;EAC9C,OAAO,SAAS;GACd,MAAM,YAAY,YAAY,KAAK;AACnC,UAAO,aAAa,UAAU,GAAI,YAAkB;;EAEtD,MAAM,YAAY;GAChB,MAAM,WAAW,QAAQ,QAAQ,MAAkC,MAAM,KAAK;AAC9E,UAAO,SAAS,WAAW,IAAI,OAAQ;IAAE,MAAM;IAAO,SAAS;IAAU;;EAE3E,KAAK,YAAY;GACf,MAAM,WAAW,QAAQ,QAAQ,MAAkC,MAAM,KAAK;AAC9E,UAAO,SAAS,WAAW,IAAI,OAAQ;IAAE,MAAM;IAAM,SAAS;IAAU;;EAE1E,MAAM,WAAY,WAAW,OAAO,OAAQ;GAAE,MAAM;GAAO,QAAQ;GAAQ;EAC5E,CAAC"}
1
+ {"version":3,"file":"distill.js","names":[],"sources":["../../src/filters/distill.ts"],"sourcesContent":["import { DistributiveKeys, isNil, UnionToTuples } from \"@milaboratories/helpers\";\nimport {\n RootFilterSpec,\n type FilterSpec,\n type FilterSpecLeaf,\n} from \"@milaboratories/pl-model-common\";\nimport { traverseFilterSpec } from \"./traverse\";\nimport { InferFilterSpecLeaf } from \"@milaboratories/pl-model-common\";\nimport { isEmpty } from \"es-toolkit/compat\";\n\n/**\n * Strips non-FilterSpec metadata (whitelist approach) and removes\n * unfilled leaves (type is undefined or any required field is undefined).\n */\nexport function distillFilterSpec<\n FS extends FilterSpec<FilterSpecLeaf<unknown>, unknown, unknown>,\n R extends FS extends RootFilterSpec<FilterSpecLeaf<unknown>, unknown, unknown>\n ? RootFilterSpec<InferFilterSpecLeaf<FS>>\n : FilterSpec<InferFilterSpecLeaf<FS>>,\n>(filter: null | undefined | FS): null | R {\n if (filter == null) return null;\n return traverseFilterSpec<FS, null | R>(filter, {\n leaf: (leaf) => {\n const distilled = distillLeaf(leaf);\n return isFilledLeaf(distilled) ? (distilled as R) : null;\n },\n and: (results) => {\n const filtered = results.filter((f): f is NonNullable<typeof f> => f !== null);\n return filtered.length === 0 ? null : ({ type: \"and\", filters: filtered } as R);\n },\n or: (results) => {\n const filtered = results.filter((f): f is NonNullable<typeof f> => f !== null);\n return filtered.length === 0 ? null : ({ type: \"or\", filters: filtered } as R);\n },\n not: (result) => (result === null ? null : ({ type: \"not\", filter: result } as R)),\n });\n}\n\nfunction distillLeaf<T>(node: FilterSpecLeaf<T>): FilterSpecLeaf<T> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(node)) {\n if (KNOWN_LEAF_KEYS.has(key as FilterSpecLeafKey)) {\n result[key] = value;\n }\n }\n return result as FilterSpecLeaf<T>;\n}\n\n/** Returns true if the leaf is filled type is defined and every required field per-type is filled. */\nfunction isFilledLeaf<T>(node: FilterSpecLeaf<T>): boolean {\n if (isNil(node.type)) return false;\n const required = REQUIRED_KEYS_BY_TYPE[node.type];\n const record = node as Record<string, unknown>;\n return required.every((key) => isFilledValue(record[key]));\n}\n\n/**\n * Returns true if the value is considered \"filled\":\n * - primitives (number, boolean): always true\n * - string: non-empty after trim\n * - array: non-empty AND every item is filled\n * - plain object: non-empty AND every field value is filled\n * - null/undefined: false\n */\nfunction isFilledValue(value: unknown): boolean {\n if (isNil(value)) return false;\n switch (typeof value) {\n case \"number\":\n case \"boolean\":\n return true;\n case \"string\":\n return value.trim() !== \"\";\n default:\n if (isEmpty(value)) return false;\n if (Array.isArray(value)) return value.every(isFilledValue);\n return Object.values(value as Record<string, unknown>).every(isFilledValue);\n }\n}\n\n/** All possible field names that can appear in any FilterSpecLeaf variant. */\ntype FilterSpecLeafKey = DistributiveKeys<FilterSpecLeaf<string>>;\n\n/** Leaf type discriminators (excludes the placeholder `undefined` variant). */\ntype FilterSpecLeafType = Exclude<FilterSpecLeaf<unknown>, { type: undefined }>[\"type\"];\n\ntype LeafOfType<T extends FilterSpecLeafType> = Extract<FilterSpecLeaf<unknown>, { type: T }>;\n\ntype RequiredKeys<O> = { [K in keyof O]-?: {} extends Pick<O, K> ? never : K }[keyof O];\n\n/** Required field keys of a given leaf variant (excluding the `type` discriminator). */\ntype RequiredLeafKeys<T extends FilterSpecLeafType> = Exclude<RequiredKeys<LeafOfType<T>>, \"type\">;\n\n/** Exact per-type shape — adding a key not required by that variant becomes a type error. */\ntype RequiredKeysByType = { readonly [T in FilterSpecLeafType]: readonly RequiredLeafKeys<T>[] };\n\n/** Compile-time check: every key in the tuple is a valid leaf key (via satisfies). */\nconst KNOWN_LEAF_KEYS_TUPLE: UnionToTuples<FilterSpecLeafKey> = [\n \"n\",\n \"x\",\n \"rhs\",\n \"type\",\n \"value\",\n \"column\",\n \"minDiff\",\n \"maxEdits\",\n \"wildcard\",\n \"replacement\",\n \"substitutionsOnly\",\n];\nconst KNOWN_LEAF_KEYS: Set<FilterSpecLeafKey> = new Set(KNOWN_LEAF_KEYS_TUPLE);\n\n/** Required fields per leaf type. Optional fields (e.g. minDiff, maxEdits) excluded. */\nconst REQUIRED_KEYS_BY_TYPE = {\n isNA: [\"column\"],\n isNotNA: [\"column\"],\n ifNa: [\"column\", \"replacement\"],\n patternEquals: [\"column\", \"value\"],\n patternNotEquals: [\"column\", \"value\"],\n patternContainSubsequence: [\"column\", \"value\"],\n patternNotContainSubsequence: [\"column\", \"value\"],\n patternMatchesRegularExpression: [\"column\", \"value\"],\n patternFuzzyContainSubsequence: [\"column\", \"value\"],\n inSet: [\"column\", \"value\"],\n notInSet: [\"column\", \"value\"],\n topN: [\"column\", \"n\"],\n bottomN: [\"column\", \"n\"],\n equal: [\"column\", \"x\"],\n notEqual: [\"column\", \"x\"],\n lessThan: [\"column\", \"x\"],\n greaterThan: [\"column\", \"x\"],\n lessThanOrEqual: [\"column\", \"x\"],\n greaterThanOrEqual: [\"column\", \"x\"],\n equalToColumn: [\"column\", \"rhs\"],\n lessThanColumn: [\"column\", \"rhs\"],\n greaterThanColumn: [\"column\", \"rhs\"],\n lessThanColumnOrEqual: [\"column\", \"rhs\"],\n greaterThanColumnOrEqual: [\"column\", \"rhs\"],\n} as const satisfies RequiredKeysByType;\n"],"mappings":";;;;;;;;AAcA,SAAgB,kBAKd,QAAyC;AACzC,KAAI,UAAU,KAAM,QAAO;AAC3B,QAAO,mBAAiC,QAAQ;EAC9C,OAAO,SAAS;GACd,MAAM,YAAY,YAAY,KAAK;AACnC,UAAO,aAAa,UAAU,GAAI,YAAkB;;EAEtD,MAAM,YAAY;GAChB,MAAM,WAAW,QAAQ,QAAQ,MAAkC,MAAM,KAAK;AAC9E,UAAO,SAAS,WAAW,IAAI,OAAQ;IAAE,MAAM;IAAO,SAAS;IAAU;;EAE3E,KAAK,YAAY;GACf,MAAM,WAAW,QAAQ,QAAQ,MAAkC,MAAM,KAAK;AAC9E,UAAO,SAAS,WAAW,IAAI,OAAQ;IAAE,MAAM;IAAM,SAAS;IAAU;;EAE1E,MAAM,WAAY,WAAW,OAAO,OAAQ;GAAE,MAAM;GAAO,QAAQ;GAAQ;EAC5E,CAAC;;AAGJ,SAAS,YAAe,MAA4C;CAClE,MAAM,SAAkC,EAAE;AAC1C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,CAC7C,KAAI,gBAAgB,IAAI,IAAyB,CAC/C,QAAO,OAAO;AAGlB,QAAO;;;AAIT,SAAS,aAAgB,MAAkC;AACzD,KAAI,MAAM,KAAK,KAAK,CAAE,QAAO;CAC7B,MAAM,WAAW,sBAAsB,KAAK;CAC5C,MAAM,SAAS;AACf,QAAO,SAAS,OAAO,QAAQ,cAAc,OAAO,KAAK,CAAC;;;;;;;;;;AAW5D,SAAS,cAAc,OAAyB;AAC9C,KAAI,MAAM,MAAM,CAAE,QAAO;AACzB,SAAQ,OAAO,OAAf;EACE,KAAK;EACL,KAAK,UACH,QAAO;EACT,KAAK,SACH,QAAO,MAAM,MAAM,KAAK;EAC1B;AACE,OAAI,QAAQ,MAAM,CAAE,QAAO;AAC3B,OAAI,MAAM,QAAQ,MAAM,CAAE,QAAO,MAAM,MAAM,cAAc;AAC3D,UAAO,OAAO,OAAO,MAAiC,CAAC,MAAM,cAAc;;;AAkCjF,MAAM,kBAA0C,IAAI,IAbY;CAC9D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAC6E;;AAG9E,MAAM,wBAAwB;CAC5B,MAAM,CAAC,SAAS;CAChB,SAAS,CAAC,SAAS;CACnB,MAAM,CAAC,UAAU,cAAc;CAC/B,eAAe,CAAC,UAAU,QAAQ;CAClC,kBAAkB,CAAC,UAAU,QAAQ;CACrC,2BAA2B,CAAC,UAAU,QAAQ;CAC9C,8BAA8B,CAAC,UAAU,QAAQ;CACjD,iCAAiC,CAAC,UAAU,QAAQ;CACpD,gCAAgC,CAAC,UAAU,QAAQ;CACnD,OAAO,CAAC,UAAU,QAAQ;CAC1B,UAAU,CAAC,UAAU,QAAQ;CAC7B,MAAM,CAAC,UAAU,IAAI;CACrB,SAAS,CAAC,UAAU,IAAI;CACxB,OAAO,CAAC,UAAU,IAAI;CACtB,UAAU,CAAC,UAAU,IAAI;CACzB,UAAU,CAAC,UAAU,IAAI;CACzB,aAAa,CAAC,UAAU,IAAI;CAC5B,iBAAiB,CAAC,UAAU,IAAI;CAChC,oBAAoB,CAAC,UAAU,IAAI;CACnC,eAAe,CAAC,UAAU,MAAM;CAChC,gBAAgB,CAAC,UAAU,MAAM;CACjC,mBAAmB,CAAC,UAAU,MAAM;CACpC,uBAAuB,CAAC,UAAU,MAAM;CACxC,0BAA0B,CAAC,UAAU,MAAM;CAC5C"}
package/dist/index.cjs CHANGED
@@ -14,6 +14,10 @@ const require_derive_distinct_labels = require("./labels/derive_distinct_labels.
14
14
  const require_label = require("./render/util/label.cjs");
15
15
  const require_pcolumn_data = require("./render/util/pcolumn_data.cjs");
16
16
  const require_column_collection = require("./render/util/column_collection.cjs");
17
+ const require_block_services = require("./services/block_services.cjs");
18
+ const require_service_bridge = require("./services/service_bridge.cjs");
19
+ const require_get_services = require("./services/get_services.cjs");
20
+ require("./services/index.cjs");
17
21
  const require_api = require("./render/api.cjs");
18
22
  require("./render/index.cjs");
19
23
  const require_version = require("./version.cjs");
@@ -21,13 +25,18 @@ const require_types = require("./bconfig/types.cjs");
21
25
  const require_normalization = require("./bconfig/normalization.cjs");
22
26
  require("./bconfig/index.cjs");
23
27
  const require_block_model_legacy = require("./block_model_legacy.cjs");
24
- const require_block_services = require("./services/block_services.cjs");
25
28
  const require_plugin_model = require("./plugin_model.cjs");
26
29
  const require_block_model = require("./block_model.cjs");
27
30
  const require_axes = require("./pframe_utils/axes.cjs");
28
31
  const require_columns = require("./pframe_utils/columns.cjs");
29
32
  const require_PFrameForGraphs = require("./components/PFrameForGraphs.cjs");
30
33
  const require_filters_ui = require("./components/PlAnnotations/filters_ui.cjs");
34
+ const require_filter_discovery = require("./components/PlDatasetSelector/filter_discovery.cjs");
35
+ const require_column_selector = require("./columns/column_selector.cjs");
36
+ const require_column_snapshot_provider = require("./columns/column_snapshot_provider.cjs");
37
+ const require_column_collection_builder = require("./columns/column_collection_builder.cjs");
38
+ const require_ctx_column_sources = require("./columns/ctx_column_sources.cjs");
39
+ const require_build_dataset_options = require("./components/PlDatasetSelector/build_dataset_options.cjs");
31
40
  const require_filterToQuery = require("./filters/converters/filterToQuery.cjs");
32
41
  const require_filterUiToExpressionImpl = require("./filters/converters/filterUiToExpressionImpl.cjs");
33
42
  const require_distill = require("./filters/distill.cjs");
@@ -35,17 +44,14 @@ require("./filters/index.cjs");
35
44
  const require_state_migration = require("./components/PlDataTable/state-migration.cjs");
36
45
  const require_createPlDataTableSheet = require("./components/PlDataTable/createPlDataTableSheet.cjs");
37
46
  const require_column_snapshot = require("./columns/column_snapshot.cjs");
38
- const require_column_snapshot_provider = require("./columns/column_snapshot_provider.cjs");
39
- const require_column_selector = require("./columns/column_selector.cjs");
40
- const require_column_collection_builder = require("./columns/column_collection_builder.cjs");
41
- const require_ctx_column_sources = require("./columns/ctx_column_sources.cjs");
42
47
  const require_expand_by_partition = require("./columns/expand_by_partition.cjs");
43
48
  require("./columns/index.cjs");
49
+ const require_derive_distinct_tooltips = require("./labels/derive_distinct_tooltips.cjs");
44
50
  const require_utils = require("./components/PlDataTable/createPlDataTable/utils.cjs");
45
51
  const require_createPlDataTableV2 = require("./components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs");
46
52
  const require_discoverColumns = require("./components/PlDataTable/createPlDataTable/discoverColumns.cjs");
47
53
  const require_createPlDataTableV3 = require("./components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs");
48
- const require_index$5 = require("./components/PlDataTable/createPlDataTable/index.cjs");
54
+ const require_index$6 = require("./components/PlDataTable/createPlDataTable/index.cjs");
49
55
  const require_PlMultiSequenceAlignment = require("./components/PlMultiSequenceAlignment.cjs");
50
56
  const require_PlSelectionModel = require("./components/PlSelectionModel.cjs");
51
57
  require("./components/index.cjs");
@@ -55,9 +61,7 @@ const require_ref_util = require("./ref_util.cjs");
55
61
  const require_raw_globals = require("./raw_globals.cjs");
56
62
  const require_converter = require("./annotations/converter.cjs");
57
63
  require("./annotations/index.cjs");
58
- const require_index$9 = require("./pframe_utils/index.cjs");
59
- const require_service_bridge = require("./services/service_bridge.cjs");
60
- require("./services/index.cjs");
64
+ const require_index$10 = require("./pframe_utils/index.cjs");
61
65
  const require_env_value = require("./env_value.cjs");
62
66
  exports.Args = require_actions.Args;
63
67
  exports.ArrayColumnProvider = require_column_snapshot_provider.ArrayColumnProvider;
@@ -110,6 +114,8 @@ exports.UiState = require_actions.UiState;
110
114
  exports.allPColumnsReady = require_pcolumn_data.allPColumnsReady;
111
115
  exports.and = require_actions.and;
112
116
  exports.blockServiceNames = require_block_services.blockServiceNames;
117
+ exports.buildDatasetOptions = require_build_dataset_options.buildDatasetOptions;
118
+ exports.buildRefMap = require_filter_discovery.buildRefMap;
113
119
  exports.buildServices = require_service_bridge.buildServices;
114
120
  exports.collectCtxColumnSnapshotProviders = require_ctx_column_sources.collectCtxColumnSnapshotProviders;
115
121
  exports.compileAnnotationScript = require_filters_ui.compileAnnotationScript;
@@ -125,9 +131,8 @@ exports.convertRelaxedColumnSelectorToMultiColumnSelector = require_column_selec
125
131
  exports.createBlockStorage = require_block_storage.createBlockStorage;
126
132
  exports.createColumnSnapshot = require_column_snapshot.createColumnSnapshot;
127
133
  exports.createDefaultPTableParams = require_state_migration.createDefaultPTableParams;
128
- exports.createNodeServiceProxy = require_service_bridge.createNodeServiceProxy;
129
134
  exports.createPFrameForGraphs = require_PFrameForGraphs.createPFrameForGraphs;
130
- exports.createPlDataTable = require_index$5.createPlDataTable;
135
+ exports.createPlDataTable = require_index$6.createPlDataTable;
131
136
  exports.createPlDataTableSheet = require_createPlDataTableSheet.createPlDataTableSheet;
132
137
  exports.createPlDataTableStateV2 = require_state_migration.createPlDataTableStateV2;
133
138
  exports.createPlDataTableV2 = require_createPlDataTableV2.createPlDataTableV2;
@@ -135,8 +140,10 @@ exports.createPlDataTableV3 = require_createPlDataTableV3.createPlDataTableV3;
135
140
  exports.createPlSelectionModel = require_PlSelectionModel.createPlSelectionModel;
136
141
  exports.createReadyColumnData = require_column_snapshot.createReadyColumnData;
137
142
  exports.createRowSelectionColumn = require_PlMultiSequenceAlignment.createRowSelectionColumn;
143
+ exports.createServiceProxy = require_service_bridge.createServiceProxy;
138
144
  exports.deriveDataFromStorage = require_block_storage.deriveDataFromStorage;
139
145
  exports.deriveDistinctLabels = require_derive_distinct_labels.deriveDistinctLabels;
146
+ exports.deriveDistinctTooltips = require_derive_distinct_tooltips.deriveDistinctTooltips;
140
147
  exports.deriveLabels = require_label.deriveLabels;
141
148
  exports.discoverTableColumnSnaphots = require_discoverColumns.discoverTableColumnSnaphots;
142
149
  exports.distillFilterSpec = require_distill.distillFilterSpec;
@@ -146,20 +153,22 @@ exports.expandByPartition = require_expand_by_partition.expandByPartition;
146
153
  exports.extractArchiveAndGetURL = require_actions.extractArchiveAndGetURL;
147
154
  exports.extractConfig = require_normalization.extractConfig;
148
155
  exports.filterDataInfoEntries = require_axis_filtering.filterDataInfoEntries;
156
+ exports.filterMatchesToOptions = require_filter_discovery.filterMatchesToOptions;
149
157
  exports.filterSpecToSpecQueryExpr = require_filterToQuery.filterSpecToSpecQueryExpr;
158
+ exports.findFilterColumns = require_filter_discovery.findFilterColumns;
150
159
  exports.flatten = require_actions.flatten;
151
160
  exports.fromPlOption = require_ref_util.fromPlOption;
152
161
  exports.fromPlRef = require_ref_util.fromPlRef;
153
162
  exports.getAllRelatedColumns = require_columns.getAllRelatedColumns;
154
163
  exports.getAvailableWithLinkersAxes = require_axes.getAvailableWithLinkersAxes;
155
- exports.getAxisUniqueValues = require_index$9.getAxisUniqueValues;
164
+ exports.getAxisUniqueValues = require_index$10.getAxisUniqueValues;
156
165
  exports.getBlobContent = require_actions.getBlobContent;
157
166
  exports.getBlobContentAsJson = require_actions.getBlobContentAsJson;
158
167
  exports.getBlobContentAsString = require_actions.getBlobContentAsString;
159
- exports.getColumnOrAxisValueLabelsId = require_index$9.getColumnOrAxisValueLabelsId;
160
- exports.getColumnSpecById = require_index$9.getColumnSpecById;
161
- exports.getColumnUniqueValues = require_index$9.getColumnUniqueValues;
162
- exports.getColumnsFull = require_index$9.getColumnsFull;
168
+ exports.getColumnOrAxisValueLabelsId = require_index$10.getColumnOrAxisValueLabelsId;
169
+ exports.getColumnSpecById = require_index$10.getColumnSpecById;
170
+ exports.getColumnUniqueValues = require_index$10.getColumnUniqueValues;
171
+ exports.getColumnsFull = require_index$10.getColumnsFull;
163
172
  exports.getDownloadedBlobContent = require_actions.getDownloadedBlobContent;
164
173
  exports.getEffectiveVisibility = require_utils.getEffectiveVisibility;
165
174
  exports.getEnvironmentValue = require_env_value.getEnvironmentValue;
@@ -178,13 +187,14 @@ exports.getProgressLog = require_actions.getProgressLog;
178
187
  exports.getProgressLogWithInfo = require_actions.getProgressLogWithInfo;
179
188
  exports.getRawPlatformaInstance = require_raw_globals.getRawPlatformaInstance;
180
189
  exports.getRelatedColumns = require_columns.getRelatedColumns;
181
- exports.getRequestColumnsFromSelectedSources = require_index$9.getRequestColumnsFromSelectedSources;
190
+ exports.getRequestColumnsFromSelectedSources = require_index$10.getRequestColumnsFromSelectedSources;
182
191
  exports.getResourceField = require_actions.getResourceField;
183
192
  exports.getResourceValueAsJson = require_actions.getResourceValueAsJson;
184
- exports.getSingleColumnData = require_index$9.getSingleColumnData;
193
+ exports.getService = require_get_services.getService;
194
+ exports.getSingleColumnData = require_index$10.getSingleColumnData;
185
195
  exports.getStorageData = require_block_storage.getStorageData;
186
196
  exports.getUniquePartitionKeys = require_pcolumn_data.getUniquePartitionKeys;
187
- exports.getUniqueSourceValuesWithLabels = require_index$9.getUniqueSourceValuesWithLabels;
197
+ exports.getUniqueSourceValuesWithLabels = require_index$10.getUniqueSourceValuesWithLabels;
188
198
  exports.ifDef = require_accessor.ifDef;
189
199
  exports.isBlockStorage = require_block_storage.isBlockStorage;
190
200
  exports.isColumnHidden = require_utils.isColumnHidden;