@frictionless-ts/table 1.0.1
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/LICENSE.md +9 -0
- package/README.md +3 -0
- package/build/assets/geojson.json +216 -0
- package/build/assets/topojson.json +259 -0
- package/build/data/index.d.ts +2 -0
- package/build/data/index.js +2 -0
- package/build/data/record.d.ts +4 -0
- package/build/data/record.js +84 -0
- package/build/data/record.spec.d.ts +1 -0
- package/build/data/record.spec.js +269 -0
- package/build/dialect/Options.d.ts +3 -0
- package/build/dialect/Options.js +3 -0
- package/build/dialect/index.d.ts +2 -0
- package/build/dialect/index.js +2 -0
- package/build/dialect/infer.d.ts +4 -0
- package/build/dialect/infer.js +2 -0
- package/build/field/Field.d.ts +5 -0
- package/build/field/Field.js +2 -0
- package/build/field/Mapping.d.ts +11 -0
- package/build/field/Mapping.js +2 -0
- package/build/field/checks/enum.d.ts +8 -0
- package/build/field/checks/enum.js +71 -0
- package/build/field/checks/enum.spec.d.ts +1 -0
- package/build/field/checks/enum.spec.js +327 -0
- package/build/field/checks/maxLength.d.ts +7 -0
- package/build/field/checks/maxLength.js +17 -0
- package/build/field/checks/maxLength.spec.d.ts +1 -0
- package/build/field/checks/maxLength.spec.js +49 -0
- package/build/field/checks/maximum.d.ts +11 -0
- package/build/field/checks/maximum.js +73 -0
- package/build/field/checks/maximum.spec.d.ts +1 -0
- package/build/field/checks/maximum.spec.js +476 -0
- package/build/field/checks/minLength.d.ts +7 -0
- package/build/field/checks/minLength.js +17 -0
- package/build/field/checks/minLength.spec.d.ts +1 -0
- package/build/field/checks/minLength.spec.js +56 -0
- package/build/field/checks/minimum.d.ts +11 -0
- package/build/field/checks/minimum.js +73 -0
- package/build/field/checks/minimum.spec.d.ts +1 -0
- package/build/field/checks/minimum.spec.js +476 -0
- package/build/field/checks/pattern.d.ts +7 -0
- package/build/field/checks/pattern.js +17 -0
- package/build/field/checks/pattern.spec.d.ts +1 -0
- package/build/field/checks/pattern.spec.js +66 -0
- package/build/field/checks/required.d.ts +7 -0
- package/build/field/checks/required.js +14 -0
- package/build/field/checks/required.spec.d.ts +1 -0
- package/build/field/checks/required.spec.js +24 -0
- package/build/field/checks/type.d.ts +7 -0
- package/build/field/checks/type.js +14 -0
- package/build/field/checks/type.spec.d.ts +1 -0
- package/build/field/checks/type.spec.js +255 -0
- package/build/field/checks/unique.d.ts +7 -0
- package/build/field/checks/unique.js +17 -0
- package/build/field/checks/unique.spec.d.ts +1 -0
- package/build/field/checks/unique.spec.js +97 -0
- package/build/field/denormalize.d.ts +6 -0
- package/build/field/denormalize.js +13 -0
- package/build/field/desubstitute.d.ts +3 -0
- package/build/field/desubstitute.js +13 -0
- package/build/field/index.d.ts +8 -0
- package/build/field/index.js +6 -0
- package/build/field/inspect.d.ts +6 -0
- package/build/field/inspect.js +131 -0
- package/build/field/inspect.spec.d.ts +1 -0
- package/build/field/inspect.spec.js +385 -0
- package/build/field/narrow.d.ts +3 -0
- package/build/field/narrow.js +14 -0
- package/build/field/narrow.spec.d.ts +1 -0
- package/build/field/narrow.spec.js +52 -0
- package/build/field/normalize.d.ts +5 -0
- package/build/field/normalize.js +14 -0
- package/build/field/parse.d.ts +3 -0
- package/build/field/parse.js +47 -0
- package/build/field/parse.spec.d.ts +1 -0
- package/build/field/parse.spec.js +33 -0
- package/build/field/stringify.d.ts +3 -0
- package/build/field/stringify.js +43 -0
- package/build/field/stringify.spec.d.ts +1 -0
- package/build/field/stringify.spec.js +41 -0
- package/build/field/substitute.d.ts +3 -0
- package/build/field/substitute.js +16 -0
- package/build/field/types/array.d.ts +3 -0
- package/build/field/types/array.js +5 -0
- package/build/field/types/array.spec.d.ts +1 -0
- package/build/field/types/array.spec.js +358 -0
- package/build/field/types/boolean.d.ts +4 -0
- package/build/field/types/boolean.js +31 -0
- package/build/field/types/boolean.spec.d.ts +1 -0
- package/build/field/types/boolean.spec.js +76 -0
- package/build/field/types/date.d.ts +4 -0
- package/build/field/types/date.js +14 -0
- package/build/field/types/date.spec.d.ts +1 -0
- package/build/field/types/date.spec.js +52 -0
- package/build/field/types/datetime.d.ts +4 -0
- package/build/field/types/datetime.js +15 -0
- package/build/field/types/datetime.spec.d.ts +1 -0
- package/build/field/types/datetime.spec.js +62 -0
- package/build/field/types/duration.d.ts +4 -0
- package/build/field/types/duration.js +9 -0
- package/build/field/types/duration.spec.d.ts +1 -0
- package/build/field/types/duration.spec.js +37 -0
- package/build/field/types/geojson.d.ts +3 -0
- package/build/field/types/geojson.js +9 -0
- package/build/field/types/geojson.spec.d.ts +1 -0
- package/build/field/types/geojson.spec.js +522 -0
- package/build/field/types/geopoint.d.ts +4 -0
- package/build/field/types/geopoint.js +59 -0
- package/build/field/types/geopoint.spec.d.ts +1 -0
- package/build/field/types/geopoint.spec.js +173 -0
- package/build/field/types/integer.d.ts +4 -0
- package/build/field/types/integer.js +41 -0
- package/build/field/types/integer.spec.d.ts +1 -0
- package/build/field/types/integer.spec.js +102 -0
- package/build/field/types/json.d.ts +6 -0
- package/build/field/types/json.js +68 -0
- package/build/field/types/list.d.ts +4 -0
- package/build/field/types/list.js +30 -0
- package/build/field/types/list.spec.d.ts +1 -0
- package/build/field/types/list.spec.js +230 -0
- package/build/field/types/number.d.ts +4 -0
- package/build/field/types/number.js +50 -0
- package/build/field/types/number.spec.d.ts +1 -0
- package/build/field/types/number.spec.js +101 -0
- package/build/field/types/object.d.ts +3 -0
- package/build/field/types/object.js +5 -0
- package/build/field/types/object.spec.d.ts +1 -0
- package/build/field/types/object.spec.js +393 -0
- package/build/field/types/string.d.ts +4 -0
- package/build/field/types/string.js +32 -0
- package/build/field/types/string.spec.d.ts +1 -0
- package/build/field/types/string.spec.js +162 -0
- package/build/field/types/time.d.ts +4 -0
- package/build/field/types/time.js +18 -0
- package/build/field/types/time.spec.d.ts +1 -0
- package/build/field/types/time.spec.js +53 -0
- package/build/field/types/year.d.ts +4 -0
- package/build/field/types/year.js +16 -0
- package/build/field/types/year.spec.d.ts +1 -0
- package/build/field/types/year.spec.js +50 -0
- package/build/field/types/yearmonth.d.ts +4 -0
- package/build/field/types/yearmonth.js +14 -0
- package/build/field/types/yearmonth.spec.d.ts +1 -0
- package/build/field/types/yearmonth.spec.js +36 -0
- package/build/helpers.d.ts +4 -0
- package/build/helpers.js +12 -0
- package/build/index.d.ts +40 -0
- package/build/index.js +27 -0
- package/build/plugin.d.ts +27 -0
- package/build/plugin.js +2 -0
- package/build/plugins/arrow/index.d.ts +2 -0
- package/build/plugins/arrow/index.js +3 -0
- package/build/plugins/arrow/plugin.d.ts +7 -0
- package/build/plugins/arrow/plugin.js +22 -0
- package/build/plugins/arrow/plugin.spec.d.ts +1 -0
- package/build/plugins/arrow/plugin.spec.js +161 -0
- package/build/plugins/arrow/table/index.d.ts +2 -0
- package/build/plugins/arrow/table/index.js +3 -0
- package/build/plugins/arrow/table/load.d.ts +4 -0
- package/build/plugins/arrow/table/load.js +23 -0
- package/build/plugins/arrow/table/load.spec.d.ts +1 -0
- package/build/plugins/arrow/table/load.spec.js +56 -0
- package/build/plugins/arrow/table/save.d.ts +3 -0
- package/build/plugins/arrow/table/save.js +31 -0
- package/build/plugins/arrow/table/save.spec.d.ts +1 -0
- package/build/plugins/arrow/table/save.spec.js +81 -0
- package/build/plugins/csv/dialect/index.d.ts +1 -0
- package/build/plugins/csv/dialect/index.js +2 -0
- package/build/plugins/csv/dialect/infer.d.ts +4 -0
- package/build/plugins/csv/dialect/infer.js +44 -0
- package/build/plugins/csv/dialect/infer.spec.d.ts +1 -0
- package/build/plugins/csv/dialect/infer.spec.js +54 -0
- package/build/plugins/csv/index.d.ts +2 -0
- package/build/plugins/csv/index.js +3 -0
- package/build/plugins/csv/plugin.d.ts +8 -0
- package/build/plugins/csv/plugin.js +22 -0
- package/build/plugins/csv/plugin.spec.d.ts +1 -0
- package/build/plugins/csv/plugin.spec.js +161 -0
- package/build/plugins/csv/table/index.d.ts +2 -0
- package/build/plugins/csv/table/index.js +3 -0
- package/build/plugins/csv/table/load.d.ts +6 -0
- package/build/plugins/csv/table/load.js +86 -0
- package/build/plugins/csv/table/load.spec.d.ts +1 -0
- package/build/plugins/csv/table/load.spec.js +293 -0
- package/build/plugins/csv/table/save.d.ts +5 -0
- package/build/plugins/csv/table/save.js +29 -0
- package/build/plugins/csv/table/save.spec.d.ts +1 -0
- package/build/plugins/csv/table/save.spec.js +137 -0
- package/build/plugins/inline/index.d.ts +2 -0
- package/build/plugins/inline/index.js +3 -0
- package/build/plugins/inline/plugin.d.ts +7 -0
- package/build/plugins/inline/plugin.js +14 -0
- package/build/plugins/inline/table/index.d.ts +1 -0
- package/build/plugins/inline/table/index.js +2 -0
- package/build/plugins/inline/table/load.d.ts +6 -0
- package/build/plugins/inline/table/load.js +24 -0
- package/build/plugins/inline/table/load.spec.d.ts +1 -0
- package/build/plugins/inline/table/load.spec.js +160 -0
- package/build/plugins/json/buffer/decode.d.ts +4 -0
- package/build/plugins/json/buffer/decode.js +10 -0
- package/build/plugins/json/buffer/encode.d.ts +4 -0
- package/build/plugins/json/buffer/encode.js +8 -0
- package/build/plugins/json/buffer/index.d.ts +2 -0
- package/build/plugins/json/buffer/index.js +3 -0
- package/build/plugins/json/index.d.ts +2 -0
- package/build/plugins/json/index.js +3 -0
- package/build/plugins/json/plugin.d.ts +7 -0
- package/build/plugins/json/plugin.js +25 -0
- package/build/plugins/json/plugin.spec.d.ts +1 -0
- package/build/plugins/json/plugin.spec.js +163 -0
- package/build/plugins/json/table/index.d.ts +2 -0
- package/build/plugins/json/table/index.js +3 -0
- package/build/plugins/json/table/load.d.ts +6 -0
- package/build/plugins/json/table/load.js +55 -0
- package/build/plugins/json/table/load.spec.d.ts +1 -0
- package/build/plugins/json/table/load.spec.js +200 -0
- package/build/plugins/json/table/parse.d.ts +3 -0
- package/build/plugins/json/table/parse.js +6 -0
- package/build/plugins/json/table/save.d.ts +5 -0
- package/build/plugins/json/table/save.js +45 -0
- package/build/plugins/json/table/save.spec.d.ts +1 -0
- package/build/plugins/json/table/save.spec.js +147 -0
- package/build/plugins/ods/index.d.ts +2 -0
- package/build/plugins/ods/index.js +3 -0
- package/build/plugins/ods/plugin.d.ts +7 -0
- package/build/plugins/ods/plugin.js +23 -0
- package/build/plugins/ods/plugin.spec.d.ts +1 -0
- package/build/plugins/ods/plugin.spec.js +142 -0
- package/build/plugins/ods/table/index.d.ts +2 -0
- package/build/plugins/ods/table/index.js +3 -0
- package/build/plugins/ods/table/load.d.ts +4 -0
- package/build/plugins/ods/table/load.js +41 -0
- package/build/plugins/ods/table/load.spec.d.ts +1 -0
- package/build/plugins/ods/table/load.spec.js +167 -0
- package/build/plugins/ods/table/save.d.ts +3 -0
- package/build/plugins/ods/table/save.js +26 -0
- package/build/plugins/ods/table/save.spec.d.ts +1 -0
- package/build/plugins/ods/table/save.spec.js +75 -0
- package/build/plugins/ods/table/test.d.ts +5 -0
- package/build/plugins/ods/table/test.js +23 -0
- package/build/plugins/parquet/index.d.ts +2 -0
- package/build/plugins/parquet/index.js +3 -0
- package/build/plugins/parquet/plugin.d.ts +7 -0
- package/build/plugins/parquet/plugin.js +23 -0
- package/build/plugins/parquet/plugin.spec.d.ts +1 -0
- package/build/plugins/parquet/plugin.spec.js +142 -0
- package/build/plugins/parquet/table/index.d.ts +2 -0
- package/build/plugins/parquet/table/index.js +3 -0
- package/build/plugins/parquet/table/load.d.ts +4 -0
- package/build/plugins/parquet/table/load.js +23 -0
- package/build/plugins/parquet/table/load.spec.d.ts +1 -0
- package/build/plugins/parquet/table/load.spec.js +56 -0
- package/build/plugins/parquet/table/save.d.ts +3 -0
- package/build/plugins/parquet/table/save.js +32 -0
- package/build/plugins/parquet/table/save.spec.d.ts +1 -0
- package/build/plugins/parquet/table/save.spec.js +81 -0
- package/build/plugins/xlxs/index.d.ts +2 -0
- package/build/plugins/xlxs/index.js +3 -0
- package/build/plugins/xlxs/plugin.d.ts +7 -0
- package/build/plugins/xlxs/plugin.js +23 -0
- package/build/plugins/xlxs/plugin.spec.d.ts +1 -0
- package/build/plugins/xlxs/plugin.spec.js +142 -0
- package/build/plugins/xlxs/table/index.d.ts +2 -0
- package/build/plugins/xlxs/table/index.js +3 -0
- package/build/plugins/xlxs/table/load.d.ts +4 -0
- package/build/plugins/xlxs/table/load.js +43 -0
- package/build/plugins/xlxs/table/load.spec.d.ts +1 -0
- package/build/plugins/xlxs/table/load.spec.js +167 -0
- package/build/plugins/xlxs/table/save.d.ts +3 -0
- package/build/plugins/xlxs/table/save.js +28 -0
- package/build/plugins/xlxs/table/save.spec.d.ts +1 -0
- package/build/plugins/xlxs/table/save.spec.js +75 -0
- package/build/plugins/xlxs/table/test.d.ts +5 -0
- package/build/plugins/xlxs/table/test.js +23 -0
- package/build/schema/Mapping.d.ts +6 -0
- package/build/schema/Mapping.js +2 -0
- package/build/schema/Options.d.ts +22 -0
- package/build/schema/Options.js +2 -0
- package/build/schema/Schema.d.ts +4 -0
- package/build/schema/Schema.js +2 -0
- package/build/schema/helpers.d.ts +3 -0
- package/build/schema/helpers.js +6 -0
- package/build/schema/index.d.ts +8 -0
- package/build/schema/index.js +5 -0
- package/build/schema/infer.d.ts +13 -0
- package/build/schema/infer.js +199 -0
- package/build/schema/infer.spec.d.ts +1 -0
- package/build/schema/infer.spec.js +304 -0
- package/build/schema/match.d.ts +6 -0
- package/build/schema/match.js +8 -0
- package/build/table/Frame.d.ts +2 -0
- package/build/table/Frame.js +2 -0
- package/build/table/Table.d.ts +2 -0
- package/build/table/Table.js +2 -0
- package/build/table/checks/unique.d.ts +7 -0
- package/build/table/checks/unique.js +23 -0
- package/build/table/checks/unique.spec.d.ts +1 -0
- package/build/table/checks/unique.spec.js +187 -0
- package/build/table/denormalize.d.ts +6 -0
- package/build/table/denormalize.js +15 -0
- package/build/table/helpers.d.ts +19 -0
- package/build/table/helpers.js +62 -0
- package/build/table/helpers.spec.d.ts +1 -0
- package/build/table/helpers.spec.js +352 -0
- package/build/table/index.d.ts +9 -0
- package/build/table/index.js +8 -0
- package/build/table/inspect.d.ts +8 -0
- package/build/table/inspect.js +165 -0
- package/build/table/inspect.spec.d.ts +1 -0
- package/build/table/inspect.spec.js +335 -0
- package/build/table/normalize.d.ts +6 -0
- package/build/table/normalize.js +27 -0
- package/build/table/normalize.spec.d.ts +1 -0
- package/build/table/normalize.spec.js +222 -0
- package/build/table/query.d.ts +3 -0
- package/build/table/query.js +6 -0
- package/package.json +45 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import * as pl from "nodejs-polars";
|
|
3
|
+
import pAll from "p-all";
|
|
4
|
+
import { inspectField } from "../field/index.js";
|
|
5
|
+
import { arrayDiff } from "../helpers.js";
|
|
6
|
+
import { matchSchemaField } from "../schema/index.js";
|
|
7
|
+
import { getPolarsSchema } from "../schema/index.js";
|
|
8
|
+
import { createChecksRowUnique } from "./checks/unique.js";
|
|
9
|
+
export async function inspectTable(table, options) {
|
|
10
|
+
const { schema, sampleRows = 100, maxErrors = 1000 } = options ?? {};
|
|
11
|
+
const errors = [];
|
|
12
|
+
if (schema) {
|
|
13
|
+
const sample = await table.head(sampleRows).collect();
|
|
14
|
+
const polarsSchema = getPolarsSchema(sample.schema);
|
|
15
|
+
const mapping = { source: polarsSchema, target: schema };
|
|
16
|
+
const matchErrors = inspectFieldsMatch(mapping);
|
|
17
|
+
errors.push(...matchErrors);
|
|
18
|
+
const fieldErrors = await inspectFields(mapping, table, { maxErrors });
|
|
19
|
+
errors.push(...fieldErrors);
|
|
20
|
+
const rowErrors = await inspectRows(mapping, table, { maxErrors });
|
|
21
|
+
errors.push(...rowErrors);
|
|
22
|
+
}
|
|
23
|
+
return errors.slice(0, maxErrors);
|
|
24
|
+
}
|
|
25
|
+
function inspectFieldsMatch(mapping) {
|
|
26
|
+
const errors = [];
|
|
27
|
+
const fieldsMatch = mapping.target.fieldsMatch ?? "exact";
|
|
28
|
+
const fields = mapping.target.fields;
|
|
29
|
+
const polarsFields = mapping.source.fields;
|
|
30
|
+
const names = fields.map(field => field.name);
|
|
31
|
+
const polarsNames = polarsFields.map(field => field.name);
|
|
32
|
+
const requiredNames = fields
|
|
33
|
+
.filter(field => field.constraints?.required)
|
|
34
|
+
.map(field => field.name);
|
|
35
|
+
const extraFields = polarsFields.length - fields.length;
|
|
36
|
+
const missingFields = fields.length - polarsFields.length;
|
|
37
|
+
const extraNames = arrayDiff(polarsNames, names);
|
|
38
|
+
const missingNames = arrayDiff(names, polarsNames);
|
|
39
|
+
const missingRequiredNames = arrayDiff(requiredNames, polarsNames);
|
|
40
|
+
if (fieldsMatch === "exact") {
|
|
41
|
+
if (extraFields > 0) {
|
|
42
|
+
errors.push({
|
|
43
|
+
type: "fields/extra",
|
|
44
|
+
fieldNames: extraNames,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
if (missingFields > 0) {
|
|
48
|
+
errors.push({
|
|
49
|
+
type: "fields/missing",
|
|
50
|
+
fieldNames: missingNames,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (fieldsMatch === "equal") {
|
|
55
|
+
if (extraNames.length > 0) {
|
|
56
|
+
errors.push({
|
|
57
|
+
type: "fields/extra",
|
|
58
|
+
fieldNames: extraNames,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (missingRequiredNames.length > 0) {
|
|
62
|
+
errors.push({
|
|
63
|
+
type: "fields/missing",
|
|
64
|
+
fieldNames: missingRequiredNames,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (fieldsMatch === "subset") {
|
|
69
|
+
if (missingRequiredNames.length > 0) {
|
|
70
|
+
errors.push({
|
|
71
|
+
type: "fields/missing",
|
|
72
|
+
fieldNames: missingRequiredNames,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (fieldsMatch === "superset") {
|
|
77
|
+
if (extraNames.length > 0) {
|
|
78
|
+
errors.push({
|
|
79
|
+
type: "fields/extra",
|
|
80
|
+
fieldNames: extraNames,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (fieldsMatch === "partial") {
|
|
85
|
+
if (missingNames.length === fields.length) {
|
|
86
|
+
errors.push({
|
|
87
|
+
type: "fields/missing",
|
|
88
|
+
fieldNames: missingNames,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return errors;
|
|
93
|
+
}
|
|
94
|
+
async function inspectFields(mapping, table, options) {
|
|
95
|
+
const { maxErrors } = options;
|
|
96
|
+
const errors = [];
|
|
97
|
+
const fields = mapping.target.fields;
|
|
98
|
+
const concurrency = os.cpus().length;
|
|
99
|
+
const abortController = new AbortController();
|
|
100
|
+
const maxFieldErrors = Math.ceil(maxErrors / fields.length);
|
|
101
|
+
const collectFieldErrors = async (index, field) => {
|
|
102
|
+
const fieldMapping = matchSchemaField(mapping, field, index);
|
|
103
|
+
if (!fieldMapping)
|
|
104
|
+
return;
|
|
105
|
+
const fieldErrors = await inspectField(fieldMapping, table, {
|
|
106
|
+
maxErrors: maxFieldErrors,
|
|
107
|
+
});
|
|
108
|
+
errors.push(...fieldErrors);
|
|
109
|
+
if (errors.length > maxErrors) {
|
|
110
|
+
abortController.abort();
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
try {
|
|
114
|
+
await pAll(fields.map((field, index) => () => collectFieldErrors(index, field)), { concurrency });
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
const isAborted = error instanceof Error && error.name === "AbortError";
|
|
118
|
+
if (!isAborted)
|
|
119
|
+
throw error;
|
|
120
|
+
}
|
|
121
|
+
return errors;
|
|
122
|
+
}
|
|
123
|
+
async function inspectRows(mapping, table, options) {
|
|
124
|
+
const { maxErrors } = options;
|
|
125
|
+
const errors = [];
|
|
126
|
+
const fields = mapping.target.fields;
|
|
127
|
+
const concurrency = os.cpus().length - 1;
|
|
128
|
+
const abortController = new AbortController();
|
|
129
|
+
const maxRowErrors = Math.ceil(maxErrors / fields.length);
|
|
130
|
+
const collectRowErrors = async (check) => {
|
|
131
|
+
const rowCheckTable = table
|
|
132
|
+
.withRowCount()
|
|
133
|
+
.withColumn(pl.col("row_nr").add(1))
|
|
134
|
+
.rename({ row_nr: "dpkit:number" })
|
|
135
|
+
.withColumn(pl
|
|
136
|
+
.when(check.isErrorExpr)
|
|
137
|
+
.then(pl.lit(JSON.stringify(check.errorTemplate)))
|
|
138
|
+
.otherwise(pl.lit(null))
|
|
139
|
+
.alias("dpkit:error"));
|
|
140
|
+
const rowCheckFrame = await rowCheckTable
|
|
141
|
+
.filter(pl.col("dpkit:error").isNotNull())
|
|
142
|
+
.head(maxRowErrors)
|
|
143
|
+
.collect();
|
|
144
|
+
for (const row of rowCheckFrame.toRecords()) {
|
|
145
|
+
const errorTemplate = JSON.parse(row["dpkit:error"]);
|
|
146
|
+
errors.push({
|
|
147
|
+
...errorTemplate,
|
|
148
|
+
rowNumber: row["dpkit:number"],
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
if (errors.length > maxErrors) {
|
|
152
|
+
abortController.abort();
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
try {
|
|
156
|
+
await pAll([...createChecksRowUnique(mapping)].map(it => () => collectRowErrors(it)), { concurrency });
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
const isAborted = error instanceof Error && error.name === "AbortError";
|
|
160
|
+
if (!isAborted)
|
|
161
|
+
throw error;
|
|
162
|
+
}
|
|
163
|
+
return errors;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RhYmxlL2luc3BlY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBSXhCLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sSUFBSSxNQUFNLE9BQU8sQ0FBQTtBQUN4QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFHcEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFFMUQsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBQ2hDLEtBQVksRUFDWixPQUlDO0lBRUQsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEdBQUcsR0FBRyxFQUFFLFNBQVMsR0FBRyxJQUFJLEVBQUUsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFBO0lBQ3BFLE1BQU0sTUFBTSxHQUFpQixFQUFFLENBQUE7SUFFL0IsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLE1BQU0sTUFBTSxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUNyRCxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ25ELE1BQU0sT0FBTyxHQUFHLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUE7UUFFeEQsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxH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TUFBTSxHQUFHLElBQUksYUFBYSxDQUFDLFNBQVMsRUFBVyxFQUFFLENBQUM7WUFDckQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQWEsQ0FBQTtZQUNoRSxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNWLEdBQUcsYUFBYTtnQkFDaEIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxjQUFjLENBQUM7YUFDL0IsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxTQUFTLEVBQUUsQ0FBQztZQUM5QixlQUFlLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDekIsQ0FBQztJQUNILENBQUMsQ0FBQTtJQUVELElBQUksQ0FBQztRQUNILE1BQU0sSUFBSSxDQUNSLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ3pFLEVBQUUsV0FBVyxFQUFFLENBQ2hCLENBQUE7SUFDSCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sU0FBUyxHQUFHLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxZQUFZLENBQUE7UUFDdkUsSUFBSSxDQUFDLFNBQVM7WUFBRSxNQUFNLEtBQUssQ0FBQTtJQUM3QixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCJcbmltcG9ydCB0eXBlIHsgRmllbGQsIFNjaGVtYSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgUm93RXJyb3IgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IFRhYmxlRXJyb3IgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5pbXBvcnQgcEFsbCBmcm9tIFwicC1hbGxcIlxuaW1wb3J0IHsgaW5zcGVjdEZpZWxkIH0gZnJvbSBcIi4uL2ZpZWxkL2luZGV4LnRzXCJcbmltcG9ydCB7IGFycmF5RGlmZiB9IGZyb20gXCIuLi9oZWxwZXJzLnRzXCJcbmltcG9ydCB7IG1hdGNoU2NoZW1hRmllbGQgfSBmcm9tIFwiLi4vc2NoZW1hL2luZGV4LnRzXCJcbmltcG9ydCB7IGdldFBvbGFyc1NjaGVtYSB9IGZyb20gXCIuLi9zY2hlbWEvaW5kZXgudHNcIlxuaW1wb3J0IHR5cGUgeyBTY2hlbWFNYXBwaW5nIH0gZnJvbSBcIi4uL3NjaGVtYS9pbmRleC50c1wiXG5pbXBvcnQgdHlwZSB7IFRhYmxlIH0gZnJvbSBcIi4vVGFibGUudHNcIlxuaW1wb3J0IHsgY3JlYXRlQ2hlY2tzUm93VW5pcXVlIH0gZnJvbSBcIi4vY2hlY2tzL3VuaXF1ZS50c1wiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnNwZWN0VGFibGUoXG4gIHRhYmxlOiBUYWJsZSxcbiAgb3B0aW9ucz86IHtcbiAgICBzY2hlbWE/OiBTY2hlbWFcbiAgICBzYW1wbGVSb3dzPzogbnVtYmVyXG4gICAgbWF4RXJyb3JzPzogbnVtYmVyXG4gIH0sXG4pIHtcbiAgY29uc3QgeyBzY2hlbWEsIHNhbXBsZVJvd3MgPSAxMDAsIG1heEVycm9ycyA9IDEwMDAgfSA9IG9wdGlvbnMgPz8ge31cbiAgY29uc3QgZXJyb3JzOiBUYWJsZUVycm9yW10gPSBbXVxuXG4gIGlmIChzY2hlbWEpIHtcbiAgICBjb25zdCBzYW1wbGUgPSBhd2FpdCB0YWJsZS5oZWFkKHNhbXBsZVJvd3MpLmNvbGxlY3QoKVxuICAgIGNvbnN0IHBvbGFyc1NjaGVtYSA9IGdldFBvbGFyc1NjaGVtYShzYW1wbGUuc2NoZW1hKVxuICAgIGNvbnN0IG1hcHBpbmcgPSB7IHNvdXJjZTogcG9sYXJzU2NoZW1hLCB0YXJnZXQ6IHNjaGVtYSB9XG5cbiAgICBjb25zdCBtYXRjaEVycm9ycyA9IGluc3BlY3RGaWVsZHNNYXRjaChtYXBwaW5nKVxuICAgIGVycm9ycy5wdXNoKC4uLm1hdGNoRXJyb3JzKVxuXG4gICAgY29uc3QgZmllbGRFcnJvcnMgPSBhd2FpdCBpbnNwZWN0RmllbGRzKG1hcHBpbmcsIHRhYmxlLCB7IG1heEVycm9ycyB9KVxuICAgIGVycm9ycy5wdXNoKC4uLmZpZWxkRXJyb3JzKVxuXG4gICAgY29uc3Qgcm93RXJyb3JzID0gYXdhaXQgaW5zcGVjdFJvd3MobWFwcGluZywgdGFibGUsIHsgbWF4RXJyb3JzIH0pXG4gICAgZXJyb3JzLnB1c2goLi4ucm93RXJyb3JzKVxuICB9XG5cbiAgcmV0dXJuIGVycm9ycy5zbGljZSgwLCBtYXhFcnJvcnMpXG59XG5cbmZ1bmN0aW9uIGluc3BlY3RGaWVsZHNNYXRjaChtYXBwaW5nOiBTY2hlbWFNYXBwaW5nKSB7XG4gIGNvbnN0IGVycm9yczogVGFibGVFcnJvcltdID0gW11cbiAgY29uc3QgZmllbGRzTWF0Y2ggPSBtYXBwaW5nLnRhcmdldC5maWVsZHNNYXRjaCA/PyBcImV4YWN0XCJcblxuICBjb25zdCBmaWVsZHMgPSBtYXBwaW5nLnRhcmdldC5maWVsZHNcbiAgY29uc3QgcG9sYXJzRmllbGRzID0gbWFwcGluZy5zb3VyY2UuZmllbGRzXG5cbiAgY29uc3QgbmFtZXMgPSBmaWVsZHMubWFwKGZpZWxkID0+IGZpZWxkLm5hbWUpXG4gIGNvbnN0IHBvbGFyc05hbWVzID0gcG9sYXJzRmllbGRzLm1hcChmaWVsZCA9PiBmaWVsZC5uYW1lKVxuXG4gIGNvbnN0IHJlcXVpcmVkTmFtZXMgPSBmaWVsZHNcbiAgICAuZmlsdGVyKGZpZWxkID0+IGZpZWxkLmNvbnN0cmFpbnRzPy5yZXF1aXJlZClcbiAgICAubWFwKGZpZWxkID0+IGZpZWxkLm5hbWUpXG5cbiAgY29uc3QgZXh0cmFGaWVsZHMgPSBwb2xhcnNGaWVsZHMubGVuZ3RoIC0gZmllbGRzLmxlbmd0aFxuICBjb25zdCBtaXNzaW5nRmllbGRzID0gZmllbGRzLmxlbmd0aCAtIHBvbGFyc0ZpZWxkcy5sZW5ndGhcblxuICBjb25zdCBleHRyYU5hbWVzID0gYXJyYXlEaWZmKHBvbGFyc05hbWVzLCBuYW1lcylcbiAgY29uc3QgbWlzc2luZ05hbWVzID0gYXJyYXlEaWZmKG5hbWVzLCBwb2xhcnNOYW1lcylcbiAgY29uc3QgbWlzc2luZ1JlcXVpcmVkTmFtZXMgPSBhcnJheURpZmYocmVxdWlyZWROYW1lcywgcG9sYXJzTmFtZXMpXG5cbiAgaWYgKGZpZWxkc01hdGNoID09PSBcImV4YWN0XCIpIHtcbiAgICBpZiAoZXh0cmFGaWVsZHMgPiAwKSB7XG4gICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgIHR5cGU6IFwiZmllbGRzL2V4dHJhXCIsXG4gICAgICAgIGZpZWxkTmFtZXM6IGV4dHJhTmFtZXMsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChtaXNzaW5nRmllbGRzID4gMCkge1xuICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICB0eXBlOiBcImZpZWxkcy9taXNzaW5nXCIsXG4gICAgICAgIGZpZWxkTmFtZXM6IG1pc3NpbmdOYW1lcyxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaWYgKGZpZWxkc01hdGNoID09PSBcImVxdWFsXCIpIHtcbiAgICBpZiAoZXh0cmFOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgIHR5cGU6IFwiZmllbGRzL2V4dHJhXCIsXG4gICAgICAgIGZpZWxkTmFtZXM6IGV4dHJhTmFtZXMsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChtaXNzaW5nUmVxdWlyZWROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgIHR5cGU6IFwiZmllbGRzL21pc3NpbmdcIixcbiAgICAgICAgZmllbGROYW1lczogbWlzc2luZ1JlcXVpcmVkTmFtZXMsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGlmIChmaWVsZHNNYXRjaCA9PT0gXCJzdWJzZXRcIikge1xuICAgIGlmIChtaXNzaW5nUmVxdWlyZWROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgIHR5cGU6IFwiZmllbGRzL21pc3NpbmdcIixcbiAgICAgICAgZmllbGROYW1lczogbWlzc2luZ1JlcXVpcmVkTmFtZXMsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGlmIChmaWVsZHNNYXRjaCA9PT0gXCJzdXBlcnNldFwiKSB7XG4gICAgaWYgKGV4dHJhTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICB0eXBlOiBcImZpZWxkcy9leHRyYVwiLFxuICAgICAgICBmaWVsZE5hbWVzOiBleHRyYU5hbWVzLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBpZiAoZmllbGRzTWF0Y2ggPT09IFwicGFydGlhbFwiKSB7XG4gICAgaWYgKG1pc3NpbmdOYW1lcy5sZW5ndGggPT09IGZpZWxkcy5sZW5ndGgpIHtcbiAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgdHlwZTogXCJmaWVsZHMvbWlzc2luZ1wiLFxuICAgICAgICBmaWVsZE5hbWVzOiBtaXNzaW5nTmFtZXMsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlcnJvcnNcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5zcGVjdEZpZWxkcyhcbiAgbWFwcGluZzogU2NoZW1hTWFwcGluZyxcbiAgdGFibGU6IFRhYmxlLFxuICBvcHRpb25zOiB7XG4gICAgbWF4RXJyb3JzOiBudW1iZXJcbiAgfSxcbikge1xuICBjb25zdCB7IG1heEVycm9ycyB9ID0gb3B0aW9uc1xuICBjb25zdCBlcnJvcnM6IFRhYmxlRXJyb3JbXSA9IFtdXG4gIGNvbnN0IGZpZWxkcyA9IG1hcHBpbmcudGFyZ2V0LmZpZWxkc1xuICBjb25zdCBjb25jdXJyZW5jeSA9IG9zLmNwdXMoKS5sZW5ndGhcbiAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gIGNvbnN0IG1heEZpZWxkRXJyb3JzID0gTWF0aC5jZWlsKG1heEVycm9ycyAvIGZpZWxkcy5sZW5ndGgpXG5cbiAgY29uc3QgY29sbGVjdEZpZWxkRXJyb3JzID0gYXN5bmMgKGluZGV4OiBudW1iZXIsIGZpZWxkOiBGaWVsZCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkTWFwcGluZyA9IG1hdGNoU2NoZW1hRmllbGQobWFwcGluZywgZmllbGQsIGluZGV4KVxuICAgIGlmICghZmllbGRNYXBwaW5nKSByZXR1cm5cblxuICAgIGNvbnN0IGZpZWxkRXJyb3JzID0gYXdhaXQgaW5zcGVjdEZpZWxkKGZpZWxkTWFwcGluZywgdGFibGUsIHtcbiAgICAgIG1heEVycm9yczogbWF4RmllbGRFcnJvcnMsXG4gICAgfSlcblxuICAgIGVycm9ycy5wdXNoKC4uLmZpZWxkRXJyb3JzKVxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gbWF4RXJyb3JzKSB7XG4gICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKVxuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgcEFsbChcbiAgICAgIGZpZWxkcy5tYXAoKGZpZWxkLCBpbmRleCkgPT4gKCkgPT4gY29sbGVjdEZpZWxkRXJyb3JzKGluZGV4LCBmaWVsZCkpLFxuICAgICAgeyBjb25jdXJyZW5jeSB9LFxuICAgIClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBpc0Fib3J0ZWQgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiXG4gICAgaWYgKCFpc0Fib3J0ZWQpIHRocm93IGVycm9yXG4gIH1cblxuICByZXR1cm4gZXJyb3JzXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluc3BlY3RSb3dzKFxuICBtYXBwaW5nOiBTY2hlbWFNYXBwaW5nLFxuICB0YWJsZTogVGFibGUsXG4gIG9wdGlvbnM6IHsgbWF4RXJyb3JzOiBudW1iZXIgfSxcbikge1xuICBjb25zdCB7IG1heEVycm9ycyB9ID0gb3B0aW9uc1xuICBjb25zdCBlcnJvcnM6IFRhYmxlRXJyb3JbXSA9IFtdXG4gIGNvbnN0IGZpZWxkcyA9IG1hcHBpbmcudGFyZ2V0LmZpZWxkc1xuICBjb25zdCBjb25jdXJyZW5jeSA9IG9zLmNwdXMoKS5sZW5ndGggLSAxXG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICBjb25zdCBtYXhSb3dFcnJvcnMgPSBNYXRoLmNlaWwobWF4RXJyb3JzIC8gZmllbGRzLmxlbmd0aClcblxuICBjb25zdCBjb2xsZWN0Um93RXJyb3JzID0gYXN5bmMgKGNoZWNrOiBhbnkpID0+IHtcbiAgICBjb25zdCByb3dDaGVja1RhYmxlID0gdGFibGVcbiAgICAgIC53aXRoUm93Q291bnQoKVxuICAgICAgLndpdGhDb2x1bW4ocGwuY29sKFwicm93X25yXCIpLmFkZCgxKSlcbiAgICAgIC5yZW5hbWUoeyByb3dfbnI6IFwiZHBraXQ6bnVtYmVyXCIgfSlcbiAgICAgIC53aXRoQ29sdW1uKFxuICAgICAgICBwbFxuICAgICAgICAgIC53aGVuKGNoZWNrLmlzRXJyb3JFeHByKVxuICAgICAgICAgIC50aGVuKHBsLmxpdChKU09OLnN0cmluZ2lmeShjaGVjay5lcnJvclRlbXBsYXRlKSkpXG4gICAgICAgICAgLm90aGVyd2lzZShwbC5saXQobnVsbCkpXG4gICAgICAgICAgLmFsaWFzKFwiZHBraXQ6ZXJyb3JcIiksXG4gICAgICApXG5cbiAgICBjb25zdCByb3dDaGVja0ZyYW1lID0gYXdhaXQgcm93Q2hlY2tUYWJsZVxuICAgICAgLmZpbHRlcihwbC5jb2woXCJkcGtpdDplcnJvclwiKS5pc05vdE51bGwoKSlcbiAgICAgIC5oZWFkKG1heFJvd0Vycm9ycylcbiAgICAgIC5jb2xsZWN0KClcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd0NoZWNrRnJhbWUudG9SZWNvcmRzKCkgYXMgYW55W10pIHtcbiAgICAgIGNvbnN0IGVycm9yVGVtcGxhdGUgPSBKU09OLnBhcnNlKHJvd1tcImRwa2l0OmVycm9yXCJdKSBhcyBSb3dFcnJvclxuICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAuLi5lcnJvclRlbXBsYXRlLFxuICAgICAgICByb3dOdW1iZXI6IHJvd1tcImRwa2l0Om51bWJlclwiXSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiBtYXhFcnJvcnMpIHtcbiAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpXG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBwQWxsKFxuICAgICAgWy4uLmNyZWF0ZUNoZWNrc1Jvd1VuaXF1ZShtYXBwaW5nKV0ubWFwKGl0ID0+ICgpID0+IGNvbGxlY3RSb3dFcnJvcnMoaXQpKSxcbiAgICAgIHsgY29uY3VycmVuY3kgfSxcbiAgICApXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgaXNBYm9ydGVkID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5uYW1lID09PSBcIkFib3J0RXJyb3JcIlxuICAgIGlmICghaXNBYm9ydGVkKSB0aHJvdyBlcnJvclxuICB9XG5cbiAgcmV0dXJuIGVycm9yc1xufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { inspectTable } from "./inspect.js";
|
|
4
|
+
describe("inspectTable", () => {
|
|
5
|
+
describe("fields validation with fieldsMatch='exact'", () => {
|
|
6
|
+
it("should pass when fields exactly match", async () => {
|
|
7
|
+
const table = pl
|
|
8
|
+
.DataFrame({
|
|
9
|
+
id: [1, 2],
|
|
10
|
+
name: ["John", "Jane"],
|
|
11
|
+
})
|
|
12
|
+
.lazy();
|
|
13
|
+
const schema = {
|
|
14
|
+
fields: [
|
|
15
|
+
{ name: "id", type: "number" },
|
|
16
|
+
{ name: "name", type: "string" },
|
|
17
|
+
],
|
|
18
|
+
};
|
|
19
|
+
const errors = await inspectTable(table, { schema });
|
|
20
|
+
expect(errors).toEqual([]);
|
|
21
|
+
});
|
|
22
|
+
it("should not have fields error when fields same length", async () => {
|
|
23
|
+
const table = pl
|
|
24
|
+
.DataFrame({
|
|
25
|
+
id: [1, 2],
|
|
26
|
+
age: [30, 25],
|
|
27
|
+
})
|
|
28
|
+
.lazy();
|
|
29
|
+
const schema = {
|
|
30
|
+
fieldsMatch: "exact",
|
|
31
|
+
fields: [
|
|
32
|
+
{ name: "id", type: "number" },
|
|
33
|
+
{ name: "name", type: "number" },
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
const errors = await inspectTable(table, { schema });
|
|
37
|
+
expect(errors).toEqual([
|
|
38
|
+
{
|
|
39
|
+
type: "field/name",
|
|
40
|
+
fieldName: "name",
|
|
41
|
+
actualFieldName: "age",
|
|
42
|
+
},
|
|
43
|
+
]);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
it("should detect extra fields", async () => {
|
|
47
|
+
const table = pl
|
|
48
|
+
.DataFrame({
|
|
49
|
+
id: [1, 2],
|
|
50
|
+
name: ["John", "Jane"],
|
|
51
|
+
age: [30, 25],
|
|
52
|
+
})
|
|
53
|
+
.lazy();
|
|
54
|
+
const schema = {
|
|
55
|
+
fields: [
|
|
56
|
+
{ name: "id", type: "number" },
|
|
57
|
+
{ name: "name", type: "string" },
|
|
58
|
+
],
|
|
59
|
+
};
|
|
60
|
+
const errors = await inspectTable(table, { schema });
|
|
61
|
+
expect(errors).toContainEqual({
|
|
62
|
+
type: "fields/extra",
|
|
63
|
+
fieldNames: ["age"],
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
it("should detect missing fields", async () => {
|
|
67
|
+
const table = pl
|
|
68
|
+
.DataFrame({
|
|
69
|
+
id: [1, 2],
|
|
70
|
+
})
|
|
71
|
+
.lazy();
|
|
72
|
+
const schema = {
|
|
73
|
+
fields: [
|
|
74
|
+
{ name: "id", type: "number" },
|
|
75
|
+
{ name: "name", type: "string" },
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
const errors = await inspectTable(table, { schema });
|
|
79
|
+
expect(errors).toContainEqual({
|
|
80
|
+
type: "fields/missing",
|
|
81
|
+
fieldNames: ["name"],
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe("fields validation with fieldsMatch='equal'", () => {
|
|
85
|
+
it("should pass when field names match regardless of order", async () => {
|
|
86
|
+
const table = pl
|
|
87
|
+
.DataFrame({
|
|
88
|
+
name: ["John", "Jane"],
|
|
89
|
+
id: [1, 2],
|
|
90
|
+
})
|
|
91
|
+
.lazy();
|
|
92
|
+
const schema = {
|
|
93
|
+
fieldsMatch: "equal",
|
|
94
|
+
fields: [
|
|
95
|
+
{ name: "id", type: "number" },
|
|
96
|
+
{ name: "name", type: "string" },
|
|
97
|
+
],
|
|
98
|
+
};
|
|
99
|
+
const errors = await inspectTable(table, { schema });
|
|
100
|
+
expect(errors).toEqual([]);
|
|
101
|
+
});
|
|
102
|
+
it("should detect extra fields", async () => {
|
|
103
|
+
const table = pl
|
|
104
|
+
.DataFrame({
|
|
105
|
+
id: [1, 2],
|
|
106
|
+
name: ["John", "Jane"],
|
|
107
|
+
age: [30, 25],
|
|
108
|
+
})
|
|
109
|
+
.lazy();
|
|
110
|
+
const schema = {
|
|
111
|
+
fieldsMatch: "equal",
|
|
112
|
+
fields: [
|
|
113
|
+
{ name: "id", type: "number" },
|
|
114
|
+
{ name: "name", type: "string" },
|
|
115
|
+
],
|
|
116
|
+
};
|
|
117
|
+
const errors = await inspectTable(table, { schema });
|
|
118
|
+
expect(errors).toContainEqual({
|
|
119
|
+
type: "fields/extra",
|
|
120
|
+
fieldNames: ["age"],
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
it("should detect missing fields", async () => {
|
|
124
|
+
const table = pl
|
|
125
|
+
.DataFrame({
|
|
126
|
+
id: [1, 2],
|
|
127
|
+
})
|
|
128
|
+
.lazy();
|
|
129
|
+
const schema = {
|
|
130
|
+
fieldsMatch: "equal",
|
|
131
|
+
fields: [
|
|
132
|
+
{ name: "id", type: "number" },
|
|
133
|
+
{
|
|
134
|
+
name: "name",
|
|
135
|
+
type: "string",
|
|
136
|
+
constraints: { required: true },
|
|
137
|
+
},
|
|
138
|
+
],
|
|
139
|
+
};
|
|
140
|
+
const errors = await inspectTable(table, { schema });
|
|
141
|
+
expect(errors).toContainEqual({
|
|
142
|
+
type: "fields/missing",
|
|
143
|
+
fieldNames: ["name"],
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
it("should pass when non-required fields are missing", async () => {
|
|
147
|
+
const table = pl
|
|
148
|
+
.DataFrame({
|
|
149
|
+
id: [1, 2],
|
|
150
|
+
})
|
|
151
|
+
.lazy();
|
|
152
|
+
const schema = {
|
|
153
|
+
fieldsMatch: "equal",
|
|
154
|
+
fields: [
|
|
155
|
+
{ name: "id", type: "number" },
|
|
156
|
+
{ name: "name", type: "string" },
|
|
157
|
+
],
|
|
158
|
+
};
|
|
159
|
+
const errors = await inspectTable(table, { schema });
|
|
160
|
+
expect(errors).toEqual([]);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
describe("fields validation with fieldsMatch='subset'", () => {
|
|
164
|
+
it("should pass when data contains all schema fields", async () => {
|
|
165
|
+
const table = pl
|
|
166
|
+
.DataFrame({
|
|
167
|
+
id: [1, 2],
|
|
168
|
+
name: ["John", "Jane"],
|
|
169
|
+
age: [30, 25],
|
|
170
|
+
})
|
|
171
|
+
.lazy();
|
|
172
|
+
const schema = {
|
|
173
|
+
fieldsMatch: "subset",
|
|
174
|
+
fields: [
|
|
175
|
+
{ name: "id", type: "number" },
|
|
176
|
+
{ name: "name", type: "string" },
|
|
177
|
+
],
|
|
178
|
+
};
|
|
179
|
+
const errors = await inspectTable(table, { schema });
|
|
180
|
+
expect(errors).toEqual([]);
|
|
181
|
+
});
|
|
182
|
+
it("should pass when data contains exact schema fields", async () => {
|
|
183
|
+
const table = pl
|
|
184
|
+
.DataFrame({
|
|
185
|
+
id: [1, 2],
|
|
186
|
+
name: ["John", "Jane"],
|
|
187
|
+
})
|
|
188
|
+
.lazy();
|
|
189
|
+
const schema = {
|
|
190
|
+
fieldsMatch: "subset",
|
|
191
|
+
fields: [
|
|
192
|
+
{ name: "id", type: "number" },
|
|
193
|
+
{ name: "name", type: "string" },
|
|
194
|
+
],
|
|
195
|
+
};
|
|
196
|
+
const errors = await inspectTable(table, { schema });
|
|
197
|
+
expect(errors).toEqual([]);
|
|
198
|
+
});
|
|
199
|
+
it("should detect missing fields", async () => {
|
|
200
|
+
const table = pl
|
|
201
|
+
.DataFrame({
|
|
202
|
+
id: [1, 2],
|
|
203
|
+
})
|
|
204
|
+
.lazy();
|
|
205
|
+
const schema = {
|
|
206
|
+
fieldsMatch: "subset",
|
|
207
|
+
fields: [
|
|
208
|
+
{ name: "id", type: "number" },
|
|
209
|
+
{
|
|
210
|
+
name: "name",
|
|
211
|
+
type: "string",
|
|
212
|
+
constraints: { required: true },
|
|
213
|
+
},
|
|
214
|
+
],
|
|
215
|
+
};
|
|
216
|
+
const errors = await inspectTable(table, { schema });
|
|
217
|
+
expect(errors).toContainEqual({
|
|
218
|
+
type: "fields/missing",
|
|
219
|
+
fieldNames: ["name"],
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
it("should pass when non-required fields are missing", async () => {
|
|
223
|
+
const table = pl
|
|
224
|
+
.DataFrame({
|
|
225
|
+
id: [1, 2],
|
|
226
|
+
})
|
|
227
|
+
.lazy();
|
|
228
|
+
const schema = {
|
|
229
|
+
fieldsMatch: "subset",
|
|
230
|
+
fields: [
|
|
231
|
+
{ name: "id", type: "number" },
|
|
232
|
+
{ name: "name", type: "string" },
|
|
233
|
+
],
|
|
234
|
+
};
|
|
235
|
+
const errors = await inspectTable(table, { schema });
|
|
236
|
+
expect(errors).toEqual([]);
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
describe("fields validation with fieldsMatch='superset'", () => {
|
|
240
|
+
it("should pass when schema contains all data fields", async () => {
|
|
241
|
+
const table = pl
|
|
242
|
+
.DataFrame({
|
|
243
|
+
id: [1, 2],
|
|
244
|
+
})
|
|
245
|
+
.lazy();
|
|
246
|
+
const schema = {
|
|
247
|
+
fieldsMatch: "superset",
|
|
248
|
+
fields: [
|
|
249
|
+
{ name: "id", type: "number" },
|
|
250
|
+
{ name: "name", type: "string" },
|
|
251
|
+
],
|
|
252
|
+
};
|
|
253
|
+
const errors = await inspectTable(table, { schema });
|
|
254
|
+
expect(errors).toEqual([]);
|
|
255
|
+
});
|
|
256
|
+
it("should pass when schema contains exact data fields", async () => {
|
|
257
|
+
const table = pl
|
|
258
|
+
.DataFrame({
|
|
259
|
+
id: [1, 2],
|
|
260
|
+
name: ["John", "Jane"],
|
|
261
|
+
})
|
|
262
|
+
.lazy();
|
|
263
|
+
const schema = {
|
|
264
|
+
fieldsMatch: "superset",
|
|
265
|
+
fields: [
|
|
266
|
+
{ name: "id", type: "number" },
|
|
267
|
+
{ name: "name", type: "string" },
|
|
268
|
+
],
|
|
269
|
+
};
|
|
270
|
+
const errors = await inspectTable(table, { schema });
|
|
271
|
+
expect(errors).toEqual([]);
|
|
272
|
+
});
|
|
273
|
+
it("should detect extra fields", async () => {
|
|
274
|
+
const table = pl
|
|
275
|
+
.DataFrame({
|
|
276
|
+
id: [1, 2],
|
|
277
|
+
name: ["John", "Jane"],
|
|
278
|
+
age: [30, 25],
|
|
279
|
+
})
|
|
280
|
+
.lazy();
|
|
281
|
+
const schema = {
|
|
282
|
+
fieldsMatch: "superset",
|
|
283
|
+
fields: [
|
|
284
|
+
{ name: "id", type: "number" },
|
|
285
|
+
{ name: "name", type: "string" },
|
|
286
|
+
],
|
|
287
|
+
};
|
|
288
|
+
const errors = await inspectTable(table, { schema });
|
|
289
|
+
expect(errors).toContainEqual({
|
|
290
|
+
type: "fields/extra",
|
|
291
|
+
fieldNames: ["age"],
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
describe("fields validation with fieldsMatch='partial'", () => {
|
|
296
|
+
it("should pass when at least one field matches", async () => {
|
|
297
|
+
const table = pl
|
|
298
|
+
.DataFrame({
|
|
299
|
+
id: [1, 2],
|
|
300
|
+
age: [30, 25],
|
|
301
|
+
})
|
|
302
|
+
.lazy();
|
|
303
|
+
const schema = {
|
|
304
|
+
fieldsMatch: "partial",
|
|
305
|
+
fields: [
|
|
306
|
+
{ name: "id", type: "number" },
|
|
307
|
+
{ name: "name", type: "string" },
|
|
308
|
+
],
|
|
309
|
+
};
|
|
310
|
+
const errors = await inspectTable(table, { schema });
|
|
311
|
+
expect(errors).toEqual([]);
|
|
312
|
+
});
|
|
313
|
+
it("should detect when no fields match", async () => {
|
|
314
|
+
const table = pl
|
|
315
|
+
.DataFrame({
|
|
316
|
+
age: [30, 25],
|
|
317
|
+
email: ["john@example.com", "jane@example.com"],
|
|
318
|
+
})
|
|
319
|
+
.lazy();
|
|
320
|
+
const schema = {
|
|
321
|
+
fieldsMatch: "partial",
|
|
322
|
+
fields: [
|
|
323
|
+
{ name: "id", type: "number" },
|
|
324
|
+
{ name: "name", type: "string" },
|
|
325
|
+
],
|
|
326
|
+
};
|
|
327
|
+
const errors = await inspectTable(table, { schema });
|
|
328
|
+
expect(errors).toContainEqual({
|
|
329
|
+
type: "fields/missing",
|
|
330
|
+
fieldNames: ["id", "name"],
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGFibGUvaW5zcGVjdC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRTNDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFO0lBQzVCLFFBQVEsQ0FBQyw0Q0FBNEMsRUFBRSxHQUFHLEVBQUU7UUFDMUQsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3JELE1BQU0sS0FBSyxHQUFHLEVBQUU7aUJBQ2IsU0FBUyxDQUFDO2dCQUNULEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ1YsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQzthQUN2QixDQUFDO2lCQUNELElBQUksRUFBRSxDQUFBO1lBRVQsTUFBTSxNQUFNLEdBQVc7Z0JBQ3JCLE1BQU0sRUFBRTtvQkFDTixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtvQkFDOUIsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7aUJBQ2pDO2FBQ0YsQ0FBQTtZQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7WUFFcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUM1QixDQUFDLENBQUMsQ0FBQTtRQUVGLEVBQUUsQ0FBQyxzREFBc0QsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNwRSxNQUFNLEtBQUssR0FBRyxFQUFF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Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2NoZW1hIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGluc3BlY3RUYWJsZSB9IGZyb20gXCIuL2luc3BlY3QudHNcIlxuXG5kZXNjcmliZShcImluc3BlY3RUYWJsZVwiLCAoKSA9PiB7XG4gIGRlc2NyaWJlKFwiZmllbGRzIHZhbGlkYXRpb24gd2l0aCBmaWVsZHNNYXRjaD0nZXhhY3QnXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBwYXNzIHdoZW4gZmllbGRzIGV4YWN0bHkgbWF0Y2hcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgICBpZDogWzEsIDJdLFxuICAgICAgICAgIG5hbWU6IFtcIkpvaG5cIiwgXCJKYW5lXCJdLFxuICAgICAgICB9KVxuICAgICAgICAubGF6eSgpXG5cbiAgICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICAgIHsgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgXSxcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuXG4gICAgICBleHBlY3QoZXJyb3JzKS50b0VxdWFsKFtdKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBub3QgaGF2ZSBmaWVsZHMgZXJyb3Igd2hlbiBmaWVsZHMgc2FtZSBsZW5ndGhcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgICBpZDogWzEsIDJdLFxuICAgICAgICAgIGFnZTogWzMwLCAyNV0sXG4gICAgICAgIH0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkc01hdGNoOiBcImV4YWN0XCIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICBdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgICBleHBlY3QoZXJyb3JzKS50b0VxdWFsKFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwiZmllbGQvbmFtZVwiLFxuICAgICAgICAgIGZpZWxkTmFtZTogXCJuYW1lXCIsXG4gICAgICAgICAgYWN0dWFsRmllbGROYW1lOiBcImFnZVwiLFxuICAgICAgICB9LFxuICAgICAgXSlcbiAgICB9KVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGRldGVjdCBleHRyYSBmaWVsZHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBpZDogWzEsIDJdLFxuICAgICAgICBuYW1lOiBbXCJKb2huXCIsIFwiSmFuZVwiXSxcbiAgICAgICAgYWdlOiBbMzAsIDI1XSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0NvbnRhaW5FcXVhbCh7XG4gICAgICB0eXBlOiBcImZpZWxkcy9leHRyYVwiLFxuICAgICAgZmllbGROYW1lczogW1wiYWdlXCJdLFxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgZGV0ZWN0IG1pc3NpbmcgZmllbGRzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgaWQ6IFsxLCAyXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0NvbnRhaW5FcXVhbCh7XG4gICAgICB0eXBlOiBcImZpZWxkcy9taXNzaW5nXCIsXG4gICAgICBmaWVsZE5hbWVzOiBbXCJuYW1lXCJdLFxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoXCJmaWVsZHMgdmFsaWRhdGlvbiB3aXRoIGZpZWxkc01hdGNoPSdlcXVhbCdcIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIHBhc3Mgd2hlbiBmaWVsZCBuYW1lcyBtYXRjaCByZWdhcmRsZXNzIG9mIG9yZGVyXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgICAgbmFtZTogW1wiSm9oblwiLCBcIkphbmVcIl0sXG4gICAgICAgICAgaWQ6IFsxLCAyXSxcbiAgICAgICAgfSlcbiAgICAgICAgLmxhenkoKVxuXG4gICAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgICAgZmllbGRzTWF0Y2g6IFwiZXF1YWxcIixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICAgIGV4cGVjdChlcnJvcnMpLnRvRXF1YWwoW10pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGRldGVjdCBleHRyYSBmaWVsZHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgICBpZDogWzEsIDJdLFxuICAgICAgICAgIG5hbWU6IFtcIkpvaG5cIiwgXCJKYW5lXCJdLFxuICAgICAgICAgIGFnZTogWzMwLCAyNV0sXG4gICAgICAgIH0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkc01hdGNoOiBcImVxdWFsXCIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgICBleHBlY3QoZXJyb3JzKS50b0NvbnRhaW5FcXVhbCh7XG4gICAgICAgIHR5cGU6IFwiZmllbGRzL2V4dHJhXCIsXG4gICAgICAgIGZpZWxkTmFtZXM6IFtcImFnZVwiXSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGRldGVjdCBtaXNzaW5nIGZpZWxkc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICAgIGlkOiBbMSwgMl0sXG4gICAgICAgIH0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkc01hdGNoOiBcImVxdWFsXCIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJuYW1lXCIsXG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgY29uc3RyYWludHM6IHsgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgICBleHBlY3QoZXJyb3JzKS50b0NvbnRhaW5FcXVhbCh7XG4gICAgICAgIHR5cGU6IFwiZmllbGRzL21pc3NpbmdcIixcbiAgICAgICAgZmllbGROYW1lczogW1wibmFtZVwiXSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIHBhc3Mgd2hlbiBub24tcmVxdWlyZWQgZmllbGRzIGFyZSBtaXNzaW5nXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgICAgaWQ6IFsxLCAyXSxcbiAgICAgICAgfSlcbiAgICAgICAgLmxhenkoKVxuXG4gICAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgICAgZmllbGRzTWF0Y2g6IFwiZXF1YWxcIixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICAgIGV4cGVjdChlcnJvcnMpLnRvRXF1YWwoW10pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZShcImZpZWxkcyB2YWxpZGF0aW9uIHdpdGggZmllbGRzTWF0Y2g9J3N1YnNldCdcIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIHBhc3Mgd2hlbiBkYXRhIGNvbnRhaW5zIGFsbCBzY2hlbWEgZmllbGRzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgICAgaWQ6IFsxLCAyXSxcbiAgICAgICAgICBuYW1lOiBbXCJKb2huXCIsIFwiSmFuZVwiXSxcbiAgICAgICAgICBhZ2U6IFszMCwgMjVdLFxuICAgICAgICB9KVxuICAgICAgICAubGF6eSgpXG5cbiAgICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgICBmaWVsZHNNYXRjaDogXCJzdWJzZXRcIixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICAgIGV4cGVjdChlcnJvcnMpLnRvRXF1YWwoW10pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIHBhc3Mgd2hlbiBkYXRhIGNvbnRhaW5zIGV4YWN0IHNjaGVtYSBmaWVsZHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgICBpZDogWzEsIDJdLFxuICAgICAgICAgIG5hbWU6IFtcIkpvaG5cIiwgXCJKYW5lXCJdLFxuICAgICAgICB9KVxuICAgICAgICAubGF6eSgpXG5cbiAgICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgICBmaWVsZHNNYXRjaDogXCJzdWJzZXRcIixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICAgIGV4cGVjdChlcnJvcnMpLnRvRXF1YWwoW10pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGRldGVjdCBtaXNzaW5nIGZpZWxkc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICAgIGlkOiBbMSwgMl0sXG4gICAgICAgIH0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkc01hdGNoOiBcInN1YnNldFwiLFxuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzOiB7IHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgICAgZXhwZWN0KGVycm9ycykudG9Db250YWluRXF1YWwoe1xuICAgICAgICB0eXBlOiBcImZpZWxkcy9taXNzaW5nXCIsXG4gICAgICAgIGZpZWxkTmFtZXM6IFtcIm5hbWVcIl0sXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBwYXNzIHdoZW4gbm9uLXJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZ1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICAgIGlkOiBbMSwgMl0sXG4gICAgICAgIH0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkc01hdGNoOiBcInN1YnNldFwiLFxuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICAgIHsgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgXSxcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgICAgZXhwZWN0KGVycm9ycykudG9FcXVhbChbXSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKFwiZmllbGRzIHZhbGlkYXRpb24gd2l0aCBmaWVsZHNNYXRjaD0nc3VwZXJzZXQnXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBwYXNzIHdoZW4gc2NoZW1hIGNvbnRhaW5zIGFsbCBkYXRhIGZpZWxkc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICAgIGlkOiBbMSwgMl0sXG4gICAgICAgIH0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkc01hdGNoOiBcInN1cGVyc2V0XCIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgICBleHBlY3QoZXJyb3JzKS50b0VxdWFsKFtdKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBwYXNzIHdoZW4gc2NoZW1hIGNvbnRhaW5zIGV4YWN0IGRhdGEgZmllbGRzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgICAgaWQ6IFsxLCAyXSxcbiAgICAgICAgICBuYW1lOiBbXCJKb2huXCIsIFwiSmFuZVwiXSxcbiAgICAgICAgfSlcbiAgICAgICAgLmxhenkoKVxuXG4gICAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgICAgZmllbGRzTWF0Y2g6IFwic3VwZXJzZXRcIixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICAgIGV4cGVjdChlcnJvcnMpLnRvRXF1YWwoW10pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGRldGVjdCBleHRyYSBmaWVsZHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgICBpZDogWzEsIDJdLFxuICAgICAgICAgIG5hbWU6IFtcIkpvaG5cIiwgXCJKYW5lXCJdLFxuICAgICAgICAgIGFnZTogWzMwLCAyNV0sXG4gICAgICAgIH0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkc01hdGNoOiBcInN1cGVyc2V0XCIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgICBleHBlY3QoZXJyb3JzKS50b0NvbnRhaW5FcXVhbCh7XG4gICAgICAgIHR5cGU6IFwiZmllbGRzL2V4dHJhXCIsXG4gICAgICAgIGZpZWxkTmFtZXM6IFtcImFnZVwiXSxcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZShcImZpZWxkcyB2YWxpZGF0aW9uIHdpdGggZmllbGRzTWF0Y2g9J3BhcnRpYWwnXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBwYXNzIHdoZW4gYXQgbGVhc3Qgb25lIGZpZWxkIG1hdGNoZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgICBpZDogWzEsIDJdLFxuICAgICAgICAgIGFnZTogWzMwLCAyNV0sXG4gICAgICAgIH0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkc01hdGNoOiBcInBhcnRpYWxcIixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICAgIGV4cGVjdChlcnJvcnMpLnRvRXF1YWwoW10pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGRldGVjdCB3aGVuIG5vIGZpZWxkcyBtYXRjaFwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICAgIGFnZTogWzMwLCAyNV0sXG4gICAgICAgICAgZW1haWw6IFtcImpvaG5AZXhhbXBsZS5jb21cIiwgXCJqYW5lQGV4YW1wbGUuY29tXCJdLFxuICAgICAgICB9KVxuICAgICAgICAubGF6eSgpXG5cbiAgICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgICBmaWVsZHNNYXRjaDogXCJwYXJ0aWFsXCIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgICBleHBlY3QoZXJyb3JzKS50b0NvbnRhaW5FcXVhbCh7XG4gICAgICAgIHR5cGU6IFwiZmllbGRzL21pc3NpbmdcIixcbiAgICAgICAgZmllbGROYW1lczogW1wiaWRcIiwgXCJuYW1lXCJdLFxuICAgICAgfSlcbiAgICB9KVxuICB9KVxufSlcbiJdfQ==
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Schema } from "@frictionless-ts/metadata";
|
|
2
|
+
import * as pl from "nodejs-polars";
|
|
3
|
+
import type { SchemaMapping } from "../schema/index.ts";
|
|
4
|
+
import type { Table } from "./Table.ts";
|
|
5
|
+
export declare function normalizeTable(table: Table, schema: Schema): Promise<pl.LazyDataFrame<any>>;
|
|
6
|
+
export declare function normalizeFields(mapping: SchemaMapping): Record<string, pl.Expr>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
import { normalizeField } from "../field/index.js";
|
|
3
|
+
import { matchSchemaField } from "../schema/index.js";
|
|
4
|
+
import { getPolarsSchema } from "../schema/index.js";
|
|
5
|
+
const HEAD_ROWS = 100;
|
|
6
|
+
export async function normalizeTable(table, schema) {
|
|
7
|
+
const head = await table.head(HEAD_ROWS).collect();
|
|
8
|
+
const polarsSchema = getPolarsSchema(head.schema);
|
|
9
|
+
const mapping = { source: polarsSchema, target: schema };
|
|
10
|
+
return table.select(...Object.values(normalizeFields(mapping)));
|
|
11
|
+
}
|
|
12
|
+
export function normalizeFields(mapping) {
|
|
13
|
+
const exprs = {};
|
|
14
|
+
for (const [index, field] of mapping.target.fields.entries()) {
|
|
15
|
+
const fieldMapping = matchSchemaField(mapping, field, index);
|
|
16
|
+
let expr = pl.lit(null).alias(field.name);
|
|
17
|
+
if (fieldMapping) {
|
|
18
|
+
const missingValues = field.missingValues ?? mapping.target.missingValues;
|
|
19
|
+
const mergedField = { ...field, missingValues };
|
|
20
|
+
const column = { source: fieldMapping.source, target: mergedField };
|
|
21
|
+
expr = normalizeField(column);
|
|
22
|
+
}
|
|
23
|
+
exprs[field.name] = expr;
|
|
24
|
+
}
|
|
25
|
+
return exprs;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybWFsaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGFibGUvbm9ybWFsaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFJcEQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFBO0FBRXJCLE1BQU0sQ0FBQyxLQUFLLFVBQVUsY0FBYyxDQUFDLEtBQVksRUFBRSxNQUFjO0lBQy9ELE1BQU0sSUFBSSxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNsRCxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRWpELE1BQU0sT0FBTyxHQUFHLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUE7SUFDeEQsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ2pFLENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFDLE9BQXNCO0lBQ3BELE1BQU0sS0FBSyxHQUE0QixFQUFFLENBQUE7SUFFekMsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDN0QsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUM1RCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFekMsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFBO1lBQ3pFLE1BQU0sV0FBVyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsYUFBYSxFQUFFLENBQUE7WUFFL0MsTUFBTSxNQUFNLEdBQUcsRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUE7WUFDbkUsSUFBSSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUMvQixDQUFDO1FBRUQsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUE7SUFDMUIsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2NoZW1hIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgbm9ybWFsaXplRmllbGQgfSBmcm9tIFwiLi4vZmllbGQvaW5kZXgudHNcIlxuaW1wb3J0IHsgbWF0Y2hTY2hlbWFGaWVsZCB9IGZyb20gXCIuLi9zY2hlbWEvaW5kZXgudHNcIlxuaW1wb3J0IHsgZ2V0UG9sYXJzU2NoZW1hIH0gZnJvbSBcIi4uL3NjaGVtYS9pbmRleC50c1wiXG5pbXBvcnQgdHlwZSB7IFNjaGVtYU1hcHBpbmcgfSBmcm9tIFwiLi4vc2NoZW1hL2luZGV4LnRzXCJcbmltcG9ydCB0eXBlIHsgVGFibGUgfSBmcm9tIFwiLi9UYWJsZS50c1wiXG5cbmNvbnN0IEhFQURfUk9XUyA9IDEwMFxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplVGFibGUodGFibGU6IFRhYmxlLCBzY2hlbWE6IFNjaGVtYSkge1xuICBjb25zdCBoZWFkID0gYXdhaXQgdGFibGUuaGVhZChIRUFEX1JPV1MpLmNvbGxlY3QoKVxuICBjb25zdCBwb2xhcnNTY2hlbWEgPSBnZXRQb2xhcnNTY2hlbWEoaGVhZC5zY2hlbWEpXG5cbiAgY29uc3QgbWFwcGluZyA9IHsgc291cmNlOiBwb2xhcnNTY2hlbWEsIHRhcmdldDogc2NoZW1hIH1cbiAgcmV0dXJuIHRhYmxlLnNlbGVjdCguLi5PYmplY3QudmFsdWVzKG5vcm1hbGl6ZUZpZWxkcyhtYXBwaW5nKSkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVGaWVsZHMobWFwcGluZzogU2NoZW1hTWFwcGluZykge1xuICBjb25zdCBleHByczogUmVjb3JkPHN0cmluZywgcGwuRXhwcj4gPSB7fVxuXG4gIGZvciAoY29uc3QgW2luZGV4LCBmaWVsZF0gb2YgbWFwcGluZy50YXJnZXQuZmllbGRzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IGZpZWxkTWFwcGluZyA9IG1hdGNoU2NoZW1hRmllbGQobWFwcGluZywgZmllbGQsIGluZGV4KVxuICAgIGxldCBleHByID0gcGwubGl0KG51bGwpLmFsaWFzKGZpZWxkLm5hbWUpXG5cbiAgICBpZiAoZmllbGRNYXBwaW5nKSB7XG4gICAgICBjb25zdCBtaXNzaW5nVmFsdWVzID0gZmllbGQubWlzc2luZ1ZhbHVlcyA/PyBtYXBwaW5nLnRhcmdldC5taXNzaW5nVmFsdWVzXG4gICAgICBjb25zdCBtZXJnZWRGaWVsZCA9IHsgLi4uZmllbGQsIG1pc3NpbmdWYWx1ZXMgfVxuXG4gICAgICBjb25zdCBjb2x1bW4gPSB7IHNvdXJjZTogZmllbGRNYXBwaW5nLnNvdXJjZSwgdGFyZ2V0OiBtZXJnZWRGaWVsZCB9XG4gICAgICBleHByID0gbm9ybWFsaXplRmllbGQoY29sdW1uKVxuICAgIH1cblxuICAgIGV4cHJzW2ZpZWxkLm5hbWVdID0gZXhwclxuICB9XG5cbiAgcmV0dXJuIGV4cHJzXG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|