@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.
- package/dist/block_model.cjs +8 -11
- package/dist/block_model.cjs.map +1 -1
- package/dist/block_model.d.ts.map +1 -1
- package/dist/block_model.js +8 -10
- package/dist/block_model.js.map +1 -1
- package/dist/block_state_util.cjs +2 -1
- package/dist/block_state_util.cjs.map +1 -1
- package/dist/block_state_util.js +2 -1
- package/dist/block_state_util.js.map +1 -1
- package/dist/columns/column_collection_builder.cjs +62 -75
- package/dist/columns/column_collection_builder.cjs.map +1 -1
- package/dist/columns/column_collection_builder.d.ts +17 -23
- package/dist/columns/column_collection_builder.d.ts.map +1 -1
- package/dist/columns/column_collection_builder.js +63 -76
- package/dist/columns/column_collection_builder.js.map +1 -1
- package/dist/columns/column_selector.cjs.map +1 -1
- package/dist/columns/column_selector.d.ts +1 -1
- package/dist/columns/column_selector.js.map +1 -1
- package/dist/columns/column_snapshot.cjs.map +1 -1
- package/dist/columns/column_snapshot.d.ts +4 -4
- package/dist/columns/column_snapshot.d.ts.map +1 -1
- package/dist/columns/column_snapshot.js.map +1 -1
- package/dist/columns/ctx_column_sources.cjs.map +1 -1
- package/dist/columns/ctx_column_sources.d.ts +1 -1
- package/dist/columns/ctx_column_sources.d.ts.map +1 -1
- package/dist/columns/ctx_column_sources.js.map +1 -1
- package/dist/columns/index.cjs +2 -2
- package/dist/columns/index.d.ts +1 -1
- package/dist/columns/index.js +2 -2
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs +2 -2
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js +2 -2
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs +17 -18
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js +17 -18
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs +99 -91
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +17 -17
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js +102 -94
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs +32 -23
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts +6 -6
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js +33 -24
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/index.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/index.d.ts +2 -3
- package/dist/components/PlDataTable/createPlDataTable/index.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/index.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.cjs +133 -16
- package/dist/components/PlDataTable/createPlDataTable/utils.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.d.ts +8 -6
- package/dist/components/PlDataTable/createPlDataTable/utils.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.js +130 -17
- package/dist/components/PlDataTable/createPlDataTable/utils.js.map +1 -1
- package/dist/components/PlDataTable/labels.cjs +1 -2
- package/dist/components/PlDataTable/labels.cjs.map +1 -1
- package/dist/components/PlDataTable/labels.js +1 -2
- package/dist/components/PlDataTable/labels.js.map +1 -1
- package/dist/components/PlDatasetSelector/build_dataset_options.cjs +41 -0
- package/dist/components/PlDatasetSelector/build_dataset_options.cjs.map +1 -0
- package/dist/components/PlDatasetSelector/build_dataset_options.d.ts +19 -0
- package/dist/components/PlDatasetSelector/build_dataset_options.d.ts.map +1 -0
- package/dist/components/PlDatasetSelector/build_dataset_options.js +41 -0
- package/dist/components/PlDatasetSelector/build_dataset_options.js.map +1 -0
- package/dist/components/PlDatasetSelector/filter_discovery.cjs +60 -0
- package/dist/components/PlDatasetSelector/filter_discovery.cjs.map +1 -0
- package/dist/components/PlDatasetSelector/filter_discovery.d.ts +31 -0
- package/dist/components/PlDatasetSelector/filter_discovery.d.ts.map +1 -0
- package/dist/components/PlDatasetSelector/filter_discovery.js +56 -0
- package/dist/components/PlDatasetSelector/filter_discovery.js.map +1 -0
- package/dist/components/PlDatasetSelector/index.cjs +2 -0
- package/dist/components/PlDatasetSelector/index.d.ts +2 -0
- package/dist/components/PlDatasetSelector/index.js +2 -0
- package/dist/components/index.cjs +3 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.js +3 -0
- package/dist/filters/distill.cjs +73 -30
- package/dist/filters/distill.cjs.map +1 -1
- package/dist/filters/distill.d.ts.map +1 -1
- package/dist/filters/distill.js +73 -30
- package/dist/filters/distill.js.map +1 -1
- package/dist/index.cjs +29 -19
- package/dist/index.d.ts +10 -6
- package/dist/index.js +12 -8
- package/dist/labels/derive_distinct_tooltips.cjs +85 -0
- package/dist/labels/derive_distinct_tooltips.cjs.map +1 -0
- package/dist/labels/derive_distinct_tooltips.d.ts +17 -0
- package/dist/labels/derive_distinct_tooltips.d.ts.map +1 -0
- package/dist/labels/derive_distinct_tooltips.js +84 -0
- package/dist/labels/derive_distinct_tooltips.js.map +1 -0
- package/dist/labels/index.cjs +1 -0
- package/dist/labels/index.d.ts +2 -1
- package/dist/labels/index.js +1 -0
- package/dist/package.cjs +1 -1
- package/dist/package.js +1 -1
- package/dist/render/api.cjs +8 -13
- package/dist/render/api.cjs.map +1 -1
- package/dist/render/api.d.ts +8 -11
- package/dist/render/api.d.ts.map +1 -1
- package/dist/render/api.js +8 -13
- package/dist/render/api.js.map +1 -1
- package/dist/services/get_services.cjs +19 -0
- package/dist/services/get_services.cjs.map +1 -0
- package/dist/services/get_services.d.ts +7 -0
- package/dist/services/get_services.d.ts.map +1 -0
- package/dist/services/get_services.js +19 -0
- package/dist/services/get_services.js.map +1 -0
- package/dist/services/index.cjs +1 -0
- package/dist/services/index.d.ts +2 -1
- package/dist/services/index.js +1 -0
- package/dist/services/service_bridge.cjs +4 -4
- package/dist/services/service_bridge.cjs.map +1 -1
- package/dist/services/service_bridge.d.ts +4 -4
- package/dist/services/service_bridge.d.ts.map +1 -1
- package/dist/services/service_bridge.js +4 -4
- package/dist/services/service_bridge.js.map +1 -1
- package/package.json +6 -6
- package/src/block_model.ts +8 -11
- package/src/block_state_util.ts +2 -1
- package/src/columns/column_collection_builder.test.ts +75 -30
- package/src/columns/column_collection_builder.ts +96 -133
- package/src/columns/column_selector.ts +1 -1
- package/src/columns/column_snapshot.ts +7 -4
- package/src/columns/ctx_column_sources.ts +1 -3
- package/src/components/PlDataTable/createPlDataTable/createPTableDefV2.ts +2 -2
- package/src/components/PlDataTable/createPlDataTable/createPTableDefV3.ts +44 -21
- package/src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts +202 -218
- package/src/components/PlDataTable/createPlDataTable/discoverColumns.ts +69 -56
- package/src/components/PlDataTable/createPlDataTable/index.ts +6 -7
- package/src/components/PlDataTable/createPlDataTable/utils.test.ts +97 -1
- package/src/components/PlDataTable/createPlDataTable/utils.ts +190 -35
- package/src/components/PlDataTable/labels.ts +3 -7
- package/src/components/PlDatasetSelector/build_dataset_options.ts +56 -0
- package/src/components/PlDatasetSelector/filter_discovery.test.ts +156 -0
- package/src/components/PlDatasetSelector/filter_discovery.ts +77 -0
- package/src/components/PlDatasetSelector/index.ts +2 -0
- package/src/components/index.ts +1 -0
- package/src/filters/distill.test.ts +91 -0
- package/src/filters/distill.ts +102 -46
- package/src/labels/derive_distinct_tooltips.test.ts +233 -0
- package/src/labels/derive_distinct_tooltips.ts +130 -0
- package/src/labels/index.ts +1 -0
- package/src/render/api.ts +15 -50
- package/src/services/get_services.ts +28 -0
- package/src/services/index.ts +1 -0
- 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"}
|
|
@@ -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";
|
package/dist/components/index.js
CHANGED
|
@@ -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";
|
package/dist/filters/distill.cjs
CHANGED
|
@@ -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
|
|
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":";;;;
|
|
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"}
|
package/dist/filters/distill.js
CHANGED
|
@@ -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
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
160
|
-
exports.getColumnSpecById = require_index$
|
|
161
|
-
exports.getColumnUniqueValues = require_index$
|
|
162
|
-
exports.getColumnsFull = require_index$
|
|
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$
|
|
190
|
+
exports.getRequestColumnsFromSelectedSources = require_index$10.getRequestColumnsFromSelectedSources;
|
|
182
191
|
exports.getResourceField = require_actions.getResourceField;
|
|
183
192
|
exports.getResourceValueAsJson = require_actions.getResourceValueAsJson;
|
|
184
|
-
exports.
|
|
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$
|
|
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;
|