@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,304 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { inferSchemaFromTable } from "./infer.js";
|
|
4
|
+
describe("inferSchemaFromTable", () => {
|
|
5
|
+
it("should infer from native types", async () => {
|
|
6
|
+
const table = pl
|
|
7
|
+
.DataFrame({
|
|
8
|
+
integer: pl.Series("integer", [1, 2], pl.Int32),
|
|
9
|
+
number: [1.1, 2.2],
|
|
10
|
+
})
|
|
11
|
+
.lazy();
|
|
12
|
+
const schema = {
|
|
13
|
+
fields: [
|
|
14
|
+
{ name: "integer", type: "integer" },
|
|
15
|
+
{ name: "number", type: "number" },
|
|
16
|
+
],
|
|
17
|
+
};
|
|
18
|
+
expect(await inferSchemaFromTable(table)).toEqual(schema);
|
|
19
|
+
});
|
|
20
|
+
it("should infer integers from floats", async () => {
|
|
21
|
+
const table = pl
|
|
22
|
+
.DataFrame({
|
|
23
|
+
id: [1.0, 2.0, 3.0],
|
|
24
|
+
count: [10.0, 20.0, 30.0],
|
|
25
|
+
})
|
|
26
|
+
.lazy();
|
|
27
|
+
const schema = {
|
|
28
|
+
fields: [
|
|
29
|
+
{ name: "id", type: "integer" },
|
|
30
|
+
{ name: "count", type: "integer" },
|
|
31
|
+
],
|
|
32
|
+
};
|
|
33
|
+
expect(await inferSchemaFromTable(table)).toEqual(schema);
|
|
34
|
+
});
|
|
35
|
+
it("should infer numeric", async () => {
|
|
36
|
+
const table = pl
|
|
37
|
+
.DataFrame({
|
|
38
|
+
name1: ["1", "2", "3"],
|
|
39
|
+
name2: ["1,000", "2,000", "3,000"],
|
|
40
|
+
name3: ["1.1", "2.2", "3.3"],
|
|
41
|
+
name4: ["1,000.1", "2,000.2", "3,000.3"],
|
|
42
|
+
})
|
|
43
|
+
.lazy();
|
|
44
|
+
const schema = {
|
|
45
|
+
fields: [
|
|
46
|
+
{ name: "name1", type: "integer" },
|
|
47
|
+
{ name: "name2", type: "integer", groupChar: "," },
|
|
48
|
+
{ name: "name3", type: "number" },
|
|
49
|
+
{ name: "name4", type: "number", groupChar: "," },
|
|
50
|
+
],
|
|
51
|
+
};
|
|
52
|
+
expect(await inferSchemaFromTable(table)).toEqual(schema);
|
|
53
|
+
});
|
|
54
|
+
it("should infer numeric (commaDecimal)", async () => {
|
|
55
|
+
const table = pl
|
|
56
|
+
.DataFrame({
|
|
57
|
+
name1: ["1.000", "2.000", "3.000"],
|
|
58
|
+
name2: ["1.000,5", "2.000,5", "3.000,5"],
|
|
59
|
+
})
|
|
60
|
+
.lazy();
|
|
61
|
+
const schema = {
|
|
62
|
+
fields: [
|
|
63
|
+
{ name: "name1", type: "integer", groupChar: "." },
|
|
64
|
+
{ name: "name2", type: "number", decimalChar: ",", groupChar: "." },
|
|
65
|
+
],
|
|
66
|
+
};
|
|
67
|
+
expect(await inferSchemaFromTable(table, { commaDecimal: true })).toEqual(schema);
|
|
68
|
+
});
|
|
69
|
+
it("should infer booleans", async () => {
|
|
70
|
+
const table = pl
|
|
71
|
+
.DataFrame({
|
|
72
|
+
name1: ["true", "True", "TRUE"],
|
|
73
|
+
name2: ["false", "False", "FALSE"],
|
|
74
|
+
})
|
|
75
|
+
.lazy();
|
|
76
|
+
const schema = {
|
|
77
|
+
fields: [
|
|
78
|
+
{ name: "name1", type: "boolean" },
|
|
79
|
+
{ name: "name2", type: "boolean" },
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
expect(await inferSchemaFromTable(table)).toEqual(schema);
|
|
83
|
+
});
|
|
84
|
+
it("should infer objects", async () => {
|
|
85
|
+
const table = pl
|
|
86
|
+
.DataFrame({
|
|
87
|
+
name1: ['{"a": 1}'],
|
|
88
|
+
name2: ["{}"],
|
|
89
|
+
})
|
|
90
|
+
.lazy();
|
|
91
|
+
const schema = {
|
|
92
|
+
fields: [
|
|
93
|
+
{ name: "name1", type: "object" },
|
|
94
|
+
{ name: "name2", type: "object" },
|
|
95
|
+
],
|
|
96
|
+
};
|
|
97
|
+
expect(await inferSchemaFromTable(table)).toEqual(schema);
|
|
98
|
+
});
|
|
99
|
+
it("should infer arrays", async () => {
|
|
100
|
+
const table = pl
|
|
101
|
+
.DataFrame({
|
|
102
|
+
name1: ["[1,2,3]"],
|
|
103
|
+
name2: ["[]"],
|
|
104
|
+
})
|
|
105
|
+
.lazy();
|
|
106
|
+
const schema = {
|
|
107
|
+
fields: [
|
|
108
|
+
{ name: "name1", type: "array" },
|
|
109
|
+
{ name: "name2", type: "array" },
|
|
110
|
+
],
|
|
111
|
+
};
|
|
112
|
+
expect(await inferSchemaFromTable(table)).toEqual(schema);
|
|
113
|
+
});
|
|
114
|
+
it("should infer dates with ISO format", async () => {
|
|
115
|
+
const table = pl
|
|
116
|
+
.DataFrame({
|
|
117
|
+
name1: ["2023-01-15", "2023-02-20", "2023-03-25"],
|
|
118
|
+
})
|
|
119
|
+
.lazy();
|
|
120
|
+
const schema = {
|
|
121
|
+
fields: [{ name: "name1", type: "date" }],
|
|
122
|
+
};
|
|
123
|
+
expect(await inferSchemaFromTable(table)).toEqual(schema);
|
|
124
|
+
});
|
|
125
|
+
it("should infer dates with slash format", async () => {
|
|
126
|
+
const table = pl
|
|
127
|
+
.DataFrame({
|
|
128
|
+
yearFirst: ["2023/01/15", "2023/02/20", "2023/03/25"],
|
|
129
|
+
dayMonth: ["15/01/2023", "20/02/2023", "25/03/2023"],
|
|
130
|
+
monthDay: ["01/15/2023", "02/20/2023", "03/25/2023"],
|
|
131
|
+
})
|
|
132
|
+
.lazy();
|
|
133
|
+
const schemaDefault = {
|
|
134
|
+
fields: [
|
|
135
|
+
{ name: "yearFirst", type: "date", format: "%Y/%m/%d" },
|
|
136
|
+
{ name: "dayMonth", type: "date", format: "%d/%m/%Y" },
|
|
137
|
+
{ name: "monthDay", type: "date", format: "%d/%m/%Y" },
|
|
138
|
+
],
|
|
139
|
+
};
|
|
140
|
+
const schemaMonthFirst = {
|
|
141
|
+
fields: [
|
|
142
|
+
{ name: "yearFirst", type: "date", format: "%Y/%m/%d" },
|
|
143
|
+
{ name: "dayMonth", type: "date", format: "%m/%d/%Y" },
|
|
144
|
+
{ name: "monthDay", type: "date", format: "%m/%d/%Y" },
|
|
145
|
+
],
|
|
146
|
+
};
|
|
147
|
+
expect(await inferSchemaFromTable(table)).toEqual(schemaDefault);
|
|
148
|
+
expect(await inferSchemaFromTable(table, { monthFirst: true })).toEqual(schemaMonthFirst);
|
|
149
|
+
});
|
|
150
|
+
it("should infer dates with hyphen format", async () => {
|
|
151
|
+
const table = pl
|
|
152
|
+
.DataFrame({
|
|
153
|
+
dayMonth: ["15-01-2023", "20-02-2023", "25-03-2023"],
|
|
154
|
+
})
|
|
155
|
+
.lazy();
|
|
156
|
+
const schemaDefault = {
|
|
157
|
+
fields: [{ name: "dayMonth", type: "date", format: "%d-%m-%Y" }],
|
|
158
|
+
};
|
|
159
|
+
const schemaMonthFirst = {
|
|
160
|
+
fields: [{ name: "dayMonth", type: "date", format: "%m-%d-%Y" }],
|
|
161
|
+
};
|
|
162
|
+
expect(await inferSchemaFromTable(table)).toEqual(schemaDefault);
|
|
163
|
+
expect(await inferSchemaFromTable(table, { monthFirst: true })).toEqual(schemaMonthFirst);
|
|
164
|
+
});
|
|
165
|
+
it("should infer times with standard format", async () => {
|
|
166
|
+
const table = pl
|
|
167
|
+
.DataFrame({
|
|
168
|
+
fullTime: ["14:30:45", "08:15:30", "23:59:59"],
|
|
169
|
+
shortTime: ["14:30", "08:15", "23:59"],
|
|
170
|
+
})
|
|
171
|
+
.lazy();
|
|
172
|
+
const schema = {
|
|
173
|
+
fields: [
|
|
174
|
+
{ name: "fullTime", type: "time" },
|
|
175
|
+
{ name: "shortTime", type: "time", format: "%H:%M" },
|
|
176
|
+
],
|
|
177
|
+
};
|
|
178
|
+
expect(await inferSchemaFromTable(table)).toEqual(schema);
|
|
179
|
+
});
|
|
180
|
+
it("should infer times with 12-hour format", async () => {
|
|
181
|
+
const table = pl
|
|
182
|
+
.DataFrame({
|
|
183
|
+
fullTime: ["2:30:45 PM", "8:15:30 AM", "11:59:59 PM"],
|
|
184
|
+
shortTime: ["2:30 PM", "8:15 AM", "11:59 PM"],
|
|
185
|
+
})
|
|
186
|
+
.lazy();
|
|
187
|
+
const schema = {
|
|
188
|
+
fields: [
|
|
189
|
+
{ name: "fullTime", type: "time", format: "%I:%M:%S %p" },
|
|
190
|
+
{ name: "shortTime", type: "time", format: "%I:%M %p" },
|
|
191
|
+
],
|
|
192
|
+
};
|
|
193
|
+
expect(await inferSchemaFromTable(table)).toEqual(schema);
|
|
194
|
+
});
|
|
195
|
+
it("should infer times with timezone offset", async () => {
|
|
196
|
+
const table = pl
|
|
197
|
+
.DataFrame({
|
|
198
|
+
name: ["14:30:45+01:00", "08:15:30-05:00", "23:59:59+00:00"],
|
|
199
|
+
})
|
|
200
|
+
.lazy();
|
|
201
|
+
const schema = {
|
|
202
|
+
fields: [{ name: "name", type: "time" }],
|
|
203
|
+
};
|
|
204
|
+
expect(await inferSchemaFromTable(table)).toEqual(schema);
|
|
205
|
+
});
|
|
206
|
+
it("should infer datetimes with ISO format", async () => {
|
|
207
|
+
const table = pl
|
|
208
|
+
.DataFrame({
|
|
209
|
+
standard: [
|
|
210
|
+
"2023-01-15T14:30:45",
|
|
211
|
+
"2023-02-20T08:15:30",
|
|
212
|
+
"2023-03-25T23:59:59",
|
|
213
|
+
],
|
|
214
|
+
utc: [
|
|
215
|
+
"2023-01-15T14:30:45Z",
|
|
216
|
+
"2023-02-20T08:15:30Z",
|
|
217
|
+
"2023-03-25T23:59:59Z",
|
|
218
|
+
],
|
|
219
|
+
withTz: [
|
|
220
|
+
"2023-01-15T14:30:45+01:00",
|
|
221
|
+
"2023-02-20T08:15:30-05:00",
|
|
222
|
+
"2023-03-25T23:59:59+00:00",
|
|
223
|
+
],
|
|
224
|
+
withSpace: [
|
|
225
|
+
"2023-01-15 14:30:45",
|
|
226
|
+
"2023-02-20 08:15:30",
|
|
227
|
+
"2023-03-25 23:59:59",
|
|
228
|
+
],
|
|
229
|
+
})
|
|
230
|
+
.lazy();
|
|
231
|
+
const schema = {
|
|
232
|
+
fields: [
|
|
233
|
+
{ name: "standard", type: "datetime" },
|
|
234
|
+
{ name: "utc", type: "datetime" },
|
|
235
|
+
{ name: "withTz", type: "datetime" },
|
|
236
|
+
{ name: "withSpace", type: "datetime", format: "%Y-%m-%d %H:%M:%S" },
|
|
237
|
+
],
|
|
238
|
+
};
|
|
239
|
+
expect(await inferSchemaFromTable(table)).toEqual(schema);
|
|
240
|
+
});
|
|
241
|
+
it("should infer datetimes with custom formats", async () => {
|
|
242
|
+
const table = pl
|
|
243
|
+
.DataFrame({
|
|
244
|
+
shortDayMonth: [
|
|
245
|
+
"15/01/2023 14:30",
|
|
246
|
+
"20/02/2023 08:15",
|
|
247
|
+
"25/03/2023 23:59",
|
|
248
|
+
],
|
|
249
|
+
fullDayMonth: [
|
|
250
|
+
"15/01/2023 14:30:45",
|
|
251
|
+
"20/02/2023 08:15:30",
|
|
252
|
+
"25/03/2023 23:59:59",
|
|
253
|
+
],
|
|
254
|
+
shortMonthDay: [
|
|
255
|
+
"01/15/2023 14:30",
|
|
256
|
+
"02/20/2023 08:15",
|
|
257
|
+
"03/25/2023 23:59",
|
|
258
|
+
],
|
|
259
|
+
fullMonthDay: [
|
|
260
|
+
"01/15/2023 14:30:45",
|
|
261
|
+
"02/20/2023 08:15:30",
|
|
262
|
+
"03/25/2023 23:59:59",
|
|
263
|
+
],
|
|
264
|
+
})
|
|
265
|
+
.lazy();
|
|
266
|
+
const schemaDefault = {
|
|
267
|
+
fields: [
|
|
268
|
+
{ name: "shortDayMonth", type: "datetime", format: "%d/%m/%Y %H:%M" },
|
|
269
|
+
{ name: "fullDayMonth", type: "datetime", format: "%d/%m/%Y %H:%M:%S" },
|
|
270
|
+
{ name: "shortMonthDay", type: "datetime", format: "%d/%m/%Y %H:%M" },
|
|
271
|
+
{ name: "fullMonthDay", type: "datetime", format: "%d/%m/%Y %H:%M:%S" },
|
|
272
|
+
],
|
|
273
|
+
};
|
|
274
|
+
const schemaMonthFirst = {
|
|
275
|
+
fields: [
|
|
276
|
+
{ name: "shortDayMonth", type: "datetime", format: "%m/%d/%Y %H:%M" },
|
|
277
|
+
{ name: "fullDayMonth", type: "datetime", format: "%m/%d/%Y %H:%M:%S" },
|
|
278
|
+
{ name: "shortMonthDay", type: "datetime", format: "%m/%d/%Y %H:%M" },
|
|
279
|
+
{ name: "fullMonthDay", type: "datetime", format: "%m/%d/%Y %H:%M:%S" },
|
|
280
|
+
],
|
|
281
|
+
};
|
|
282
|
+
expect(await inferSchemaFromTable(table)).toEqual(schemaDefault);
|
|
283
|
+
expect(await inferSchemaFromTable(table, { monthFirst: true })).toEqual(schemaMonthFirst);
|
|
284
|
+
});
|
|
285
|
+
it("should infer lists", async () => {
|
|
286
|
+
const table = pl
|
|
287
|
+
.DataFrame({
|
|
288
|
+
numericList: ["1.5,2.3", "4.1,5.9", "7.2,8.6"],
|
|
289
|
+
integerList: ["1,2", "3,4", "5,6"],
|
|
290
|
+
singleValue: ["1.5", "2.3", "4.1"],
|
|
291
|
+
})
|
|
292
|
+
.lazy();
|
|
293
|
+
const schema = {
|
|
294
|
+
fields: [
|
|
295
|
+
{ name: "numericList", type: "list", itemType: "number" },
|
|
296
|
+
{ name: "integerList", type: "list", itemType: "integer" },
|
|
297
|
+
{ name: "singleValue", type: "number" },
|
|
298
|
+
],
|
|
299
|
+
missingValues: undefined,
|
|
300
|
+
};
|
|
301
|
+
expect(await inferSchemaFromTable(table)).toEqual(schema);
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mZXIuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NjaGVtYS9pbmZlci5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFakQsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtJQUNwQyxFQUFFLENBQUMsZ0NBQWdDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDOUMsTUFBTSxLQUFLLEdBQUcsRUFBRTthQUNiLFNBQVMsQ0FBQztZQUNULE9BQU8sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQy9DLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7U0FDbkIsQ0FBQzthQUNELElBQUksRUFBRSxDQUFBO1FBRVQsTUFBTSxNQUFNLEdBQUc7WUFDYixNQUFNLEVBQUU7Z0JBQ04sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7Z0JBQ3BDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2FBQ25DO1NBQ0YsQ0FBQTtRQUVELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzNELENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2pELE1BQU0sS0FBSyxHQUFHLEVBQUU7YUFDYixTQUFTLENBQUM7WUFDVCxFQUFFLEVBQUUsQ0FBQyxH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cm9tIFwibm9kZWpzLXBvbGFyc1wiXG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHsgaW5mZXJTY2hlbWFGcm9tVGFibGUgfSBmcm9tIFwiLi9pbmZlci50c1wiXG5cbmRlc2NyaWJlKFwiaW5mZXJTY2hlbWFGcm9tVGFibGVcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBpbmZlciBmcm9tIG5hdGl2ZSB0eXBlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGludGVnZXI6IHBsLlNlcmllcyhcImludGVnZXJcIiwgWzEsIDJdLCBwbC5JbnQzMiksXG4gICAgICAgIG51bWJlcjogWzEuMSwgMi4yXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcImludGVnZXJcIiwgdHlwZTogXCJpbnRlZ2VyXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIm51bWJlclwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGV4cGVjdChhd2FpdCBpbmZlclNjaGVtYUZyb21UYWJsZSh0YWJsZSkpLnRvRXF1YWwoc2NoZW1hKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIGludGVnZXJzIGZyb20gZmxvYXRzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgaWQ6IFsxLjAsIDIuMCwgMy4wXSxcbiAgICAgICAgY291bnQ6IFsxMC4wLCAyMC4wLCAzMC4wXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwiaW50ZWdlclwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJjb3VudFwiLCB0eXBlOiBcImludGVnZXJcIiB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBleHBlY3QoYXdhaXQgaW5mZXJTY2hlbWFGcm9tVGFibGUodGFibGUpKS50b0VxdWFsKHNjaGVtYSlcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciBudW1lcmljXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbmFtZTE6IFtcIjFcIiwgXCIyXCIsIFwiM1wiXSxcbiAgICAgICAgbmFtZTI6IFtcIjEsMDAwXCIsIFwiMiwwMDBcIiwgXCIzLDAwMFwiXSxcbiAgICAgICAgbmFtZTM6IFtcIjEuMVwiLCBcIjIuMlwiLCBcIjMuM1wiXSxcbiAgICAgICAgbmFtZTQ6IFtcIjEsMDAwLjFcIiwgXCIyLDAwMC4yXCIsIFwiMywwMDAuM1wiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcIm5hbWUxXCIsIHR5cGU6IFwiaW50ZWdlclwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJuYW1lMlwiLCB0eXBlOiBcImludGVnZXJcIiwgZ3JvdXBDaGFyOiBcIixcIiB9LFxuICAgICAgICB7IG5hbWU6IFwibmFtZTNcIiwgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICB7IG5hbWU6IFwibmFtZTRcIiwgdHlwZTogXCJudW1iZXJcIiwgZ3JvdXBDaGFyOiBcIixcIiB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBleHBlY3QoYXdhaXQgaW5mZXJTY2hlbWFGcm9tVGFibGUodGFibGUpKS50b0VxdWFsKHNjaGVtYSlcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciBudW1lcmljIChjb21tYURlY2ltYWwpXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbmFtZTE6IFtcIjEuMDAwXCIsIFwiMi4wMDBcIiwgXCIzLjAwMFwiXSxcbiAgICAgICAgbmFtZTI6IFtcIjEuMDAwLDVcIiwgXCIyLjAwMCw1XCIsIFwiMy4wMDAsNVwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcIm5hbWUxXCIsIHR5cGU6IFwiaW50ZWdlclwiLCBncm91cENoYXI6IFwiLlwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJuYW1lMlwiLCB0eXBlOiBcIm51bWJlclwiLCBkZWNpbWFsQ2hhcjogXCIsXCIsIGdyb3VwQ2hhcjogXCIuXCIgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgZXhwZWN0KGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlLCB7IGNvbW1hRGVjaW1hbDogdHJ1ZSB9KSkudG9FcXVhbChcbiAgICAgIHNjaGVtYSxcbiAgICApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaW5mZXIgYm9vbGVhbnNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBuYW1lMTogW1widHJ1ZVwiLCBcIlRydWVcIiwgXCJUUlVFXCJdLFxuICAgICAgICBuYW1lMjogW1wiZmFsc2VcIiwgXCJGYWxzZVwiLCBcIkZBTFNFXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7IG5hbWU6IFwibmFtZTFcIiwgdHlwZTogXCJib29sZWFuXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIm5hbWUyXCIsIHR5cGU6IFwiYm9vbGVhblwiIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGV4cGVjdChhd2FpdCBpbmZlclNjaGVtYUZyb21UYWJsZSh0YWJsZSkpLnRvRXF1YWwoc2NoZW1hKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIG9iamVjdHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBuYW1lMTogWyd7XCJhXCI6IDF9J10sXG4gICAgICAgIG5hbWUyOiBbXCJ7fVwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcIm5hbWUxXCIsIHR5cGU6IFwib2JqZWN0XCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIm5hbWUyXCIsIHR5cGU6IFwib2JqZWN0XCIgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgZXhwZWN0KGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlKSkudG9FcXVhbChzY2hlbWEpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaW5mZXIgYXJyYXlzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbmFtZTE6IFtcIlsxLDIsM11cIl0sXG4gICAgICAgIG5hbWUyOiBbXCJbXVwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcIm5hbWUxXCIsIHR5cGU6IFwiYXJyYXlcIiB9LFxuICAgICAgICB7IG5hbWU6IFwibmFtZTJcIiwgdHlwZTogXCJhcnJheVwiIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGV4cGVjdChhd2FpdCBpbmZlclNjaGVtYUZyb21UYWJsZSh0YWJsZSkpLnRvRXF1YWwoc2NoZW1hKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIGRhdGVzIHdpdGggSVNPIGZvcm1hdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIG5hbWUxOiBbXCIyMDIzLTAxLTE1XCIsIFwiMjAyMy0wMi0yMFwiLCBcIjIwMjMtMDMtMjVcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbeyBuYW1lOiBcIm5hbWUxXCIsIHR5cGU6IFwiZGF0ZVwiIH1dLFxuICAgIH1cblxuICAgIGV4cGVjdChhd2FpdCBpbmZlclNjaGVtYUZyb21UYWJsZSh0YWJsZSkpLnRvRXF1YWwoc2NoZW1hKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIGRhdGVzIHdpdGggc2xhc2ggZm9ybWF0XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgeWVhckZpcnN0OiBbXCIyMDIzLzAxLzE1XCIsIFwiMjAyMy8wMi8yMFwiLCBcIjIwMjMvMDMvMjVcIl0sXG4gICAgICAgIGRheU1vbnRoOiBbXCIxNS8wMS8yMDIzXCIsIFwiMjAvMDIvMjAyM1wiLCBcIjI1LzAzLzIwMjNcIl0sXG4gICAgICAgIG1vbnRoRGF5OiBbXCIwMS8xNS8yMDIzXCIsIFwiMDIvMjAvMjAyM1wiLCBcIjAzLzI1LzIwMjNcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hRGVmYXVsdCA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7IG5hbWU6IFwieWVhckZpcnN0XCIsIHR5cGU6IFwiZGF0ZVwiLCBmb3JtYXQ6IFwiJVkvJW0vJWRcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiZGF5TW9udGhcIiwgdHlwZTogXCJkYXRlXCIsIGZvcm1hdDogXCIlZC8lbS8lWVwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJtb250aERheVwiLCB0eXBlOiBcImRhdGVcIiwgZm9ybWF0OiBcIiVkLyVtLyVZXCIgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hTW9udGhGaXJzdCA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7IG5hbWU6IFwieWVhckZpcnN0XCIsIHR5cGU6IFwiZGF0ZVwiLCBmb3JtYXQ6IFwiJVkvJW0vJWRcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiZGF5TW9udGhcIiwgdHlwZTogXCJkYXRlXCIsIGZvcm1hdDogXCIlbS8lZC8lWVwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJtb250aERheVwiLCB0eXBlOiBcImRhdGVcIiwgZm9ybWF0OiBcIiVtLyVkLyVZXCIgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgZXhwZWN0KGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlKSkudG9FcXVhbChzY2hlbWFEZWZhdWx0KVxuICAgIGV4cGVjdChhd2FpdCBpbmZlclNjaGVtYUZyb21UYWJsZSh0YWJsZSwgeyBtb250aEZpcnN0OiB0cnVlIH0pKS50b0VxdWFsKFxuICAgICAgc2NoZW1hTW9udGhGaXJzdCxcbiAgICApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaW5mZXIgZGF0ZXMgd2l0aCBoeXBoZW4gZm9ybWF0XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgZGF5TW9udGg6IFtcIjE1LTAxLTIwMjNcIiwgXCIyMC0wMi0yMDIzXCIsIFwiMjUtMDMtMjAyM1wiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWFEZWZhdWx0ID0ge1xuICAgICAgZmllbGRzOiBbeyBuYW1lOiBcImRheU1vbnRoXCIsIHR5cGU6IFwiZGF0ZVwiLCBmb3JtYXQ6IFwiJWQtJW0tJVlcIiB9XSxcbiAgICB9XG5cbiAgICBjb25zdCBzY2hlbWFNb250aEZpcnN0ID0ge1xuICAgICAgZmllbGRzOiBbeyBuYW1lOiBcImRheU1vbnRoXCIsIHR5cGU6IFwiZGF0ZVwiLCBmb3JtYXQ6IFwiJW0tJWQtJVlcIiB9XSxcbiAgICB9XG5cbiAgICBleHBlY3QoYXdhaXQgaW5mZXJTY2hlbWFGcm9tVGFibGUodGFibGUpKS50b0VxdWFsKHNjaGVtYURlZmF1bHQpXG4gICAgZXhwZWN0KGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlLCB7IG1vbnRoRmlyc3Q6IHRydWUgfSkpLnRvRXF1YWwoXG4gICAgICBzY2hlbWFNb250aEZpcnN0LFxuICAgIClcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciB0aW1lcyB3aXRoIHN0YW5kYXJkIGZvcm1hdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGZ1bGxUaW1lOiBbXCIxNDozMDo0NVwiLCBcIjA4OjE1OjMwXCIsIFwiMjM6NTk6NTlcIl0sXG4gICAgICAgIHNob3J0VGltZTogW1wiMTQ6MzBcIiwgXCIwODoxNVwiLCBcIjIzOjU5XCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7IG5hbWU6IFwiZnVsbFRpbWVcIiwgdHlwZTogXCJ0aW1lXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInNob3J0VGltZVwiLCB0eXBlOiBcInRpbWVcIiwgZm9ybWF0OiBcIiVIOiVNXCIgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgZXhwZWN0KGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlKSkudG9FcXVhbChzY2hlbWEpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaW5mZXIgdGltZXMgd2l0aCAxMi1ob3VyIGZvcm1hdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGZ1bGxUaW1lOiBbXCIyOjMwOjQ1IFBNXCIsIFwiODoxNTozMCBBTVwiLCBcIjExOjU5OjU5IFBNXCJdLFxuICAgICAgICBzaG9ydFRpbWU6IFtcIjI6MzAgUE1cIiwgXCI4OjE1IEFNXCIsIFwiMTE6NTkgUE1cIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHsgbmFtZTogXCJmdWxsVGltZVwiLCB0eXBlOiBcInRpbWVcIiwgZm9ybWF0OiBcIiVJOiVNOiVTICVwXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInNob3J0VGltZVwiLCB0eXBlOiBcInRpbWVcIiwgZm9ybWF0OiBcIiVJOiVNICVwXCIgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgZXhwZWN0KGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlKSkudG9FcXVhbChzY2hlbWEpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaW5mZXIgdGltZXMgd2l0aCB0aW1lem9uZSBvZmZzZXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBuYW1lOiBbXCIxNDozMDo0NSswMTowMFwiLCBcIjA4OjE1OjMwLTA1OjAwXCIsIFwiMjM6NTk6NTkrMDA6MDBcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJ0aW1lXCIgfV0sXG4gICAgfVxuXG4gICAgZXhwZWN0KGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlKSkudG9FcXVhbChzY2hlbWEpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaW5mZXIgZGF0ZXRpbWVzIHdpdGggSVNPIGZvcm1hdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIHN0YW5kYXJkOiBbXG4gICAgICAgICAgXCIyMDIzLTAxLTE1VDE0OjMwOjQ1XCIsXG4gICAgICAgICAgXCIyMDIzLTAyLTIwVDA4OjE1OjMwXCIsXG4gICAgICAgICAgXCIyMDIzLTAzLTI1VDIzOjU5OjU5XCIsXG4gICAgICAgIF0sXG4gICAgICAgIHV0YzogW1xuICAgICAgICAgIFwiMjAyMy0wMS0xNVQxNDozMDo0NVpcIixcbiAgICAgICAgICBcIjIwMjMtMDItMjBUMDg6MTU6MzBaXCIsXG4gICAgICAgICAgXCIyMDIzLTAzLTI1VDIzOjU5OjU5WlwiLFxuICAgICAgICBdLFxuICAgICAgICB3aXRoVHo6IFtcbiAgICAgICAgICBcIjIwMjMtMDEtMTVUMTQ6MzA6NDUrMDE6MDBcIixcbiAgICAgICAgICBcIjIwMjMtMDItMjBUMDg6MTU6MzAtMDU6MDBcIixcbiAgICAgICAgICBcIjIwMjMtMDMtMjVUMjM6NTk6NTkrMDA6MDBcIixcbiAgICAgICAgXSxcbiAgICAgICAgd2l0aFNwYWNlOiBbXG4gICAgICAgICAgXCIyMDIzLTAxLTE1IDE0OjMwOjQ1XCIsXG4gICAgICAgICAgXCIyMDIzLTAyLTIwIDA4OjE1OjMwXCIsXG4gICAgICAgICAgXCIyMDIzLTAzLTI1IDIzOjU5OjU5XCIsXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHsgbmFtZTogXCJzdGFuZGFyZFwiLCB0eXBlOiBcImRhdGV0aW1lXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInV0Y1wiLCB0eXBlOiBcImRhdGV0aW1lXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIndpdGhUelwiLCB0eXBlOiBcImRhdGV0aW1lXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIndpdGhTcGFjZVwiLCB0eXBlOiBcImRhdGV0aW1lXCIsIGZvcm1hdDogXCIlWS0lbS0lZCAlSDolTTolU1wiIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGV4cGVjdChhd2FpdCBpbmZlclNjaGVtYUZyb21UYWJsZSh0YWJsZSkpLnRvRXF1YWwoc2NoZW1hKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIGRhdGV0aW1lcyB3aXRoIGN1c3RvbSBmb3JtYXRzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgc2hvcnREYXlNb250aDogW1xuICAgICAgICAgIFwiMTUvMDEvMjAyMyAxNDozMFwiLFxuICAgICAgICAgIFwiMjAvMDIvMjAyMyAwODoxNVwiLFxuICAgICAgICAgIFwiMjUvMDMvMjAyMyAyMzo1OVwiLFxuICAgICAgICBdLFxuICAgICAgICBmdWxsRGF5TW9udGg6IFtcbiAgICAgICAgICBcIjE1LzAxLzIwMjMgMTQ6MzA6NDVcIixcbiAgICAgICAgICBcIjIwLzAyLzIwMjMgMDg6MTU6MzBcIixcbiAgICAgICAgICBcIjI1LzAzLzIwMjMgMjM6NTk6NTlcIixcbiAgICAgICAgXSxcbiAgICAgICAgc2hvcnRNb250aERheTogW1xuICAgICAgICAgIFwiMDEvMTUvMjAyMyAxNDozMFwiLFxuICAgICAgICAgIFwiMDIvMjAvMjAyMyAwODoxNVwiLFxuICAgICAgICAgIFwiMDMvMjUvMjAyMyAyMzo1OVwiLFxuICAgICAgICBdLFxuICAgICAgICBmdWxsTW9udGhEYXk6IFtcbiAgICAgICAgICBcIjAxLzE1LzIwMjMgMTQ6MzA6NDVcIixcbiAgICAgICAgICBcIjAyLzIwLzIwMjMgMDg6MTU6MzBcIixcbiAgICAgICAgICBcIjAzLzI1LzIwMjMgMjM6NTk6NTlcIixcbiAgICAgICAgXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWFEZWZhdWx0ID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHsgbmFtZTogXCJzaG9ydERheU1vbnRoXCIsIHR5cGU6IFwiZGF0ZXRpbWVcIiwgZm9ybWF0OiBcIiVkLyVtLyVZICVIOiVNXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImZ1bGxEYXlNb250aFwiLCB0eXBlOiBcImRhdGV0aW1lXCIsIGZvcm1hdDogXCIlZC8lbS8lWSAlSDolTTolU1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJzaG9ydE1vbnRoRGF5XCIsIHR5cGU6IFwiZGF0ZXRpbWVcIiwgZm9ybWF0OiBcIiVkLyVtLyVZICVIOiVNXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImZ1bGxNb250aERheVwiLCB0eXBlOiBcImRhdGV0aW1lXCIsIGZvcm1hdDogXCIlZC8lbS8lWSAlSDolTTolU1wiIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYU1vbnRoRmlyc3QgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcInNob3J0RGF5TW9udGhcIiwgdHlwZTogXCJkYXRldGltZVwiLCBmb3JtYXQ6IFwiJW0vJWQvJVkgJUg6JU1cIiB9LFxuICAgICAgICB7IG5hbWU6IFwiZnVsbERheU1vbnRoXCIsIHR5cGU6IFwiZGF0ZXRpbWVcIiwgZm9ybWF0OiBcIiVtLyVkLyVZICVIOiVNOiVTXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInNob3J0TW9udGhEYXlcIiwgdHlwZTogXCJkYXRldGltZVwiLCBmb3JtYXQ6IFwiJW0vJWQvJVkgJUg6JU1cIiB9LFxuICAgICAgICB7IG5hbWU6IFwiZnVsbE1vbnRoRGF5XCIsIHR5cGU6IFwiZGF0ZXRpbWVcIiwgZm9ybWF0OiBcIiVtLyVkLyVZICVIOiVNOiVTXCIgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgZXhwZWN0KGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlKSkudG9FcXVhbChzY2hlbWFEZWZhdWx0KVxuICAgIGV4cGVjdChhd2FpdCBpbmZlclNjaGVtYUZyb21UYWJsZSh0YWJsZSwgeyBtb250aEZpcnN0OiB0cnVlIH0pKS50b0VxdWFsKFxuICAgICAgc2NoZW1hTW9udGhGaXJzdCxcbiAgICApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaW5mZXIgbGlzdHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBudW1lcmljTGlzdDogW1wiMS41LDIuM1wiLCBcIjQuMSw1LjlcIiwgXCI3LjIsOC42XCJdLFxuICAgICAgICBpbnRlZ2VyTGlzdDogW1wiMSwyXCIsIFwiMyw0XCIsIFwiNSw2XCJdLFxuICAgICAgICBzaW5nbGVWYWx1ZTogW1wiMS41XCIsIFwiMi4zXCIsIFwiNC4xXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7IG5hbWU6IFwibnVtZXJpY0xpc3RcIiwgdHlwZTogXCJsaXN0XCIsIGl0ZW1UeXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJpbnRlZ2VyTGlzdFwiLCB0eXBlOiBcImxpc3RcIiwgaXRlbVR5cGU6IFwiaW50ZWdlclwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJzaW5nbGVWYWx1ZVwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICBdLFxuICAgICAgbWlzc2luZ1ZhbHVlczogdW5kZWZpbmVkLFxuICAgIH1cblxuICAgIGV4cGVjdChhd2FpdCBpbmZlclNjaGVtYUZyb21UYWJsZSh0YWJsZSkpLnRvRXF1YWwoc2NoZW1hKVxuICB9KVxufSlcbiJdfQ==
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Field } from "@frictionless-ts/metadata";
|
|
2
|
+
import type { SchemaMapping } from "./Mapping.ts";
|
|
3
|
+
export declare function matchSchemaField(mapping: SchemaMapping, field: Field, index: number): {
|
|
4
|
+
source: import("../index.ts").PolarsField;
|
|
5
|
+
target: Field;
|
|
6
|
+
} | undefined;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export function matchSchemaField(mapping, field, index) {
|
|
2
|
+
const fieldsMatch = mapping.target.fieldsMatch ?? "exact";
|
|
3
|
+
const polarsField = fieldsMatch !== "exact"
|
|
4
|
+
? mapping.source.fields.find(it => it.name === field.name)
|
|
5
|
+
: mapping.source.fields[index];
|
|
6
|
+
return polarsField ? { source: polarsField, target: field } : undefined;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zY2hlbWEvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixPQUFzQixFQUN0QixLQUFZLEVBQ1osS0FBYTtJQUViLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQTtJQUV6RCxNQUFNLFdBQVcsR0FDZixXQUFXLEtBQUssT0FBTztRQUNyQixDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQzFELENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUVsQyxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0FBQ3pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZpZWxkIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHR5cGUgeyBTY2hlbWFNYXBwaW5nIH0gZnJvbSBcIi4vTWFwcGluZy50c1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaFNjaGVtYUZpZWxkKFxuICBtYXBwaW5nOiBTY2hlbWFNYXBwaW5nLFxuICBmaWVsZDogRmllbGQsXG4gIGluZGV4OiBudW1iZXIsXG4pIHtcbiAgY29uc3QgZmllbGRzTWF0Y2ggPSBtYXBwaW5nLnRhcmdldC5maWVsZHNNYXRjaCA/PyBcImV4YWN0XCJcblxuICBjb25zdCBwb2xhcnNGaWVsZCA9XG4gICAgZmllbGRzTWF0Y2ggIT09IFwiZXhhY3RcIlxuICAgICAgPyBtYXBwaW5nLnNvdXJjZS5maWVsZHMuZmluZChpdCA9PiBpdC5uYW1lID09PSBmaWVsZC5uYW1lKVxuICAgICAgOiBtYXBwaW5nLnNvdXJjZS5maWVsZHNbaW5kZXhdXG5cbiAgcmV0dXJuIHBvbGFyc0ZpZWxkID8geyBzb3VyY2U6IHBvbGFyc0ZpZWxkLCB0YXJnZXQ6IGZpZWxkIH0gOiB1bmRlZmluZWRcbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnJhbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90YWJsZS9GcmFtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5cbmV4cG9ydCB0eXBlIEZyYW1lID0gcGwuRGF0YUZyYW1lXG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90YWJsZS9UYWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5cbmV4cG9ydCB0eXBlIFRhYmxlID0gcGwuTGF6eURhdGFGcmFtZVxuIl19
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { RowUniqueError } from "@frictionless-ts/metadata";
|
|
2
|
+
import * as pl from "nodejs-polars";
|
|
3
|
+
import type { SchemaMapping } from "../../schema/index.ts";
|
|
4
|
+
export declare function createChecksRowUnique(mapping: SchemaMapping): {
|
|
5
|
+
isErrorExpr: pl.Expr;
|
|
6
|
+
errorTemplate: RowUniqueError;
|
|
7
|
+
}[];
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
export function createChecksRowUnique(mapping) {
|
|
3
|
+
const uniqueKeys = mapping.target.uniqueKeys ?? [];
|
|
4
|
+
if (mapping.target.primaryKey) {
|
|
5
|
+
uniqueKeys.push(mapping.target.primaryKey);
|
|
6
|
+
}
|
|
7
|
+
return uniqueKeys.map(createCheckRowUnique);
|
|
8
|
+
}
|
|
9
|
+
function createCheckRowUnique(uniqueKey) {
|
|
10
|
+
const isErrorExpr = pl
|
|
11
|
+
.concatList(uniqueKey)
|
|
12
|
+
.isFirstDistinct()
|
|
13
|
+
.not()
|
|
14
|
+
// Fold is not available so we use a tricky way to eliminate nulls
|
|
15
|
+
.and(pl.concatList(uniqueKey).lst.min().isNotNull());
|
|
16
|
+
const errorTemplate = {
|
|
17
|
+
type: "row/unique",
|
|
18
|
+
fieldNames: uniqueKey,
|
|
19
|
+
rowNumber: 0,
|
|
20
|
+
};
|
|
21
|
+
return { isErrorExpr, errorTemplate };
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pcXVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGFibGUvY2hlY2tzL3VuaXF1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUduQyxNQUFNLFVBQVUscUJBQXFCLENBQUMsT0FBc0I7SUFDMUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFBO0lBRWxELElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM5QixVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDNUMsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO0FBQzdDLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLFNBQW1CO0lBQy9DLE1BQU0sV0FBVyxHQUFHLEVBQUU7U0FDbkIsVUFBVSxDQUFDLFNBQVMsQ0FBQztTQUNyQixlQUFlLEVBQUU7U0FDakIsR0FBRyxFQUFFO1FBQ04sa0VBQWtFO1NBQ2pFLEdBQUcsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBRXRELE1BQU0sYUFBYSxHQUFtQjtRQUNwQyxJQUFJLEVBQUUsWUFBWTtRQUNsQixVQUFVLEVBQUUsU0FBUztRQUNyQixTQUFTLEVBQUUsQ0FBQztLQUNiLENBQUE7SUFFRCxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxDQUFBO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJvd1VuaXF1ZUVycm9yIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHR5cGUgeyBTY2hlbWFNYXBwaW5nIH0gZnJvbSBcIi4uLy4uL3NjaGVtYS9pbmRleC50c1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDaGVja3NSb3dVbmlxdWUobWFwcGluZzogU2NoZW1hTWFwcGluZykge1xuICBjb25zdCB1bmlxdWVLZXlzID0gbWFwcGluZy50YXJnZXQudW5pcXVlS2V5cyA/PyBbXVxuXG4gIGlmIChtYXBwaW5nLnRhcmdldC5wcmltYXJ5S2V5KSB7XG4gICAgdW5pcXVlS2V5cy5wdXNoKG1hcHBpbmcudGFyZ2V0LnByaW1hcnlLZXkpXG4gIH1cblxuICByZXR1cm4gdW5pcXVlS2V5cy5tYXAoY3JlYXRlQ2hlY2tSb3dVbmlxdWUpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNoZWNrUm93VW5pcXVlKHVuaXF1ZUtleTogc3RyaW5nW10pIHtcbiAgY29uc3QgaXNFcnJvckV4cHIgPSBwbFxuICAgIC5jb25jYXRMaXN0KHVuaXF1ZUtleSlcbiAgICAuaXNGaXJzdERpc3RpbmN0KClcbiAgICAubm90KClcbiAgICAvLyBGb2xkIGlzIG5vdCBhdmFpbGFibGUgc28gd2UgdXNlIGEgdHJpY2t5IHdheSB0byBlbGltaW5hdGUgbnVsbHNcbiAgICAuYW5kKHBsLmNvbmNhdExpc3QodW5pcXVlS2V5KS5sc3QubWluKCkuaXNOb3ROdWxsKCkpXG5cbiAgY29uc3QgZXJyb3JUZW1wbGF0ZTogUm93VW5pcXVlRXJyb3IgPSB7XG4gICAgdHlwZTogXCJyb3cvdW5pcXVlXCIsXG4gICAgZmllbGROYW1lczogdW5pcXVlS2V5LFxuICAgIHJvd051bWJlcjogMCxcbiAgfVxuXG4gIHJldHVybiB7IGlzRXJyb3JFeHByLCBlcnJvclRlbXBsYXRlIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { inspectTable } from "../../table/index.js";
|
|
4
|
+
describe("inspectTable (row/unique)", () => {
|
|
5
|
+
it("should not errors when all rows are unique for primary key", async () => {
|
|
6
|
+
const table = pl
|
|
7
|
+
.DataFrame({
|
|
8
|
+
id: [1, 2, 3, 4, 5],
|
|
9
|
+
name: ["Alice", "Bob", "Charlie", "David", "Eve"],
|
|
10
|
+
})
|
|
11
|
+
.lazy();
|
|
12
|
+
const schema = {
|
|
13
|
+
fields: [
|
|
14
|
+
{ name: "id", type: "number" },
|
|
15
|
+
{ name: "name", type: "string" },
|
|
16
|
+
],
|
|
17
|
+
primaryKey: ["id"],
|
|
18
|
+
};
|
|
19
|
+
const errors = await inspectTable(table, { schema });
|
|
20
|
+
expect(errors).toHaveLength(0);
|
|
21
|
+
});
|
|
22
|
+
it("should errors for duplicate primary key rows", async () => {
|
|
23
|
+
const table = pl
|
|
24
|
+
.DataFrame({
|
|
25
|
+
id: [1, 2, 3, 2, 5],
|
|
26
|
+
name: ["Alice", "Bob", "Charlie", "Bob2", "Eve"],
|
|
27
|
+
})
|
|
28
|
+
.lazy();
|
|
29
|
+
const schema = {
|
|
30
|
+
fields: [
|
|
31
|
+
{ name: "id", type: "number" },
|
|
32
|
+
{ name: "name", type: "string" },
|
|
33
|
+
],
|
|
34
|
+
primaryKey: ["id"],
|
|
35
|
+
};
|
|
36
|
+
const errors = await inspectTable(table, { schema });
|
|
37
|
+
expect(errors.filter(e => e.type === "row/unique")).toHaveLength(1);
|
|
38
|
+
expect(errors).toContainEqual({
|
|
39
|
+
type: "row/unique",
|
|
40
|
+
rowNumber: 4,
|
|
41
|
+
fieldNames: ["id"],
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
it("should not errors when all rows are unique for unique key", async () => {
|
|
45
|
+
const table = pl
|
|
46
|
+
.DataFrame({
|
|
47
|
+
id: [1, 2, 3, 4, 5],
|
|
48
|
+
email: [
|
|
49
|
+
"a@test.com",
|
|
50
|
+
"b@test.com",
|
|
51
|
+
"c@test.com",
|
|
52
|
+
"d@test.com",
|
|
53
|
+
"e@test.com",
|
|
54
|
+
],
|
|
55
|
+
})
|
|
56
|
+
.lazy();
|
|
57
|
+
const schema = {
|
|
58
|
+
fields: [
|
|
59
|
+
{ name: "id", type: "number" },
|
|
60
|
+
{ name: "email", type: "string" },
|
|
61
|
+
],
|
|
62
|
+
uniqueKeys: [["email"]],
|
|
63
|
+
};
|
|
64
|
+
const errors = await inspectTable(table, { schema });
|
|
65
|
+
expect(errors).toHaveLength(0);
|
|
66
|
+
});
|
|
67
|
+
it("should errors for duplicate unique key rows", async () => {
|
|
68
|
+
const table = pl
|
|
69
|
+
.DataFrame({
|
|
70
|
+
id: [1, 2, 3, 4, 5],
|
|
71
|
+
email: [
|
|
72
|
+
"a@test.com",
|
|
73
|
+
"b@test.com",
|
|
74
|
+
"a@test.com",
|
|
75
|
+
"d@test.com",
|
|
76
|
+
"b@test.com",
|
|
77
|
+
],
|
|
78
|
+
})
|
|
79
|
+
.lazy();
|
|
80
|
+
const schema = {
|
|
81
|
+
fields: [
|
|
82
|
+
{ name: "id", type: "number" },
|
|
83
|
+
{ name: "email", type: "string" },
|
|
84
|
+
],
|
|
85
|
+
uniqueKeys: [["email"]],
|
|
86
|
+
};
|
|
87
|
+
const errors = await inspectTable(table, { schema });
|
|
88
|
+
expect(errors.filter(e => e.type === "row/unique")).toHaveLength(2);
|
|
89
|
+
expect(errors).toContainEqual({
|
|
90
|
+
type: "row/unique",
|
|
91
|
+
rowNumber: 3,
|
|
92
|
+
fieldNames: ["email"],
|
|
93
|
+
});
|
|
94
|
+
expect(errors).toContainEqual({
|
|
95
|
+
type: "row/unique",
|
|
96
|
+
rowNumber: 5,
|
|
97
|
+
fieldNames: ["email"],
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
it("should handle composite unique keys", async () => {
|
|
101
|
+
const table = pl
|
|
102
|
+
.DataFrame({
|
|
103
|
+
category: ["A", "A", "B", "A", "B"],
|
|
104
|
+
subcategory: ["X", "Y", "X", "X", "Y"],
|
|
105
|
+
value: [1, 2, 3, 4, 5],
|
|
106
|
+
})
|
|
107
|
+
.lazy();
|
|
108
|
+
const schema = {
|
|
109
|
+
fields: [
|
|
110
|
+
{ name: "category", type: "string" },
|
|
111
|
+
{ name: "subcategory", type: "string" },
|
|
112
|
+
{ name: "value", type: "number" },
|
|
113
|
+
],
|
|
114
|
+
uniqueKeys: [["category", "subcategory"]],
|
|
115
|
+
};
|
|
116
|
+
const errors = await inspectTable(table, { schema });
|
|
117
|
+
expect(errors.filter(e => e.type === "row/unique")).toHaveLength(1);
|
|
118
|
+
expect(errors).toContainEqual({
|
|
119
|
+
type: "row/unique",
|
|
120
|
+
rowNumber: 4,
|
|
121
|
+
fieldNames: ["category", "subcategory"],
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
it("should handle both primary key and unique keys", async () => {
|
|
125
|
+
const table = pl
|
|
126
|
+
.DataFrame({
|
|
127
|
+
id: [1, 2, 3, 2, 5],
|
|
128
|
+
email: [
|
|
129
|
+
"a@test.com",
|
|
130
|
+
"b@test.com",
|
|
131
|
+
"c@test.com",
|
|
132
|
+
"d@test.com",
|
|
133
|
+
"a@test.com",
|
|
134
|
+
],
|
|
135
|
+
})
|
|
136
|
+
.lazy();
|
|
137
|
+
const schema = {
|
|
138
|
+
fields: [
|
|
139
|
+
{ name: "id", type: "number" },
|
|
140
|
+
{ name: "email", type: "string" },
|
|
141
|
+
],
|
|
142
|
+
primaryKey: ["id"],
|
|
143
|
+
uniqueKeys: [["email"]],
|
|
144
|
+
};
|
|
145
|
+
const errors = await inspectTable(table, { schema });
|
|
146
|
+
expect(errors.filter(e => e.type === "row/unique")).toHaveLength(2);
|
|
147
|
+
expect(errors).toContainEqual({
|
|
148
|
+
type: "row/unique",
|
|
149
|
+
rowNumber: 4,
|
|
150
|
+
fieldNames: ["id"],
|
|
151
|
+
});
|
|
152
|
+
expect(errors).toContainEqual({
|
|
153
|
+
type: "row/unique",
|
|
154
|
+
rowNumber: 5,
|
|
155
|
+
fieldNames: ["email"],
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
it("should handle null values in unique keys correctly", async () => {
|
|
159
|
+
const table = pl
|
|
160
|
+
.DataFrame({
|
|
161
|
+
id: [1, 2, null, 4, null, 2],
|
|
162
|
+
name: ["Alice", "Bob", "Charlie", "David", "Eve", "Bob"],
|
|
163
|
+
})
|
|
164
|
+
.lazy();
|
|
165
|
+
const schema = {
|
|
166
|
+
fields: [
|
|
167
|
+
{ name: "id", type: "number" },
|
|
168
|
+
{ name: "name", type: "string" },
|
|
169
|
+
],
|
|
170
|
+
uniqueKeys: [["id"], ["id", "name"]],
|
|
171
|
+
};
|
|
172
|
+
const errors = await inspectTable(table, { schema });
|
|
173
|
+
console.log(errors);
|
|
174
|
+
expect(errors).toHaveLength(2);
|
|
175
|
+
expect(errors).toContainEqual({
|
|
176
|
+
type: "row/unique",
|
|
177
|
+
rowNumber: 6,
|
|
178
|
+
fieldNames: ["id"],
|
|
179
|
+
});
|
|
180
|
+
expect(errors).toContainEqual({
|
|
181
|
+
type: "row/unique",
|
|
182
|
+
rowNumber: 6,
|
|
183
|
+
fieldNames: ["id", "name"],
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pcXVlLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90YWJsZS9jaGVja3MvdW5pcXVlLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUVuRCxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO0lBQ3pDLEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMxRSxNQUFNLEtBQUssR0FBRyxFQUFFO2FBQ2IsU0FBUyxDQUFDO1lBQ1QsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuQixJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDO1NBQ2xELENBQUM7YUFDRCxJQUFJLEVBQUUsQ0FBQTtRQUVULE1BQU0sTUFBTSxHQUFXO1lBQ3JCLE1BQU0sRUFBRTtnQkFDTixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtnQkFDOUIsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7YUFDakM7WUFDRCxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUM7U0FDbkIsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNoQyxDQUFDLENBQUMsQ0FBQTtJQUVGLEVB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QUNOLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2dCQUM5QixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTthQUNqQztZQUNELFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDckMsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDcEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUVuQixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxjQUFjLENBQUM7WUFDNUIsSUFBSSxFQUFFLFlBQVk7WUFDbEIsU0FBUyxFQUFFLENBQUM7WUFDWixVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUM7U0FDbkIsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGNBQWMsQ0FBQztZQUM1QixJQUFJLEVBQUUsWUFBWTtZQUNsQixTQUFTLEVBQUUsQ0FBQztZQUNaLFVBQVUsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7U0FDM0IsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2NoZW1hIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGluc3BlY3RUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS9pbmRleC50c1wiXG5cbmRlc2NyaWJlKFwiaW5zcGVjdFRhYmxlIChyb3cvdW5pcXVlKVwiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIG5vdCBlcnJvcnMgd2hlbiBhbGwgcm93cyBhcmUgdW5pcXVlIGZvciBwcmltYXJ5IGtleVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGlkOiBbMSwgMiwgMywgNCwgNV0sXG4gICAgICAgIG5hbWU6IFtcIkFsaWNlXCIsIFwiQm9iXCIsIFwiQ2hhcmxpZVwiLCBcIkRhdmlkXCIsIFwiRXZlXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIF0sXG4gICAgICBwcmltYXJ5S2V5OiBbXCJpZFwiXSxcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9IYXZlTGVuZ3RoKDApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgZXJyb3JzIGZvciBkdXBsaWNhdGUgcHJpbWFyeSBrZXkgcm93c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGlkOiBbMSwgMiwgMywgMiwgNV0sXG4gICAgICAgIG5hbWU6IFtcIkFsaWNlXCIsIFwiQm9iXCIsIFwiQ2hhcmxpZVwiLCBcIkJvYjJcIiwgXCJFdmVcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgXSxcbiAgICAgIHByaW1hcnlLZXk6IFtcImlkXCJdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcblxuICAgIGV4cGVjdChlcnJvcnMuZmlsdGVyKGUgPT4gZS50eXBlID09PSBcInJvdy91bmlxdWVcIikpLnRvSGF2ZUxlbmd0aCgxKVxuICAgIGV4cGVjdChlcnJvcnMpLnRvQ29udGFpbkVxdWFsKHtcbiAgICAgIHR5cGU6IFwicm93L3VuaXF1ZVwiLFxuICAgICAgcm93TnVtYmVyOiA0LFxuICAgICAgZmllbGROYW1lczogW1wiaWRcIl0sXG4gICAgfSlcbiAgfSlcblxuICBpdChcInNob3VsZCBub3QgZXJyb3JzIHdoZW4gYWxsIHJvd3MgYXJlIHVuaXF1ZSBmb3IgdW5pcXVlIGtleVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGlkOiBbMSwgMiwgMywgNCwgNV0sXG4gICAgICAgIGVtYWlsOiBbXG4gICAgICAgICAgXCJhQHRlc3QuY29tXCIsXG4gICAgICAgICAgXCJiQHRlc3QuY29tXCIsXG4gICAgICAgICAgXCJjQHRlc3QuY29tXCIsXG4gICAgICAgICAgXCJkQHRlc3QuY29tXCIsXG4gICAgICAgICAgXCJlQHRlc3QuY29tXCIsXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImVtYWlsXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIF0sXG4gICAgICB1bmlxdWVLZXlzOiBbW1wiZW1haWxcIl1dLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0hhdmVMZW5ndGgoMClcbiAgfSlcblxuICBpdChcInNob3VsZCBlcnJvcnMgZm9yIGR1cGxpY2F0ZSB1bmlxdWUga2V5IHJvd3NcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBpZDogWzEsIDIsIDMsIDQsIDVdLFxuICAgICAgICBlbWFpbDogW1xuICAgICAgICAgIFwiYUB0ZXN0LmNvbVwiLFxuICAgICAgICAgIFwiYkB0ZXN0LmNvbVwiLFxuICAgICAgICAgIFwiYUB0ZXN0LmNvbVwiLFxuICAgICAgICAgIFwiZEB0ZXN0LmNvbVwiLFxuICAgICAgICAgIFwiYkB0ZXN0LmNvbVwiLFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJlbWFpbFwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBdLFxuICAgICAgdW5pcXVlS2V5czogW1tcImVtYWlsXCJdXSxcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgZXhwZWN0KGVycm9ycy5maWx0ZXIoZSA9PiBlLnR5cGUgPT09IFwicm93L3VuaXF1ZVwiKSkudG9IYXZlTGVuZ3RoKDIpXG4gICAgZXhwZWN0KGVycm9ycykudG9Db250YWluRXF1YWwoe1xuICAgICAgdHlwZTogXCJyb3cvdW5pcXVlXCIsXG4gICAgICByb3dOdW1iZXI6IDMsXG4gICAgICBmaWVsZE5hbWVzOiBbXCJlbWFpbFwiXSxcbiAgICB9KVxuICAgIGV4cGVjdChlcnJvcnMpLnRvQ29udGFpbkVxdWFsKHtcbiAgICAgIHR5cGU6IFwicm93L3VuaXF1ZVwiLFxuICAgICAgcm93TnVtYmVyOiA1LFxuICAgICAgZmllbGROYW1lczogW1wiZW1haWxcIl0sXG4gICAgfSlcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgY29tcG9zaXRlIHVuaXF1ZSBrZXlzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgY2F0ZWdvcnk6IFtcIkFcIiwgXCJBXCIsIFwiQlwiLCBcIkFcIiwgXCJCXCJdLFxuICAgICAgICBzdWJjYXRlZ29yeTogW1wiWFwiLCBcIllcIiwgXCJYXCIsIFwiWFwiLCBcIllcIl0sXG4gICAgICAgIHZhbHVlOiBbMSwgMiwgMywgNCwgNV0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcImNhdGVnb3J5XCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInN1YmNhdGVnb3J5XCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInZhbHVlXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgIF0sXG4gICAgICB1bmlxdWVLZXlzOiBbW1wiY2F0ZWdvcnlcIiwgXCJzdWJjYXRlZ29yeVwiXV0sXG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgIGV4cGVjdChlcnJvcnMuZmlsdGVyKGUgPT4gZS50eXBlID09PSBcInJvdy91bmlxdWVcIikpLnRvSGF2ZUxlbmd0aCgxKVxuICAgIGV4cGVjdChlcnJvcnMpLnRvQ29udGFpbkVxdWFsKHtcbiAgICAgIHR5cGU6IFwicm93L3VuaXF1ZVwiLFxuICAgICAgcm93TnVtYmVyOiA0LFxuICAgICAgZmllbGROYW1lczogW1wiY2F0ZWdvcnlcIiwgXCJzdWJjYXRlZ29yeVwiXSxcbiAgICB9KVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBib3RoIHByaW1hcnkga2V5IGFuZCB1bmlxdWUga2V5c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGlkOiBbMSwgMiwgMywgMiwgNV0sXG4gICAgICAgIGVtYWlsOiBbXG4gICAgICAgICAgXCJhQHRlc3QuY29tXCIsXG4gICAgICAgICAgXCJiQHRlc3QuY29tXCIsXG4gICAgICAgICAgXCJjQHRlc3QuY29tXCIsXG4gICAgICAgICAgXCJkQHRlc3QuY29tXCIsXG4gICAgICAgICAgXCJhQHRlc3QuY29tXCIsXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImVtYWlsXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIF0sXG4gICAgICBwcmltYXJ5S2V5OiBbXCJpZFwiXSxcbiAgICAgIHVuaXF1ZUtleXM6IFtbXCJlbWFpbFwiXV0sXG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgIGV4cGVjdChlcnJvcnMuZmlsdGVyKGUgPT4gZS50eXBlID09PSBcInJvdy91bmlxdWVcIikpLnRvSGF2ZUxlbmd0aCgyKVxuICAgIGV4cGVjdChlcnJvcnMpLnRvQ29udGFpbkVxdWFsKHtcbiAgICAgIHR5cGU6IFwicm93L3VuaXF1ZVwiLFxuICAgICAgcm93TnVtYmVyOiA0LFxuICAgICAgZmllbGROYW1lczogW1wiaWRcIl0sXG4gICAgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0NvbnRhaW5FcXVhbCh7XG4gICAgICB0eXBlOiBcInJvdy91bmlxdWVcIixcbiAgICAgIHJvd051bWJlcjogNSxcbiAgICAgIGZpZWxkTmFtZXM6IFtcImVtYWlsXCJdLFxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIG51bGwgdmFsdWVzIGluIHVuaXF1ZSBrZXlzIGNvcnJlY3RseVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGlkOiBbMSwgMiwgbnVsbCwgNCwgbnVsbCwgMl0sXG4gICAgICAgIG5hbWU6IFtcIkFsaWNlXCIsIFwiQm9iXCIsIFwiQ2hhcmxpZVwiLCBcIkRhdmlkXCIsIFwiRXZlXCIsIFwiQm9iXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIF0sXG4gICAgICB1bmlxdWVLZXlzOiBbW1wiaWRcIl0sIFtcImlkXCIsIFwibmFtZVwiXV0sXG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgIGNvbnNvbGUubG9nKGVycm9ycylcblxuICAgIGV4cGVjdChlcnJvcnMpLnRvSGF2ZUxlbmd0aCgyKVxuICAgIGV4cGVjdChlcnJvcnMpLnRvQ29udGFpbkVxdWFsKHtcbiAgICAgIHR5cGU6IFwicm93L3VuaXF1ZVwiLFxuICAgICAgcm93TnVtYmVyOiA2LFxuICAgICAgZmllbGROYW1lczogW1wiaWRcIl0sXG4gICAgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0NvbnRhaW5FcXVhbCh7XG4gICAgICB0eXBlOiBcInJvdy91bmlxdWVcIixcbiAgICAgIHJvd051bWJlcjogNixcbiAgICAgIGZpZWxkTmFtZXM6IFtcImlkXCIsIFwibmFtZVwiXSxcbiAgICB9KVxuICB9KVxufSlcbiJdfQ==
|