@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,358 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { inspectTable } from "../../table/index.js";
|
|
4
|
+
describe("validateArrayField", () => {
|
|
5
|
+
it("should not errors for valid JSON arrays", async () => {
|
|
6
|
+
const table = pl
|
|
7
|
+
.DataFrame({
|
|
8
|
+
tags: ['["tag1","tag2"]', "[1,2,3]", '["a","b","c"]'],
|
|
9
|
+
})
|
|
10
|
+
.lazy();
|
|
11
|
+
const schema = {
|
|
12
|
+
fields: [
|
|
13
|
+
{
|
|
14
|
+
name: "tags",
|
|
15
|
+
type: "array",
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
};
|
|
19
|
+
const errors = await inspectTable(table, { schema });
|
|
20
|
+
expect(errors).toHaveLength(0);
|
|
21
|
+
});
|
|
22
|
+
it("should not errors for empty arrays", async () => {
|
|
23
|
+
const table = pl
|
|
24
|
+
.DataFrame({
|
|
25
|
+
items: ["[]", "[]", "[]"],
|
|
26
|
+
})
|
|
27
|
+
.lazy();
|
|
28
|
+
const schema = {
|
|
29
|
+
fields: [
|
|
30
|
+
{
|
|
31
|
+
name: "items",
|
|
32
|
+
type: "array",
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
const errors = await inspectTable(table, { schema });
|
|
37
|
+
expect(errors).toHaveLength(0);
|
|
38
|
+
});
|
|
39
|
+
it("should not errors for null values", async () => {
|
|
40
|
+
const table = pl
|
|
41
|
+
.DataFrame({
|
|
42
|
+
data: ['["value"]', null, "[1,2,3]"],
|
|
43
|
+
})
|
|
44
|
+
.lazy();
|
|
45
|
+
const schema = {
|
|
46
|
+
fields: [
|
|
47
|
+
{
|
|
48
|
+
name: "data",
|
|
49
|
+
type: "array",
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
};
|
|
53
|
+
const errors = await inspectTable(table, { schema });
|
|
54
|
+
expect(errors).toHaveLength(0);
|
|
55
|
+
});
|
|
56
|
+
it("should errors for JSON objects", async () => {
|
|
57
|
+
const table = pl
|
|
58
|
+
.DataFrame({
|
|
59
|
+
data: ["[1,2,3]", '{"key":"value"}', '["a","b"]'],
|
|
60
|
+
})
|
|
61
|
+
.lazy();
|
|
62
|
+
const schema = {
|
|
63
|
+
fields: [
|
|
64
|
+
{
|
|
65
|
+
name: "data",
|
|
66
|
+
type: "array",
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
};
|
|
70
|
+
const errors = await inspectTable(table, { schema });
|
|
71
|
+
expect(errors).toEqual([
|
|
72
|
+
{
|
|
73
|
+
type: "cell/type",
|
|
74
|
+
fieldName: "data",
|
|
75
|
+
fieldType: "array",
|
|
76
|
+
rowNumber: 2,
|
|
77
|
+
cell: '{"key":"value"}',
|
|
78
|
+
},
|
|
79
|
+
]);
|
|
80
|
+
});
|
|
81
|
+
it("should errors for invalid JSON", async () => {
|
|
82
|
+
const table = pl
|
|
83
|
+
.DataFrame({
|
|
84
|
+
data: ['["valid"]', "invalid json", "[1,2,3]", "[broken"],
|
|
85
|
+
})
|
|
86
|
+
.lazy();
|
|
87
|
+
const schema = {
|
|
88
|
+
fields: [
|
|
89
|
+
{
|
|
90
|
+
name: "data",
|
|
91
|
+
type: "array",
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
};
|
|
95
|
+
const errors = await inspectTable(table, { schema });
|
|
96
|
+
expect(errors.filter(e => e.type === "cell/type")).toHaveLength(2);
|
|
97
|
+
expect(errors).toContainEqual({
|
|
98
|
+
type: "cell/type",
|
|
99
|
+
fieldName: "data",
|
|
100
|
+
fieldType: "array",
|
|
101
|
+
rowNumber: 2,
|
|
102
|
+
cell: "invalid json",
|
|
103
|
+
});
|
|
104
|
+
expect(errors).toContainEqual({
|
|
105
|
+
type: "cell/type",
|
|
106
|
+
fieldName: "data",
|
|
107
|
+
fieldType: "array",
|
|
108
|
+
rowNumber: 4,
|
|
109
|
+
cell: "[broken",
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
it("should handle nested arrays", async () => {
|
|
113
|
+
const table = pl
|
|
114
|
+
.DataFrame({
|
|
115
|
+
matrix: ["[[1,2],[3,4]]", "[[5,6],[7,8]]", '[["a","b"],["c","d"]]'],
|
|
116
|
+
})
|
|
117
|
+
.lazy();
|
|
118
|
+
const schema = {
|
|
119
|
+
fields: [
|
|
120
|
+
{
|
|
121
|
+
name: "matrix",
|
|
122
|
+
type: "array",
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
};
|
|
126
|
+
const errors = await inspectTable(table, { schema });
|
|
127
|
+
expect(errors).toHaveLength(0);
|
|
128
|
+
});
|
|
129
|
+
it("should errors for empty strings", async () => {
|
|
130
|
+
const table = pl
|
|
131
|
+
.DataFrame({
|
|
132
|
+
data: ['["valid"]', "", "[1,2,3]"],
|
|
133
|
+
})
|
|
134
|
+
.lazy();
|
|
135
|
+
const schema = {
|
|
136
|
+
fields: [
|
|
137
|
+
{
|
|
138
|
+
name: "data",
|
|
139
|
+
type: "array",
|
|
140
|
+
},
|
|
141
|
+
],
|
|
142
|
+
};
|
|
143
|
+
const errors = await inspectTable(table, { schema });
|
|
144
|
+
expect(errors).toEqual([
|
|
145
|
+
{
|
|
146
|
+
type: "cell/type",
|
|
147
|
+
fieldName: "data",
|
|
148
|
+
fieldType: "array",
|
|
149
|
+
rowNumber: 2,
|
|
150
|
+
cell: "",
|
|
151
|
+
},
|
|
152
|
+
]);
|
|
153
|
+
});
|
|
154
|
+
it("should errors for JSON primitives", async () => {
|
|
155
|
+
const table = pl
|
|
156
|
+
.DataFrame({
|
|
157
|
+
data: ['"string"', "123", "true", "false", "null"],
|
|
158
|
+
})
|
|
159
|
+
.lazy();
|
|
160
|
+
const schema = {
|
|
161
|
+
fields: [
|
|
162
|
+
{
|
|
163
|
+
name: "data",
|
|
164
|
+
type: "array",
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
};
|
|
168
|
+
const errors = await inspectTable(table, { schema });
|
|
169
|
+
expect(errors).toEqual([
|
|
170
|
+
{
|
|
171
|
+
type: "cell/type",
|
|
172
|
+
fieldName: "data",
|
|
173
|
+
fieldType: "array",
|
|
174
|
+
rowNumber: 1,
|
|
175
|
+
cell: '"string"',
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
type: "cell/type",
|
|
179
|
+
fieldName: "data",
|
|
180
|
+
fieldType: "array",
|
|
181
|
+
rowNumber: 2,
|
|
182
|
+
cell: "123",
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
type: "cell/type",
|
|
186
|
+
fieldName: "data",
|
|
187
|
+
fieldType: "array",
|
|
188
|
+
rowNumber: 3,
|
|
189
|
+
cell: "true",
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
type: "cell/type",
|
|
193
|
+
fieldName: "data",
|
|
194
|
+
fieldType: "array",
|
|
195
|
+
rowNumber: 4,
|
|
196
|
+
cell: "false",
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
type: "cell/type",
|
|
200
|
+
fieldName: "data",
|
|
201
|
+
fieldType: "array",
|
|
202
|
+
rowNumber: 5,
|
|
203
|
+
cell: "null",
|
|
204
|
+
},
|
|
205
|
+
]);
|
|
206
|
+
});
|
|
207
|
+
it("should not errors for arrays matching jsonSchema", async () => {
|
|
208
|
+
const table = pl
|
|
209
|
+
.DataFrame({
|
|
210
|
+
scores: ["[80,90,100]", "[75,85,95]", "[90,95,100]"],
|
|
211
|
+
})
|
|
212
|
+
.lazy();
|
|
213
|
+
const schema = {
|
|
214
|
+
fields: [
|
|
215
|
+
{
|
|
216
|
+
name: "scores",
|
|
217
|
+
type: "array",
|
|
218
|
+
constraints: {
|
|
219
|
+
jsonSchema: {
|
|
220
|
+
type: "array",
|
|
221
|
+
items: { type: "number" },
|
|
222
|
+
minItems: 3,
|
|
223
|
+
maxItems: 3,
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
],
|
|
228
|
+
};
|
|
229
|
+
const errors = await inspectTable(table, { schema });
|
|
230
|
+
expect(errors).toHaveLength(0);
|
|
231
|
+
});
|
|
232
|
+
it("should errors for arrays not matching jsonSchema", async () => {
|
|
233
|
+
const jsonSchema = {
|
|
234
|
+
type: "array",
|
|
235
|
+
items: { type: "number" },
|
|
236
|
+
minItems: 2,
|
|
237
|
+
};
|
|
238
|
+
const table = pl
|
|
239
|
+
.DataFrame({
|
|
240
|
+
numbers: ["[1,2,3]", '["not","numbers"]', "[1]", "[4,5,6]"],
|
|
241
|
+
})
|
|
242
|
+
.lazy();
|
|
243
|
+
const schema = {
|
|
244
|
+
fields: [
|
|
245
|
+
{
|
|
246
|
+
name: "numbers",
|
|
247
|
+
type: "array",
|
|
248
|
+
constraints: {
|
|
249
|
+
jsonSchema,
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
],
|
|
253
|
+
};
|
|
254
|
+
const errors = await inspectTable(table, { schema });
|
|
255
|
+
expect(errors.filter(e => e.type === "cell/jsonSchema")).toEqual([
|
|
256
|
+
{
|
|
257
|
+
type: "cell/jsonSchema",
|
|
258
|
+
fieldName: "numbers",
|
|
259
|
+
rowNumber: 2,
|
|
260
|
+
cell: '["not","numbers"]',
|
|
261
|
+
pointer: "/0",
|
|
262
|
+
message: "must be number",
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
type: "cell/jsonSchema",
|
|
266
|
+
fieldName: "numbers",
|
|
267
|
+
rowNumber: 2,
|
|
268
|
+
cell: '["not","numbers"]',
|
|
269
|
+
pointer: "/1",
|
|
270
|
+
message: "must be number",
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
type: "cell/jsonSchema",
|
|
274
|
+
fieldName: "numbers",
|
|
275
|
+
rowNumber: 3,
|
|
276
|
+
cell: "[1]",
|
|
277
|
+
pointer: "",
|
|
278
|
+
message: "must NOT have fewer than 2 items",
|
|
279
|
+
},
|
|
280
|
+
]);
|
|
281
|
+
});
|
|
282
|
+
it("should validate complex jsonSchema with array of objects", async () => {
|
|
283
|
+
const table = pl
|
|
284
|
+
.DataFrame({
|
|
285
|
+
users: [
|
|
286
|
+
'[{"name":"John","age":30},{"name":"Jane","age":25}]',
|
|
287
|
+
'[{"name":"Bob","age":"invalid"}]',
|
|
288
|
+
],
|
|
289
|
+
})
|
|
290
|
+
.lazy();
|
|
291
|
+
const schema = {
|
|
292
|
+
fields: [
|
|
293
|
+
{
|
|
294
|
+
name: "users",
|
|
295
|
+
type: "array",
|
|
296
|
+
constraints: {
|
|
297
|
+
jsonSchema: {
|
|
298
|
+
type: "array",
|
|
299
|
+
items: {
|
|
300
|
+
type: "object",
|
|
301
|
+
properties: {
|
|
302
|
+
name: { type: "string" },
|
|
303
|
+
age: { type: "number" },
|
|
304
|
+
},
|
|
305
|
+
required: ["name", "age"],
|
|
306
|
+
},
|
|
307
|
+
},
|
|
308
|
+
},
|
|
309
|
+
},
|
|
310
|
+
],
|
|
311
|
+
};
|
|
312
|
+
const errors = await inspectTable(table, { schema });
|
|
313
|
+
expect(errors).toEqual([
|
|
314
|
+
{
|
|
315
|
+
type: "cell/jsonSchema",
|
|
316
|
+
fieldName: "users",
|
|
317
|
+
rowNumber: 2,
|
|
318
|
+
cell: '[{"name":"Bob","age":"invalid"}]',
|
|
319
|
+
pointer: "/0/age",
|
|
320
|
+
message: "must be number",
|
|
321
|
+
},
|
|
322
|
+
]);
|
|
323
|
+
});
|
|
324
|
+
it("should validate jsonSchema with unique items constraint", async () => {
|
|
325
|
+
const table = pl
|
|
326
|
+
.DataFrame({
|
|
327
|
+
tags: ['["unique","values"]', '["duplicate","duplicate"]'],
|
|
328
|
+
})
|
|
329
|
+
.lazy();
|
|
330
|
+
const schema = {
|
|
331
|
+
fields: [
|
|
332
|
+
{
|
|
333
|
+
name: "tags",
|
|
334
|
+
type: "array",
|
|
335
|
+
constraints: {
|
|
336
|
+
jsonSchema: {
|
|
337
|
+
type: "array",
|
|
338
|
+
items: { type: "string" },
|
|
339
|
+
uniqueItems: true,
|
|
340
|
+
},
|
|
341
|
+
},
|
|
342
|
+
},
|
|
343
|
+
],
|
|
344
|
+
};
|
|
345
|
+
const errors = await inspectTable(table, { schema });
|
|
346
|
+
expect(errors).toEqual([
|
|
347
|
+
{
|
|
348
|
+
type: "cell/jsonSchema",
|
|
349
|
+
fieldName: "tags",
|
|
350
|
+
rowNumber: 2,
|
|
351
|
+
cell: '["duplicate","duplicate"]',
|
|
352
|
+
pointer: "",
|
|
353
|
+
message: "must NOT have duplicate items (items ## 1 and 0 are identical)",
|
|
354
|
+
},
|
|
355
|
+
]);
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXkuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2ZpZWxkL3R5cGVzL2FycmF5LnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUVuRCxRQUFRLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO0lBQ2xDLEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RCxNQUFNLEtBQUssR0FBRyxFQUFFO2FBQ2IsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQztTQUN0RCxDQUFDO2FBQ0QsSUFBSSxFQUFFLENBQUE7UUFFVCxNQUFNLE1BQU0sR0FBVztZQUNyQixNQUFNLEVBQUU7Z0JBQ047b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLE9BQU87aUJBQ2Q7YUFDRjtTQUNGLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFlBQVksQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQ3BELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDaEMsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbEQsTUFBTSxLQUFLLEdBQUcsRUFBRTthQUNiLFNBQVMsQ0FBQztZQUNULEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO1NBQzFCLENBQUM7YUFDRCxJQUFJLEVBQUUsQ0FBQTtRQUVULE1BQU0sTUFBTSxH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bmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGluc3BlY3RUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS9pbmRleC50c1wiXG5cbmRlc2NyaWJlKFwidmFsaWRhdGVBcnJheUZpZWxkXCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgbm90IGVycm9ycyBmb3IgdmFsaWQgSlNPTiBhcnJheXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICB0YWdzOiBbJ1tcInRhZzFcIixcInRhZzJcIl0nLCBcIlsxLDIsM11cIiwgJ1tcImFcIixcImJcIixcImNcIl0nXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0YWdzXCIsXG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9IYXZlTGVuZ3RoKDApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbm90IGVycm9ycyBmb3IgZW1wdHkgYXJyYXlzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgaXRlbXM6IFtcIltdXCIsIFwiW11cIiwgXCJbXVwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJpdGVtc1wiLFxuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgIGV4cGVjdChlcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIG5vdCBlcnJvcnMgZm9yIG51bGwgdmFsdWVzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgZGF0YTogWydbXCJ2YWx1ZVwiXScsIG51bGwsIFwiWzEsMiwzXVwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJkYXRhXCIsXG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9IYXZlTGVuZ3RoKDApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgZXJyb3JzIGZvciBKU09OIG9iamVjdHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBkYXRhOiBbXCJbMSwyLDNdXCIsICd7XCJrZXlcIjpcInZhbHVlXCJ9JywgJ1tcImFcIixcImJcIl0nXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJkYXRhXCIsXG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiY2VsbC90eXBlXCIsXG4gICAgICAgIGZpZWxkTmFtZTogXCJkYXRhXCIsXG4gICAgICAgIGZpZWxkVHlwZTogXCJhcnJheVwiLFxuICAgICAgICByb3dOdW1iZXI6IDIsXG4gICAgICAgIGNlbGw6ICd7XCJrZXlcIjpcInZhbHVlXCJ9JyxcbiAgICAgIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBlcnJvcnMgZm9yIGludmFsaWQgSlNPTlwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGRhdGE6IFsnW1widmFsaWRcIl0nLCBcImludmFsaWQganNvblwiLCBcIlsxLDIsM11cIiwgXCJbYnJva2VuXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImRhdGFcIixcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzLmZpbHRlcihlID0+IGUudHlwZSA9PT0gXCJjZWxsL3R5cGVcIikpLnRvSGF2ZUxlbmd0aCgyKVxuICAgIGV4cGVjdChlcnJvcnMpLnRvQ29udGFpbkVxdWFsKHtcbiAgICAgIHR5cGU6IFwiY2VsbC90eXBlXCIsXG4gICAgICBmaWVsZE5hbWU6IFwiZGF0YVwiLFxuICAgICAgZmllbGRUeXBlOiBcImFycmF5XCIsXG4gICAgICByb3dOdW1iZXI6IDIsXG4gICAgICBjZWxsOiBcImludmFsaWQganNvblwiLFxuICAgIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9Db250YWluRXF1YWwoe1xuICAgICAgdHlwZTogXCJjZWxsL3R5cGVcIixcbiAgICAgIGZpZWxkTmFtZTogXCJkYXRhXCIsXG4gICAgICBmaWVsZFR5cGU6IFwiYXJyYXlcIixcbiAgICAgIHJvd051bWJlcjogNCxcbiAgICAgIGNlbGw6IFwiW2Jyb2tlblwiLFxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIG5lc3RlZCBhcnJheXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBtYXRyaXg6IFtcIltbMSwyXSxbMyw0XV1cIiwgXCJbWzUsNl0sWzcsOF1dXCIsICdbW1wiYVwiLFwiYlwiXSxbXCJjXCIsXCJkXCJdXSddLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcIm1hdHJpeFwiLFxuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgIGV4cGVjdChlcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGVycm9ycyBmb3IgZW1wdHkgc3RyaW5nc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGRhdGE6IFsnW1widmFsaWRcIl0nLCBcIlwiLCBcIlsxLDIsM11cIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiZGF0YVwiLFxuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgIGV4cGVjdChlcnJvcnMpLnRvRXF1YWwoW1xuICAgICAge1xuICAgICAgICB0eXBlOiBcImNlbGwvdHlwZVwiLFxuICAgICAgICBmaWVsZE5hbWU6IFwiZGF0YVwiLFxuICAgICAgICBmaWVsZFR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgcm93TnVtYmVyOiAyLFxuICAgICAgICBjZWxsOiBcIlwiLFxuICAgICAgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGVycm9ycyBmb3IgSlNPTiBwcmltaXRpdmVzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgZGF0YTogWydcInN0cmluZ1wiJywgXCIxMjNcIiwgXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJudWxsXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImRhdGFcIixcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0VxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJjZWxsL3R5cGVcIixcbiAgICAgICAgZmllbGROYW1lOiBcImRhdGFcIixcbiAgICAgICAgZmllbGRUeXBlOiBcImFycmF5XCIsXG4gICAgICAgIHJvd051bWJlcjogMSxcbiAgICAgICAgY2VsbDogJ1wic3RyaW5nXCInLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJjZWxsL3R5cGVcIixcbiAgICAgICAgZmllbGROYW1lOiBcImRhdGFcIixcbiAgICAgICAgZmllbGRUeXBlOiBcImFycmF5XCIsXG4gICAgICAgIHJvd051bWJlcjogMixcbiAgICAgICAgY2VsbDogXCIxMjNcIixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiY2VsbC90eXBlXCIsXG4gICAgICAgIGZpZWxkTmFtZTogXCJkYXRhXCIsXG4gICAgICAgIGZpZWxkVHlwZTogXCJhcnJheVwiLFxuICAgICAgICByb3dOdW1iZXI6IDMsXG4gICAgICAgIGNlbGw6IFwidHJ1ZVwiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJjZWxsL3R5cGVcIixcbiAgICAgICAgZmllbGROYW1lOiBcImRhdGFcIixcbiAgICAgICAgZmllbGRUeXBlOiBcImFycmF5XCIsXG4gICAgICAgIHJvd051bWJlcjogNCxcbiAgICAgICAgY2VsbDogXCJmYWxzZVwiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJjZWxsL3R5cGVcIixcbiAgICAgICAgZmllbGROYW1lOiBcImRhdGFcIixcbiAgICAgICAgZmllbGRUeXBlOiBcImFycmF5XCIsXG4gICAgICAgIHJvd051bWJlcjogNSxcbiAgICAgICAgY2VsbDogXCJudWxsXCIsXG4gICAgICB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbm90IGVycm9ycyBmb3IgYXJyYXlzIG1hdGNoaW5nIGpzb25TY2hlbWFcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBzY29yZXM6IFtcIls4MCw5MCwxMDBdXCIsIFwiWzc1LDg1LDk1XVwiLCBcIls5MCw5NSwxMDBdXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInNjb3Jlc1wiLFxuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBjb25zdHJhaW50czoge1xuICAgICAgICAgICAganNvblNjaGVtYToge1xuICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICAgIGl0ZW1zOiB7IHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgICAgICAgbWluSXRlbXM6IDMsXG4gICAgICAgICAgICAgIG1heEl0ZW1zOiAzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9IYXZlTGVuZ3RoKDApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgZXJyb3JzIGZvciBhcnJheXMgbm90IG1hdGNoaW5nIGpzb25TY2hlbWFcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGpzb25TY2hlbWEgPSB7XG4gICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICBpdGVtczogeyB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICBtaW5JdGVtczogMixcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbnVtYmVyczogW1wiWzEsMiwzXVwiLCAnW1wibm90XCIsXCJudW1iZXJzXCJdJywgXCJbMV1cIiwgXCJbNCw1LDZdXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcIm51bWJlcnNcIixcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgY29uc3RyYWludHM6IHtcbiAgICAgICAgICAgIGpzb25TY2hlbWEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgIGV4cGVjdChlcnJvcnMuZmlsdGVyKGUgPT4gZS50eXBlID09PSBcImNlbGwvanNvblNjaGVtYVwiKSkudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiY2VsbC9qc29uU2NoZW1hXCIsXG4gICAgICAgIGZpZWxkTmFtZTogXCJudW1iZXJzXCIsXG4gICAgICAgIHJvd051bWJlcjogMixcbiAgICAgICAgY2VsbDogJ1tcIm5vdFwiLFwibnVtYmVyc1wiXScsXG4gICAgICAgIHBvaW50ZXI6IFwiLzBcIixcbiAgICAgICAgbWVzc2FnZTogXCJtdXN0IGJlIG51bWJlclwiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJjZWxsL2pzb25TY2hlbWFcIixcbiAgICAgICAgZmllbGROYW1lOiBcIm51bWJlcnNcIixcbiAgICAgICAgcm93TnVtYmVyOiAyLFxuICAgICAgICBjZWxsOiAnW1wibm90XCIsXCJudW1iZXJzXCJdJyxcbiAgICAgICAgcG9pbnRlcjogXCIvMVwiLFxuICAgICAgICBtZXNzYWdlOiBcIm11c3QgYmUgbnVtYmVyXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiBcImNlbGwvanNvblNjaGVtYVwiLFxuICAgICAgICBmaWVsZE5hbWU6IFwibnVtYmVyc1wiLFxuICAgICAgICByb3dOdW1iZXI6IDMsXG4gICAgICAgIGNlbGw6IFwiWzFdXCIsXG4gICAgICAgIHBvaW50ZXI6IFwiXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwibXVzdCBOT1QgaGF2ZSBmZXdlciB0aGFuIDIgaXRlbXNcIixcbiAgICAgIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCB2YWxpZGF0ZSBjb21wbGV4IGpzb25TY2hlbWEgd2l0aCBhcnJheSBvZiBvYmplY3RzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgdXNlcnM6IFtcbiAgICAgICAgICAnW3tcIm5hbWVcIjpcIkpvaG5cIixcImFnZVwiOjMwfSx7XCJuYW1lXCI6XCJKYW5lXCIsXCJhZ2VcIjoyNX1dJyxcbiAgICAgICAgICAnW3tcIm5hbWVcIjpcIkJvYlwiLFwiYWdlXCI6XCJpbnZhbGlkXCJ9XScsXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwidXNlcnNcIixcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgY29uc3RyYWludHM6IHtcbiAgICAgICAgICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgbmFtZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgICBhZ2U6IHsgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IFtcIm5hbWVcIiwgXCJhZ2VcIl0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0VxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJjZWxsL2pzb25TY2hlbWFcIixcbiAgICAgICAgZmllbGROYW1lOiBcInVzZXJzXCIsXG4gICAgICAgIHJvd051bWJlcjogMixcbiAgICAgICAgY2VsbDogJ1t7XCJuYW1lXCI6XCJCb2JcIixcImFnZVwiOlwiaW52YWxpZFwifV0nLFxuICAgICAgICBwb2ludGVyOiBcIi8wL2FnZVwiLFxuICAgICAgICBtZXNzYWdlOiBcIm11c3QgYmUgbnVtYmVyXCIsXG4gICAgICB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgdmFsaWRhdGUganNvblNjaGVtYSB3aXRoIHVuaXF1ZSBpdGVtcyBjb25zdHJhaW50XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgdGFnczogWydbXCJ1bmlxdWVcIixcInZhbHVlc1wiXScsICdbXCJkdXBsaWNhdGVcIixcImR1cGxpY2F0ZVwiXSddLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInRhZ3NcIixcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgY29uc3RyYWludHM6IHtcbiAgICAgICAgICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICBpdGVtczogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgIHVuaXF1ZUl0ZW1zOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiY2VsbC9qc29uU2NoZW1hXCIsXG4gICAgICAgIGZpZWxkTmFtZTogXCJ0YWdzXCIsXG4gICAgICAgIHJvd051bWJlcjogMixcbiAgICAgICAgY2VsbDogJ1tcImR1cGxpY2F0ZVwiLFwiZHVwbGljYXRlXCJdJyxcbiAgICAgICAgcG9pbnRlcjogXCJcIixcbiAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICBcIm11c3QgTk9UIGhhdmUgZHVwbGljYXRlIGl0ZW1zIChpdGVtcyAjIyAxIGFuZCAwIGFyZSBpZGVudGljYWwpXCIsXG4gICAgICB9LFxuICAgIF0pXG4gIH0pXG59KVxuIl19
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { BooleanField } from "@frictionless-ts/metadata";
|
|
2
|
+
import * as pl from "nodejs-polars";
|
|
3
|
+
export declare function parseBooleanField(field: BooleanField, fieldExpr: pl.Expr): pl.Expr;
|
|
4
|
+
export declare function stringifyBooleanField(field: BooleanField, fieldExpr: pl.Expr): pl.Expr;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
const DEFAULT_TRUE_VALUES = ["true", "True", "TRUE", "1"];
|
|
3
|
+
const DEFAULT_FALSE_VALUES = ["false", "False", "FALSE", "0"];
|
|
4
|
+
export function parseBooleanField(field, fieldExpr) {
|
|
5
|
+
const trueValues = field.trueValues ?? DEFAULT_TRUE_VALUES;
|
|
6
|
+
const falseValues = field.falseValues ?? DEFAULT_FALSE_VALUES;
|
|
7
|
+
for (const value of trueValues)
|
|
8
|
+
fieldExpr = fieldExpr.replace(value, "1");
|
|
9
|
+
for (const value of falseValues)
|
|
10
|
+
fieldExpr = fieldExpr.replace(value, "0");
|
|
11
|
+
fieldExpr = fieldExpr.cast(pl.Int8);
|
|
12
|
+
return pl
|
|
13
|
+
.when(fieldExpr.eq(1))
|
|
14
|
+
.then(pl.lit(true))
|
|
15
|
+
.when(fieldExpr.eq(0))
|
|
16
|
+
.then(pl.lit(false))
|
|
17
|
+
.otherwise(pl.lit(null))
|
|
18
|
+
.alias(field.name);
|
|
19
|
+
}
|
|
20
|
+
const DEFAULT_TRUE_VALUE = "true";
|
|
21
|
+
const DEFAULT_FALSE_VALUE = "false";
|
|
22
|
+
export function stringifyBooleanField(field, fieldExpr) {
|
|
23
|
+
const trueValue = field.trueValues?.[0] ?? DEFAULT_TRUE_VALUE;
|
|
24
|
+
const falseValue = field.falseValues?.[0] ?? DEFAULT_FALSE_VALUE;
|
|
25
|
+
return pl
|
|
26
|
+
.when(fieldExpr.eq(pl.lit(true)))
|
|
27
|
+
.then(pl.lit(trueValue))
|
|
28
|
+
.otherwise(pl.lit(falseValue))
|
|
29
|
+
.alias(field.name);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vbGVhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2ZpZWxkL3R5cGVzL2Jvb2xlYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFbkMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFBO0FBQ3pELE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQTtBQUU3RCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBbUIsRUFBRSxTQUFrQjtJQUN2RSxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxJQUFJLG1CQUFtQixDQUFBO0lBQzFELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLElBQUksb0JBQW9CLENBQUE7SUFFN0QsS0FBSyxNQUFNLEtBQUssSUFBSSxVQUFVO1FBQUUsU0FBUyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0lBQ3pFLEtBQUssTUFBTSxLQUFLLElBQUksV0FBVztRQUFFLFNBQVMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUUxRSxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFbkMsT0FBTyxFQUFFO1NBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbkIsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkIsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUN0QixDQUFDO0FBRUQsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUE7QUFDakMsTUFBTSxtQkFBbUIsR0FBRyxPQUFPLENBQUE7QUFFbkMsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEtBQW1CLEVBQUUsU0FBa0I7SUFDM0UsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLGtCQUFrQixDQUFBO0lBQzdELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxtQkFBbUIsQ0FBQTtJQUVoRSxPQUFPLEVBQUU7U0FDTixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDaEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdkIsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDN0IsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCb29sZWFuRmllbGQgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5cbmNvbnN0IERFRkFVTFRfVFJVRV9WQUxVRVMgPSBbXCJ0cnVlXCIsIFwiVHJ1ZVwiLCBcIlRSVUVcIiwgXCIxXCJdXG5jb25zdCBERUZBVUxUX0ZBTFNFX1ZBTFVFUyA9IFtcImZhbHNlXCIsIFwiRmFsc2VcIiwgXCJGQUxTRVwiLCBcIjBcIl1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQm9vbGVhbkZpZWxkKGZpZWxkOiBCb29sZWFuRmllbGQsIGZpZWxkRXhwcjogcGwuRXhwcikge1xuICBjb25zdCB0cnVlVmFsdWVzID0gZmllbGQudHJ1ZVZhbHVlcyA/PyBERUZBVUxUX1RSVUVfVkFMVUVTXG4gIGNvbnN0IGZhbHNlVmFsdWVzID0gZmllbGQuZmFsc2VWYWx1ZXMgPz8gREVGQVVMVF9GQUxTRV9WQUxVRVNcblxuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHRydWVWYWx1ZXMpIGZpZWxkRXhwciA9IGZpZWxkRXhwci5yZXBsYWNlKHZhbHVlLCBcIjFcIilcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBmYWxzZVZhbHVlcykgZmllbGRFeHByID0gZmllbGRFeHByLnJlcGxhY2UodmFsdWUsIFwiMFwiKVxuXG4gIGZpZWxkRXhwciA9IGZpZWxkRXhwci5jYXN0KHBsLkludDgpXG5cbiAgcmV0dXJuIHBsXG4gICAgLndoZW4oZmllbGRFeHByLmVxKDEpKVxuICAgIC50aGVuKHBsLmxpdCh0cnVlKSlcbiAgICAud2hlbihmaWVsZEV4cHIuZXEoMCkpXG4gICAgLnRoZW4ocGwubGl0KGZhbHNlKSlcbiAgICAub3RoZXJ3aXNlKHBsLmxpdChudWxsKSlcbiAgICAuYWxpYXMoZmllbGQubmFtZSlcbn1cblxuY29uc3QgREVGQVVMVF9UUlVFX1ZBTFVFID0gXCJ0cnVlXCJcbmNvbnN0IERFRkFVTFRfRkFMU0VfVkFMVUUgPSBcImZhbHNlXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeUJvb2xlYW5GaWVsZChmaWVsZDogQm9vbGVhbkZpZWxkLCBmaWVsZEV4cHI6IHBsLkV4cHIpIHtcbiAgY29uc3QgdHJ1ZVZhbHVlID0gZmllbGQudHJ1ZVZhbHVlcz8uWzBdID8/IERFRkFVTFRfVFJVRV9WQUxVRVxuICBjb25zdCBmYWxzZVZhbHVlID0gZmllbGQuZmFsc2VWYWx1ZXM/LlswXSA/PyBERUZBVUxUX0ZBTFNFX1ZBTFVFXG5cbiAgcmV0dXJuIHBsXG4gICAgLndoZW4oZmllbGRFeHByLmVxKHBsLmxpdCh0cnVlKSkpXG4gICAgLnRoZW4ocGwubGl0KHRydWVWYWx1ZSkpXG4gICAgLm90aGVyd2lzZShwbC5saXQoZmFsc2VWYWx1ZSkpXG4gICAgLmFsaWFzKGZpZWxkLm5hbWUpXG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { normalizeTable } from "../../table/index.js";
|
|
4
|
+
import { denormalizeTable } from "../../table/index.js";
|
|
5
|
+
describe("parseBooleanField", () => {
|
|
6
|
+
it.each([
|
|
7
|
+
// Default true values
|
|
8
|
+
["true", true, {}],
|
|
9
|
+
["True", true, {}],
|
|
10
|
+
["TRUE", true, {}],
|
|
11
|
+
["1", true, {}],
|
|
12
|
+
// Default false values
|
|
13
|
+
["false", false, {}],
|
|
14
|
+
["False", false, {}],
|
|
15
|
+
["FALSE", false, {}],
|
|
16
|
+
["0", false, {}],
|
|
17
|
+
// Invalid values
|
|
18
|
+
["", null, {}],
|
|
19
|
+
["invalid", null, {}],
|
|
20
|
+
["truthy", null, {}],
|
|
21
|
+
["falsy", null, {}],
|
|
22
|
+
["2", null, {}],
|
|
23
|
+
["-100", null, {}],
|
|
24
|
+
["t", null, {}],
|
|
25
|
+
["f", null, {}],
|
|
26
|
+
["3.14", null, {}],
|
|
27
|
+
// Custom true values
|
|
28
|
+
["Y", true, { trueValues: ["Y", "y", "yes"] }],
|
|
29
|
+
["y", true, { trueValues: ["Y", "y", "yes"] }],
|
|
30
|
+
["yes", true, { trueValues: ["Y", "y", "yes"] }],
|
|
31
|
+
["true", null, { trueValues: ["Y", "y", "yes"] }],
|
|
32
|
+
// Custom false values
|
|
33
|
+
["N", false, { falseValues: ["N", "n", "no"] }],
|
|
34
|
+
["n", false, { falseValues: ["N", "n", "no"] }],
|
|
35
|
+
["no", false, { falseValues: ["N", "n", "no"] }],
|
|
36
|
+
["false", null, { falseValues: ["N", "n", "no"] }],
|
|
37
|
+
// Custom true and false values
|
|
38
|
+
["oui", true, { trueValues: ["oui", "si"], falseValues: ["non", "no"] }],
|
|
39
|
+
["si", true, { trueValues: ["oui", "si"], falseValues: ["non", "no"] }],
|
|
40
|
+
["non", false, { trueValues: ["oui", "si"], falseValues: ["non", "no"] }],
|
|
41
|
+
["no", false, { trueValues: ["oui", "si"], falseValues: ["non", "no"] }],
|
|
42
|
+
])("%s -> %s %o", async (cell, value, options) => {
|
|
43
|
+
const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
|
|
44
|
+
const schema = {
|
|
45
|
+
fields: [{ name: "name", type: "boolean", ...options }],
|
|
46
|
+
};
|
|
47
|
+
const result = await normalizeTable(table, schema);
|
|
48
|
+
const frame = await result.collect();
|
|
49
|
+
expect(frame.toRecords()[0]?.name).toEqual(value);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe("stringifyBooleanField", () => {
|
|
53
|
+
it.each([
|
|
54
|
+
// Default values
|
|
55
|
+
[true, "true", {}],
|
|
56
|
+
[false, "false", {}],
|
|
57
|
+
// Custom true values
|
|
58
|
+
[true, "Y", { trueValues: ["Y", "y", "yes"] }],
|
|
59
|
+
[false, "false", { trueValues: ["Y", "y", "yes"] }],
|
|
60
|
+
// Custom false values
|
|
61
|
+
[true, "true", { falseValues: ["N", "n", "no"] }],
|
|
62
|
+
[false, "N", { falseValues: ["N", "n", "no"] }],
|
|
63
|
+
// Custom true and false values
|
|
64
|
+
[true, "oui", { trueValues: ["oui", "si"], falseValues: ["non", "no"] }],
|
|
65
|
+
[false, "non", { trueValues: ["oui", "si"], falseValues: ["non", "no"] }],
|
|
66
|
+
])("%s -> %s %o", async (value, expected, options) => {
|
|
67
|
+
const table = pl.DataFrame([pl.Series("name", [value], pl.Bool)]).lazy();
|
|
68
|
+
const schema = {
|
|
69
|
+
fields: [{ name: "name", type: "boolean", ...options }],
|
|
70
|
+
};
|
|
71
|
+
const result = await denormalizeTable(table, schema);
|
|
72
|
+
const frame = await result.collect();
|
|
73
|
+
expect(frame.toRecords()[0]?.name).toEqual(expected);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vbGVhbi5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZmllbGQvdHlwZXMvYm9vbGVhbi5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFFdkQsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ04sc0JBQXNCO1FBQ3RCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFDbEIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNsQixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ2xCLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFFZix1QkFBdUI7UUFDdkIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNwQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3BCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDcEIsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUVoQixpQkFBaUI7UUFDakIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNkLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFDckIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNwQixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxD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LElBQUksQ0FBQyxFQUFFLENBQUM7UUFDeEUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO0tBQzFFLENBQUMsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDbkQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUV4RSxNQUFNLE1BQU0sR0FBRztZQUNiLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBa0IsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO1NBQ2pFLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGdCQUFnQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUNwRCxNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUVwQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN0RCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IG5vcm1hbGl6ZVRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlL2luZGV4LnRzXCJcbmltcG9ydCB7IGRlbm9ybWFsaXplVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUvaW5kZXgudHNcIlxuXG5kZXNjcmliZShcInBhcnNlQm9vbGVhbkZpZWxkXCIsICgpID0+IHtcbiAgaXQuZWFjaChbXG4gICAgLy8gRGVmYXVsdCB0cnVlIHZhbHVlc1xuICAgIFtcInRydWVcIiwgdHJ1ZSwge31dLFxuICAgIFtcIlRydWVcIiwgdHJ1ZSwge31dLFxuICAgIFtcIlRSVUVcIiwgdHJ1ZSwge31dLFxuICAgIFtcIjFcIiwgdHJ1ZSwge31dLFxuXG4gICAgLy8gRGVmYXVsdCBmYWxzZSB2YWx1ZXNcbiAgICBbXCJmYWxzZVwiLCBmYWxzZSwge31dLFxuICAgIFtcIkZhbHNlXCIsIGZhbHNlLCB7fV0sXG4gICAgW1wiRkFMU0VcIiwgZmFsc2UsIHt9XSxcbiAgICBbXCIwXCIsIGZhbHNlLCB7fV0sXG5cbiAgICAvLyBJbnZhbGlkIHZhbHVlc1xuICAgIFtcIlwiLCBudWxsLCB7fV0sXG4gICAgW1wiaW52YWxpZFwiLCBudWxsLCB7fV0sXG4gICAgW1widHJ1dGh5XCIsIG51bGwsIHt9XSxcbiAgICBbXCJmYWxzeVwiLCBudWxsLCB7fV0sXG4gICAgW1wiMlwiLCBudWxsLCB7fV0sXG4gICAgW1wiLTEwMFwiLCBudWxsLCB7fV0sXG4gICAgW1widFwiLCBudWxsLCB7fV0sXG4gICAgW1wiZlwiLCBudWxsLCB7fV0sXG4gICAgW1wiMy4xNFwiLCBudWxsLCB7fV0sXG5cbiAgICAvLyBDdXN0b20gdHJ1ZSB2YWx1ZXNcbiAgICBbXCJZXCIsIHRydWUsIHsgdHJ1ZVZhbHVlczogW1wiWVwiLCBcInlcIiwgXCJ5ZXNcIl0gfV0sXG4gICAgW1wieVwiLCB0cnVlLCB7IHRydWVWYWx1ZXM6IFtcIllcIiwgXCJ5XCIsIFwieWVzXCJdIH1dLFxuICAgIFtcInllc1wiLCB0cnVlLCB7IHRydWVWYWx1ZXM6IFtcIllcIiwgXCJ5XCIsIFwieWVzXCJdIH1dLFxuICAgIFtcInRydWVcIiwgbnVsbCwgeyB0cnVlVmFsdWVzOiBbXCJZXCIsIFwieVwiLCBcInllc1wiXSB9XSxcblxuICAgIC8vIEN1c3RvbSBmYWxzZSB2YWx1ZXNcbiAgICBbXCJOXCIsIGZhbHNlLCB7IGZhbHNlVmFsdWVzOiBbXCJOXCIsIFwiblwiLCBcIm5vXCJdIH1dLFxuICAgIFtcIm5cIiwgZmFsc2UsIHsgZmFsc2VWYWx1ZXM6IFtcIk5cIiwgXCJuXCIsIFwibm9cIl0gfV0sXG4gICAgW1wibm9cIiwgZmFsc2UsIHsgZmFsc2VWYWx1ZXM6IFtcIk5cIiwgXCJuXCIsIFwibm9cIl0gfV0sXG4gICAgW1wiZmFsc2VcIiwgbnVsbCwgeyBmYWxzZVZhbHVlczogW1wiTlwiLCBcIm5cIiwgXCJub1wiXSB9XSxcblxuICAgIC8vIEN1c3RvbSB0cnVlIGFuZCBmYWxzZSB2YWx1ZXNcbiAgICBbXCJvdWlcIiwgdHJ1ZSwgeyB0cnVlVmFsdWVzOiBbXCJvdWlcIiwgXCJzaVwiXSwgZmFsc2VWYWx1ZXM6IFtcIm5vblwiLCBcIm5vXCJdIH1dLFxuICAgIFtcInNpXCIsIHRydWUsIHsgdHJ1ZVZhbHVlczogW1wib3VpXCIsIFwic2lcIl0sIGZhbHNlVmFsdWVzOiBbXCJub25cIiwgXCJub1wiXSB9XSxcbiAgICBbXCJub25cIiwgZmFsc2UsIHsgdHJ1ZVZhbHVlczogW1wib3VpXCIsIFwic2lcIl0sIGZhbHNlVmFsdWVzOiBbXCJub25cIiwgXCJub1wiXSB9XSxcbiAgICBbXCJub1wiLCBmYWxzZSwgeyB0cnVlVmFsdWVzOiBbXCJvdWlcIiwgXCJzaVwiXSwgZmFsc2VWYWx1ZXM6IFtcIm5vblwiLCBcIm5vXCJdIH1dLFxuICBdKShcIiVzIC0+ICVzICVvXCIsIGFzeW5jIChjZWxsLCB2YWx1ZSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGwuRGF0YUZyYW1lKFtwbC5TZXJpZXMoXCJuYW1lXCIsIFtjZWxsXSwgcGwuU3RyaW5nKV0pLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJib29sZWFuXCIgYXMgY29uc3QsIC4uLm9wdGlvbnMgfV0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbm9ybWFsaXplVGFibGUodGFibGUsIHNjaGVtYSlcbiAgICBjb25zdCBmcmFtZSA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcblxuICAgIGV4cGVjdChmcmFtZS50b1JlY29yZHMoKVswXT8ubmFtZSkudG9FcXVhbCh2YWx1ZSlcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKFwic3RyaW5naWZ5Qm9vbGVhbkZpZWxkXCIsICgpID0+IHtcbiAgaXQuZWFjaChbXG4gICAgLy8gRGVmYXVsdCB2YWx1ZXNcbiAgICBbdHJ1ZSwgXCJ0cnVlXCIsIHt9XSxcbiAgICBbZmFsc2UsIFwiZmFsc2VcIiwge31dLFxuXG4gICAgLy8gQ3VzdG9tIHRydWUgdmFsdWVzXG4gICAgW3RydWUsIFwiWVwiLCB7IHRydWVWYWx1ZXM6IFtcIllcIiwgXCJ5XCIsIFwieWVzXCJdIH1dLFxuICAgIFtmYWxzZSwgXCJmYWxzZVwiLCB7IHRydWVWYWx1ZXM6IFtcIllcIiwgXCJ5XCIsIFwieWVzXCJdIH1dLFxuXG4gICAgLy8gQ3VzdG9tIGZhbHNlIHZhbHVlc1xuICAgIFt0cnVlLCBcInRydWVcIiwgeyBmYWxzZVZhbHVlczogW1wiTlwiLCBcIm5cIiwgXCJub1wiXSB9XSxcbiAgICBbZmFsc2UsIFwiTlwiLCB7IGZhbHNlVmFsdWVzOiBbXCJOXCIsIFwiblwiLCBcIm5vXCJdIH1dLFxuXG4gICAgLy8gQ3VzdG9tIHRydWUgYW5kIGZhbHNlIHZhbHVlc1xuICAgIFt0cnVlLCBcIm91aVwiLCB7IHRydWVWYWx1ZXM6IFtcIm91aVwiLCBcInNpXCJdLCBmYWxzZVZhbHVlczogW1wibm9uXCIsIFwibm9cIl0gfV0sXG4gICAgW2ZhbHNlLCBcIm5vblwiLCB7IHRydWVWYWx1ZXM6IFtcIm91aVwiLCBcInNpXCJdLCBmYWxzZVZhbHVlczogW1wibm9uXCIsIFwibm9cIl0gfV0sXG4gIF0pKFwiJXMgLT4gJXMgJW9cIiwgYXN5bmMgKHZhbHVlLCBleHBlY3RlZCwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGwuRGF0YUZyYW1lKFtwbC5TZXJpZXMoXCJuYW1lXCIsIFt2YWx1ZV0sIHBsLkJvb2wpXSkubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFt7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcImJvb2xlYW5cIiBhcyBjb25zdCwgLi4ub3B0aW9ucyB9XSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZW5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEpXG4gICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICBleHBlY3QoZnJhbWUudG9SZWNvcmRzKClbMF0/Lm5hbWUpLnRvRXF1YWwoZXhwZWN0ZWQpXG4gIH0pXG59KVxuIl19
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DateField } from "@frictionless-ts/metadata";
|
|
2
|
+
import * as pl from "nodejs-polars";
|
|
3
|
+
export declare function parseDateField(field: DateField, fieldExpr: pl.Expr): pl.Expr;
|
|
4
|
+
export declare function stringifyDateField(field: DateField, fieldExpr: pl.Expr): pl.Expr;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
const DEFAULT_FORMAT = "%Y-%m-%d";
|
|
3
|
+
export function parseDateField(field, fieldExpr) {
|
|
4
|
+
let format = DEFAULT_FORMAT;
|
|
5
|
+
if (field.format && field.format !== "default" && field.format !== "any") {
|
|
6
|
+
format = field.format;
|
|
7
|
+
}
|
|
8
|
+
return fieldExpr.str.strptime(pl.Date, format);
|
|
9
|
+
}
|
|
10
|
+
export function stringifyDateField(field, fieldExpr) {
|
|
11
|
+
const format = field.format ?? DEFAULT_FORMAT;
|
|
12
|
+
return fieldExpr.date.strftime(format);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2ZpZWxkL3R5cGVzL2RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFbkMsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFBO0FBRWpDLE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBZ0IsRUFBRSxTQUFrQjtJQUNqRSxJQUFJLE1BQU0sR0FBRyxjQUFjLENBQUE7SUFDM0IsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDekUsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUE7SUFDdkIsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtBQUNoRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWdCLEVBQUUsU0FBa0I7SUFDckUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxjQUFjLENBQUE7SUFFN0MsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEYXRlRmllbGQgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5cbmNvbnN0IERFRkFVTFRfRk9STUFUID0gXCIlWS0lbS0lZFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURhdGVGaWVsZChmaWVsZDogRGF0ZUZpZWxkLCBmaWVsZEV4cHI6IHBsLkV4cHIpIHtcbiAgbGV0IGZvcm1hdCA9IERFRkFVTFRfRk9STUFUXG4gIGlmIChmaWVsZC5mb3JtYXQgJiYgZmllbGQuZm9ybWF0ICE9PSBcImRlZmF1bHRcIiAmJiBmaWVsZC5mb3JtYXQgIT09IFwiYW55XCIpIHtcbiAgICBmb3JtYXQgPSBmaWVsZC5mb3JtYXRcbiAgfVxuXG4gIHJldHVybiBmaWVsZEV4cHIuc3RyLnN0cnB0aW1lKHBsLkRhdGUsIGZvcm1hdClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeURhdGVGaWVsZChmaWVsZDogRGF0ZUZpZWxkLCBmaWVsZEV4cHI6IHBsLkV4cHIpIHtcbiAgY29uc3QgZm9ybWF0ID0gZmllbGQuZm9ybWF0ID8/IERFRkFVTFRfRk9STUFUXG5cbiAgcmV0dXJuIGZpZWxkRXhwci5kYXRlLnN0cmZ0aW1lKGZvcm1hdClcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { normalizeTable } from "../../table/index.js";
|
|
4
|
+
import { denormalizeTable } from "../../table/index.js";
|
|
5
|
+
describe("parseDateField", () => {
|
|
6
|
+
it.each([
|
|
7
|
+
// Default format
|
|
8
|
+
["2019-01-01", new Date(Date.UTC(2019, 0, 1)), {}],
|
|
9
|
+
["10th Jan 1969", null, {}],
|
|
10
|
+
["invalid", null, {}],
|
|
11
|
+
["", null, {}],
|
|
12
|
+
// Custom format
|
|
13
|
+
["21/11/2006", new Date(Date.UTC(2006, 10, 21)), { format: "%d/%m/%Y" }],
|
|
14
|
+
[
|
|
15
|
+
"21/11/06 16:30",
|
|
16
|
+
new Date(Date.UTC(2006, 10, 21)),
|
|
17
|
+
{ format: "%d/%m/%y" },
|
|
18
|
+
],
|
|
19
|
+
["invalid", null, { format: "%d/%m/%y" }],
|
|
20
|
+
["", null, { format: "%d/%m/%y" }],
|
|
21
|
+
["2006/11/21", new Date(Date.UTC(2006, 10, 21)), { format: "%Y/%m/%d" }],
|
|
22
|
+
// Invalid format
|
|
23
|
+
["21/11/06", null, { format: "invalid" }],
|
|
24
|
+
])("%s -> %s %o", async (cell, expected, options) => {
|
|
25
|
+
const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
|
|
26
|
+
const schema = {
|
|
27
|
+
fields: [{ name: "name", type: "date", ...options }],
|
|
28
|
+
};
|
|
29
|
+
const result = await normalizeTable(table, schema);
|
|
30
|
+
const frame = await result.collect();
|
|
31
|
+
expect(frame.toRecords()[0]?.name).toEqual(expected);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe("stringifyDateField", () => {
|
|
35
|
+
it.each([
|
|
36
|
+
// Default format
|
|
37
|
+
[new Date(Date.UTC(2019, 0, 1)), "2019-01-01", {}],
|
|
38
|
+
[new Date(Date.UTC(2006, 10, 21)), "2006-11-21", {}],
|
|
39
|
+
// Custom format
|
|
40
|
+
[new Date(Date.UTC(2006, 10, 21)), "21/11/2006", { format: "%d/%m/%Y" }],
|
|
41
|
+
[new Date(Date.UTC(2006, 10, 21)), "2006/11/21", { format: "%Y/%m/%d" }],
|
|
42
|
+
])("%s -> %s %o", async (value, expected, options) => {
|
|
43
|
+
const table = pl.DataFrame([pl.Series("name", [value], pl.Date)]).lazy();
|
|
44
|
+
const schema = {
|
|
45
|
+
fields: [{ name: "name", type: "date", ...options }],
|
|
46
|
+
};
|
|
47
|
+
const result = await denormalizeTable(table, schema);
|
|
48
|
+
const frame = await result.collect();
|
|
49
|
+
expect(frame.toRecords()[0]?.name).toEqual(expected);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZmllbGQvdHlwZXMvZGF0ZS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFFdkQsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtJQUM5QixFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ04saUJBQWlCO1FBQ2pCLENBQUMsWUFBWSxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNsRCxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzNCLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFDckIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUVkLGdCQUFnQjtRQUNoQixDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQztRQUN4RTtZQUNFLGdCQUFnQjtZQUNoQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFO1NBQ3ZCO1FBQ0QsQ0FBQyxTQUFTLEVBQUUs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LENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3BELE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBRXBDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3RELENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHsgbm9ybWFsaXplVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUvaW5kZXgudHNcIlxuaW1wb3J0IHsgZGVub3JtYWxpemVUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS9pbmRleC50c1wiXG5cbmRlc2NyaWJlKFwicGFyc2VEYXRlRmllbGRcIiwgKCkgPT4ge1xuICBpdC5lYWNoKFtcbiAgICAvLyBEZWZhdWx0IGZvcm1hdFxuICAgIFtcIjIwMTktMDEtMDFcIiwgbmV3IERhdGUoRGF0ZS5VVEMoMjAxOSwgMCwgMSkpLCB7fV0sXG4gICAgW1wiMTB0aCBKYW4gMTk2OVwiLCBudWxsLCB7fV0sXG4gICAgW1wiaW52YWxpZFwiLCBudWxsLCB7fV0sXG4gICAgW1wiXCIsIG51bGwsIHt9XSxcblxuICAgIC8vIEN1c3RvbSBmb3JtYXRcbiAgICBbXCIyMS8xMS8yMDA2XCIsIG5ldyBEYXRlKERhdGUuVVRDKDIwMDYsIDEwLCAyMSkpLCB7IGZvcm1hdDogXCIlZC8lbS8lWVwiIH1dLFxuICAgIFtcbiAgICAgIFwiMjEvMTEvMDYgMTY6MzBcIixcbiAgICAgIG5ldyBEYXRlKERhdGUuVVRDKDIwMDYsIDEwLCAyMSkpLFxuICAgICAgeyBmb3JtYXQ6IFwiJWQvJW0vJXlcIiB9LFxuICAgIF0sXG4gICAgW1wiaW52YWxpZFwiLCBudWxsLCB7IGZvcm1hdDogXCIlZC8lbS8leVwiIH1dLFxuICAgIFtcIlwiLCBudWxsLCB7IGZvcm1hdDogXCIlZC8lbS8leVwiIH1dLFxuICAgIFtcIjIwMDYvMTEvMjFcIiwgbmV3IERhdGUoRGF0ZS5VVEMoMjAwNiwgMTAsIDIxKSksIHsgZm9ybWF0OiBcIiVZLyVtLyVkXCIgfV0sXG5cbiAgICAvLyBJbnZhbGlkIGZvcm1hdFxuICAgIFtcIjIxLzExLzA2XCIsIG51bGwsIHsgZm9ybWF0OiBcImludmFsaWRcIiB9XSxcbiAgXSkoXCIlcyAtPiAlcyAlb1wiLCBhc3luYyAoY2VsbCwgZXhwZWN0ZWQsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbY2VsbF0sIHBsLlN0cmluZyldKS5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW3sgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwiZGF0ZVwiIGFzIGNvbnN0LCAuLi5vcHRpb25zIH1dLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEpXG4gICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICBleHBlY3QoZnJhbWUudG9SZWNvcmRzKClbMF0/Lm5hbWUpLnRvRXF1YWwoZXhwZWN0ZWQpXG4gIH0pXG59KVxuXG5kZXNjcmliZShcInN0cmluZ2lmeURhdGVGaWVsZFwiLCAoKSA9PiB7XG4gIGl0LmVhY2goW1xuICAgIC8vIERlZmF1bHQgZm9ybWF0XG4gICAgW25ldyBEYXRlKERhdGUuVVRDKDIwMTksIDAsIDEpKSwgXCIyMDE5LTAxLTAxXCIsIHt9XSxcbiAgICBbbmV3IERhdGUoRGF0ZS5VVEMoMjAwNiwgMTAsIDIxKSksIFwiMjAwNi0xMS0yMVwiLCB7fV0sXG5cbiAgICAvLyBDdXN0b20gZm9ybWF0XG4gICAgW25ldyBEYXRlKERhdGUuVVRDKDIwMDYsIDEwLCAyMSkpLCBcIjIxLzExLzIwMDZcIiwgeyBmb3JtYXQ6IFwiJWQvJW0vJVlcIiB9XSxcbiAgICBbbmV3IERhdGUoRGF0ZS5VVEMoMjAwNiwgMTAsIDIxKSksIFwiMjAwNi8xMS8yMVwiLCB7IGZvcm1hdDogXCIlWS8lbS8lZFwiIH1dLFxuICBdKShcIiVzIC0+ICVzICVvXCIsIGFzeW5jICh2YWx1ZSwgZXhwZWN0ZWQsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbdmFsdWVdLCBwbC5EYXRlKV0pLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJkYXRlXCIgYXMgY29uc3QsIC4uLm9wdGlvbnMgfV0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVub3JtYWxpemVUYWJsZSh0YWJsZSwgc2NoZW1hKVxuICAgIGNvbnN0IGZyYW1lID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuXG4gICAgZXhwZWN0KGZyYW1lLnRvUmVjb3JkcygpWzBdPy5uYW1lKS50b0VxdWFsKGV4cGVjdGVkKVxuICB9KVxufSlcbiJdfQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DatetimeField } from "@frictionless-ts/metadata";
|
|
2
|
+
import * as pl from "nodejs-polars";
|
|
3
|
+
export declare function parseDatetimeField(field: DatetimeField, fieldExpr: pl.Expr): pl.Expr;
|
|
4
|
+
export declare function stringifyDatetimeField(field: DatetimeField, fieldExpr: pl.Expr): pl.Expr;
|