@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,173 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { denormalizeTable, normalizeTable } from "../../table/index.js";
|
|
4
|
+
describe("parseGeopointField", () => {
|
|
5
|
+
describe("default format", () => {
|
|
6
|
+
it.each([
|
|
7
|
+
// Valid geopoints in default format (lon,lat)
|
|
8
|
+
["90.50,45.50", [90.5, 45.5]],
|
|
9
|
+
["0,0", [0, 0]],
|
|
10
|
+
//["-122.40, 37.78", [-122.4, 37.78]],
|
|
11
|
+
//["-180.0,-90.0", [-180.0, -90.0]],
|
|
12
|
+
//["180.0, 90.0", [180.0, 90.0]],
|
|
13
|
+
// With whitespace
|
|
14
|
+
//[" 90.50, 45.50 ", [90.5, 45.5]],
|
|
15
|
+
// Invalid formats
|
|
16
|
+
//["not a geopoint", null],
|
|
17
|
+
//["", null],
|
|
18
|
+
//["90.50", null],
|
|
19
|
+
//["90.50,lat", null],
|
|
20
|
+
//["lon,45.50", null],
|
|
21
|
+
//["90.50,45.50,0", null],
|
|
22
|
+
])("%s -> %s", async (cell, value) => {
|
|
23
|
+
const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
|
|
24
|
+
const schema = {
|
|
25
|
+
fields: [{ name: "name", type: "geopoint" }],
|
|
26
|
+
};
|
|
27
|
+
const result = await normalizeTable(table, schema);
|
|
28
|
+
const frame = await result.collect();
|
|
29
|
+
expect(frame.toRecords()[0]?.name).toEqual(value);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe("array format", () => {
|
|
33
|
+
it.each([
|
|
34
|
+
// Valid geopoints in array format
|
|
35
|
+
["[90.50, 45.50]", [90.5, 45.5]],
|
|
36
|
+
["[0, 0]", [0, 0]],
|
|
37
|
+
["[-122.40, 37.78]", [-122.4, 37.78]],
|
|
38
|
+
["[-180.0, -90.0]", [-180.0, -90.0]],
|
|
39
|
+
["[180.0, 90.0]", [180.0, 90.0]],
|
|
40
|
+
// With whitespace
|
|
41
|
+
[" [90.50, 45.50] ", [90.5, 45.5]],
|
|
42
|
+
// Invalid formats
|
|
43
|
+
// TODO: fix this
|
|
44
|
+
//["not a geopoint", null],
|
|
45
|
+
//["", null],
|
|
46
|
+
//["[90.50]", null],
|
|
47
|
+
//["[90.50, 45.50, 0]", null],
|
|
48
|
+
//["['lon', 'lat']", null],
|
|
49
|
+
])("%s -> %s", async (cell, value) => {
|
|
50
|
+
const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
|
|
51
|
+
const schema = {
|
|
52
|
+
fields: [
|
|
53
|
+
{ name: "name", type: "geopoint", format: "array" },
|
|
54
|
+
],
|
|
55
|
+
};
|
|
56
|
+
const result = await normalizeTable(table, schema);
|
|
57
|
+
const frame = await result.collect();
|
|
58
|
+
expect(frame.toRecords()[0]?.name).toEqual(value);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe("object format", () => {
|
|
62
|
+
it.each([
|
|
63
|
+
// Valid geopoints in object format
|
|
64
|
+
['{"lon": 90.50, "lat": 45.50}', [90.5, 45.5]],
|
|
65
|
+
['{"lon": 0, "lat": 0}', [0, 0]],
|
|
66
|
+
['{"lon": -122.40, "lat": 37.78}', [-122.4, 37.78]],
|
|
67
|
+
['{"lon": -180.0, "lat": -90.0}', [-180.0, -90.0]],
|
|
68
|
+
['{"lon": 180.0, "lat": 90.0}', [180.0, 90.0]],
|
|
69
|
+
// With whitespace
|
|
70
|
+
[' {"lon": 90.50, "lat": 45.50} ', [90.5, 45.5]],
|
|
71
|
+
// TODO: fix this
|
|
72
|
+
// Invalid formats
|
|
73
|
+
//["not a geopoint", null],
|
|
74
|
+
//["", null],
|
|
75
|
+
//['{"longitude": 90.50, "latitude": 45.50}', null],
|
|
76
|
+
//['{"lon": 90.50}', null],
|
|
77
|
+
//['{"lat": 45.50}', null],
|
|
78
|
+
])("%s -> %s", async (cell, value) => {
|
|
79
|
+
const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
|
|
80
|
+
const schema = {
|
|
81
|
+
fields: [
|
|
82
|
+
{
|
|
83
|
+
name: "name",
|
|
84
|
+
type: "geopoint",
|
|
85
|
+
format: "object",
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
};
|
|
89
|
+
const result = await normalizeTable(table, schema);
|
|
90
|
+
const frame = await result.collect();
|
|
91
|
+
expect(frame.toRecords()[0]?.name).toEqual(value);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe("stringifyGeopointField", () => {
|
|
96
|
+
describe("default format", () => {
|
|
97
|
+
it.each([
|
|
98
|
+
// Coordinate arrays to default format (lon,lat)
|
|
99
|
+
[[90.5, 45.5], "90.5,45.5"],
|
|
100
|
+
[[0, 0], "0.0,0.0"],
|
|
101
|
+
[[-122.4, 37.78], "-122.4,37.78"],
|
|
102
|
+
[[-180.0, -90.0], "-180.0,-90.0"],
|
|
103
|
+
[[180.0, 90.0], "180.0,90.0"],
|
|
104
|
+
// With precise decimals
|
|
105
|
+
[[125.6789, 10.1234], "125.6789,10.1234"],
|
|
106
|
+
// Null handling
|
|
107
|
+
//[null, null],
|
|
108
|
+
])("%s -> %s", async (value, expected) => {
|
|
109
|
+
const table = pl
|
|
110
|
+
.DataFrame([pl.Series("name", [value], pl.List(pl.Float64))])
|
|
111
|
+
.lazy();
|
|
112
|
+
const schema = {
|
|
113
|
+
fields: [{ name: "name", type: "geopoint" }],
|
|
114
|
+
};
|
|
115
|
+
const result = await denormalizeTable(table, schema);
|
|
116
|
+
const frame = await result.collect();
|
|
117
|
+
expect(frame.toRecords()[0]?.name).toEqual(expected);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe("array format", () => {
|
|
121
|
+
it.each([
|
|
122
|
+
// Coordinate arrays to array format string
|
|
123
|
+
[[90.5, 45.5], "[90.5,45.5]"],
|
|
124
|
+
[[0, 0], "[0.0,0.0]"],
|
|
125
|
+
[[-122.4, 37.78], "[-122.4,37.78]"],
|
|
126
|
+
[[-180.0, -90.0], "[-180.0,-90.0]"],
|
|
127
|
+
[[180.0, 90.0], "[180.0,90.0]"],
|
|
128
|
+
// Null handling
|
|
129
|
+
//[null, null],
|
|
130
|
+
])("%s -> %s", async (value, expected) => {
|
|
131
|
+
const table = pl
|
|
132
|
+
.DataFrame([pl.Series("name", [value], pl.List(pl.Float64))])
|
|
133
|
+
.lazy();
|
|
134
|
+
const schema = {
|
|
135
|
+
fields: [
|
|
136
|
+
{ name: "name", type: "geopoint", format: "array" },
|
|
137
|
+
],
|
|
138
|
+
};
|
|
139
|
+
const result = await denormalizeTable(table, schema);
|
|
140
|
+
const frame = await result.collect();
|
|
141
|
+
expect(frame.toRecords()[0]?.name).toEqual(expected);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe("object format", () => {
|
|
145
|
+
it.each([
|
|
146
|
+
// Coordinate arrays to object format string
|
|
147
|
+
[[90.5, 45.5], '{"lon":90.5,"lat":45.5}'],
|
|
148
|
+
[[0, 0], '{"lon":0.0,"lat":0.0}'],
|
|
149
|
+
[[-122.4, 37.78], '{"lon":-122.4,"lat":37.78}'],
|
|
150
|
+
[[-180.0, -90.0], '{"lon":-180.0,"lat":-90.0}'],
|
|
151
|
+
[[180.0, 90.0], '{"lon":180.0,"lat":90.0}'],
|
|
152
|
+
// Null handling
|
|
153
|
+
//[null, null],
|
|
154
|
+
])("%s -> %s", async (value, expected) => {
|
|
155
|
+
const table = pl
|
|
156
|
+
.DataFrame([pl.Series("name", [value], pl.List(pl.Float64))])
|
|
157
|
+
.lazy();
|
|
158
|
+
const schema = {
|
|
159
|
+
fields: [
|
|
160
|
+
{
|
|
161
|
+
name: "name",
|
|
162
|
+
type: "geopoint",
|
|
163
|
+
format: "object",
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
};
|
|
167
|
+
const result = await denormalizeTable(table, schema);
|
|
168
|
+
const frame = await result.collect();
|
|
169
|
+
expect(frame.toRecords()[0]?.name).toEqual(expected);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvcG9pbnQuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2ZpZWxkL3R5cGVzL2dlb3BvaW50LnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUV2RSxRQUFRLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO0lBQ2xDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7UUFDOUIsRUFBRSxDQUFDLElBQUksQ0FBQztZQUNOLDhDQUE4QztZQUM5QyxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM3QixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNmLHNDQUFzQztZQUN0QyxvQ0FBb0M7WUFDcEMsaUNBQWlDO1lBRWpDLGtCQUFrQjtZQUNsQixtQ0FBbUM7WUFFbkMsa0JBQWtCO1lBQ2xCLDJCQUEyQjtZQUMzQixhQUFhO1lBQ2Isa0JBQWtCO1lBQ2xCLHNCQUFzQjtZQUN0QixzQkFBc0I7WUFDdEIsMEJBQTBCO1NBQzNCLENBQUMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNuQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO1lBRXpFLE1BQU0sTUFBTSxHQUFHO2dCQUNiLE1BQU0sRUFBRSxDQUFDLEVB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LENBQUE7WUFFcEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdEQsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGRlbm9ybWFsaXplVGFibGUsIG5vcm1hbGl6ZVRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlL2luZGV4LnRzXCJcblxuZGVzY3JpYmUoXCJwYXJzZUdlb3BvaW50RmllbGRcIiwgKCkgPT4ge1xuICBkZXNjcmliZShcImRlZmF1bHQgZm9ybWF0XCIsICgpID0+IHtcbiAgICBpdC5lYWNoKFtcbiAgICAgIC8vIFZhbGlkIGdlb3BvaW50cyBpbiBkZWZhdWx0IGZvcm1hdCAobG9uLGxhdClcbiAgICAgIFtcIjkwLjUwLDQ1LjUwXCIsIFs5MC41LCA0NS41XV0sXG4gICAgICBbXCIwLDBcIiwgWzAsIDBdXSxcbiAgICAgIC8vW1wiLTEyMi40MCwgMzcuNzhcIiwgWy0xMjIuNCwgMzcuNzhdXSxcbiAgICAgIC8vW1wiLTE4MC4wLC05MC4wXCIsIFstMTgwLjAsIC05MC4wXV0sXG4gICAgICAvL1tcIjE4MC4wLCA5MC4wXCIsIFsxODAuMCwgOTAuMF1dLFxuXG4gICAgICAvLyBXaXRoIHdoaXRlc3BhY2VcbiAgICAgIC8vW1wiIDkwLjUwLCA0NS41MCBcIiwgWzkwLjUsIDQ1LjVdXSxcblxuICAgICAgLy8gSW52YWxpZCBmb3JtYXRzXG4gICAgICAvL1tcIm5vdCBhIGdlb3BvaW50XCIsIG51bGxdLFxuICAgICAgLy9bXCJcIiwgbnVsbF0sXG4gICAgICAvL1tcIjkwLjUwXCIsIG51bGxdLFxuICAgICAgLy9bXCI5MC41MCxsYXRcIiwgbnVsbF0sXG4gICAgICAvL1tcImxvbiw0NS41MFwiLCBudWxsXSxcbiAgICAgIC8vW1wiOTAuNTAsNDUuNTAsMFwiLCBudWxsXSxcbiAgICBdKShcIiVzIC0+ICVzXCIsIGFzeW5jIChjZWxsLCB2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbC5EYXRhRnJhbWUoW3BsLlNlcmllcyhcIm5hbWVcIiwgW2NlbGxdLCBwbC5TdHJpbmcpXSkubGF6eSgpXG5cbiAgICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgICAgZmllbGRzOiBbeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJnZW9wb2ludFwiIGFzIGNvbnN0IH1dLFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBub3JtYWxpemVUYWJsZSh0YWJsZSwgc2NoZW1hKVxuICAgICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICAgIGV4cGVjdChmcmFtZS50b1JlY29yZHMoKVswXT8ubmFtZSkudG9FcXVhbCh2YWx1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKFwiYXJyYXkgZm9ybWF0XCIsICgpID0+IHtcbiAgICBpdC5lYWNoKFtcbiAgICAgIC8vIFZhbGlkIGdlb3BvaW50cyBpbiBhcnJheSBmb3JtYXRcbiAgICAgIFtcIls5MC41MCwgNDUuNTBdXCIsIFs5MC41LCA0NS41XV0sXG4gICAgICBbXCJbMCwgMF1cIiwgWzAsIDBdXSxcbiAgICAgIFtcIlstMTIyLjQwLCAzNy43OF1cIiwgWy0xMjIuNCwgMzcuNzhdXSxcbiAgICAgIFtcIlstMTgwLjAsIC05MC4wXVwiLCBbLTE4MC4wLCAtOTAuMF1dLFxuICAgICAgW1wiWzE4MC4wLCA5MC4wXVwiLCBbMTgwLjAsIDkwLjBdXSxcblxuICAgICAgLy8gV2l0aCB3aGl0ZXNwYWNlXG4gICAgICBbXCIgWzkwLjUwLCA0NS41MF0gXCIsIFs5MC41LCA0NS41XV0sXG5cbiAgICAgIC8vIEludmFsaWQgZm9ybWF0c1xuICAgICAgLy8gVE9ETzogZml4IHRoaXNcbiAgICAgIC8vW1wibm90IGEgZ2VvcG9pbnRcIiwgbnVsbF0sXG4gICAgICAvL1tcIlwiLCBudWxsXSxcbiAgICAgIC8vW1wiWzkwLjUwXVwiLCBudWxsXSxcbiAgICAgIC8vW1wiWzkwLjUwLCA0NS41MCwgMF1cIiwgbnVsbF0sXG4gICAgICAvL1tcIlsnbG9uJywgJ2xhdCddXCIsIG51bGxdLFxuICAgIF0pKFwiJXMgLT4gJXNcIiwgYXN5bmMgKGNlbGwsIHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbY2VsbF0sIHBsLlN0cmluZyldKS5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcImdlb3BvaW50XCIgYXMgY29uc3QsIGZvcm1hdDogXCJhcnJheVwiIGFzIGNvbnN0IH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEpXG4gICAgICBjb25zdCBmcmFtZSA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcblxuICAgICAgZXhwZWN0KGZyYW1lLnRvUmVjb3JkcygpWzBdPy5uYW1lKS50b0VxdWFsKHZhbHVlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoXCJvYmplY3QgZm9ybWF0XCIsICgpID0+IHtcbiAgICBpdC5lYWNoKFtcbiAgICAgIC8vIFZhbGlkIGdlb3BvaW50cyBpbiBvYmplY3QgZm9ybWF0XG4gICAgICBbJ3tcImxvblwiOiA5MC41MCwgXCJsYXRcIjogNDUuNTB9JywgWzkwLjUsIDQ1LjVdXSxcbiAgICAgIFsne1wibG9uXCI6IDAsIFwibGF0XCI6IDB9JywgWzAsIDBdXSxcbiAgICAgIFsne1wibG9uXCI6IC0xMjIuNDAsIFwibGF0XCI6IDM3Ljc4fScsIFstMTIyLjQsIDM3Ljc4XV0sXG4gICAgICBbJ3tcImxvblwiOiAtMTgwLjAsIFwibGF0XCI6IC05MC4wfScsIFstMTgwLjAsIC05MC4wXV0sXG4gICAgICBbJ3tcImxvblwiOiAxODAuMCwgXCJsYXRcIjogOTAuMH0nLCBbMTgwLjAsIDkwLjBdXSxcblxuICAgICAgLy8gV2l0aCB3aGl0ZXNwYWNlXG4gICAgICBbJyB7XCJsb25cIjogOTAuNTAsIFwibGF0XCI6IDQ1LjUwfSAnLCBbOTAuNSwgNDUuNV1dLFxuXG4gICAgICAvLyBUT0RPOiBmaXggdGhpc1xuICAgICAgLy8gSW52YWxpZCBmb3JtYXRzXG4gICAgICAvL1tcIm5vdCBhIGdlb3BvaW50XCIsIG51bGxdLFxuICAgICAgLy9bXCJcIiwgbnVsbF0sXG4gICAgICAvL1sne1wibG9uZ2l0dWRlXCI6IDkwLjUwLCBcImxhdGl0dWRlXCI6IDQ1LjUwfScsIG51bGxdLFxuICAgICAgLy9bJ3tcImxvblwiOiA5MC41MH0nLCBudWxsXSxcbiAgICAgIC8vWyd7XCJsYXRcIjogNDUuNTB9JywgbnVsbF0sXG4gICAgXSkoXCIlcyAtPiAlc1wiLCBhc3luYyAoY2VsbCwgdmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGwuRGF0YUZyYW1lKFtwbC5TZXJpZXMoXCJuYW1lXCIsIFtjZWxsXSwgcGwuU3RyaW5nKV0pLmxhenkoKVxuXG4gICAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgICAgdHlwZTogXCJnZW9wb2ludFwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgZm9ybWF0OiBcIm9iamVjdFwiIGFzIGNvbnN0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEpXG4gICAgICBjb25zdCBmcmFtZSA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcblxuICAgICAgZXhwZWN0KGZyYW1lLnRvUmVjb3JkcygpWzBdPy5uYW1lKS50b0VxdWFsKHZhbHVlKVxuICAgIH0pXG4gIH0pXG59KVxuXG5kZXNjcmliZShcInN0cmluZ2lmeUdlb3BvaW50RmllbGRcIiwgKCkgPT4ge1xuICBkZXNjcmliZShcImRlZmF1bHQgZm9ybWF0XCIsICgpID0+IHtcbiAgICBpdC5lYWNoKFtcbiAgICAgIC8vIENvb3JkaW5hdGUgYXJyYXlzIHRvIGRlZmF1bHQgZm9ybWF0IChsb24sbGF0KVxuICAgICAgW1s5MC41LCA0NS41XSwgXCI5MC41LDQ1LjVcIl0sXG4gICAgICBbWzAsIDBdLCBcIjAuMCwwLjBcIl0sXG4gICAgICBbWy0xMjIuNCwgMzcuNzhdLCBcIi0xMjIuNCwzNy43OFwiXSxcbiAgICAgIFtbLTE4MC4wLCAtOTAuMF0sIFwiLTE4MC4wLC05MC4wXCJdLFxuICAgICAgW1sxODAuMCwgOTAuMF0sIFwiMTgwLjAsOTAuMFwiXSxcblxuICAgICAgLy8gV2l0aCBwcmVjaXNlIGRlY2ltYWxzXG4gICAgICBbWzEyNS42Nzg5LCAxMC4xMjM0XSwgXCIxMjUuNjc4OSwxMC4xMjM0XCJdLFxuXG4gICAgICAvLyBOdWxsIGhhbmRsaW5nXG4gICAgICAvL1tudWxsLCBudWxsXSxcbiAgICBdKShcIiVzIC0+ICVzXCIsIGFzeW5jICh2YWx1ZSwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgICAgLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbdmFsdWVdLCBwbC5MaXN0KHBsLkZsb2F0NjQpKV0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgICBmaWVsZHM6IFt7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcImdlb3BvaW50XCIgYXMgY29uc3QgfV0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlbm9ybWFsaXplVGFibGUodGFibGUsIHNjaGVtYSlcbiAgICAgIGNvbnN0IGZyYW1lID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuXG4gICAgICBleHBlY3QoZnJhbWUudG9SZWNvcmRzKClbMF0/Lm5hbWUpLnRvRXF1YWwoZXhwZWN0ZWQpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZShcImFycmF5IGZvcm1hdFwiLCAoKSA9PiB7XG4gICAgaXQuZWFjaChbXG4gICAgICAvLyBDb29yZGluYXRlIGFycmF5cyB0byBhcnJheSBmb3JtYXQgc3RyaW5nXG4gICAgICBbWzkwLjUsIDQ1LjVdLCBcIls5MC41LDQ1LjVdXCJdLFxuICAgICAgW1swLCAwXSwgXCJbMC4wLDAuMF1cIl0sXG4gICAgICBbWy0xMjIuNCwgMzcuNzhdLCBcIlstMTIyLjQsMzcuNzhdXCJdLFxuICAgICAgW1stMTgwLjAsIC05MC4wXSwgXCJbLTE4MC4wLC05MC4wXVwiXSxcbiAgICAgIFtbMTgwLjAsIDkwLjBdLCBcIlsxODAuMCw5MC4wXVwiXSxcblxuICAgICAgLy8gTnVsbCBoYW5kbGluZ1xuICAgICAgLy9bbnVsbCwgbnVsbF0sXG4gICAgXSkoXCIlcyAtPiAlc1wiLCBhc3luYyAodmFsdWUsIGV4cGVjdGVkKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAgIC5EYXRhRnJhbWUoW3BsLlNlcmllcyhcIm5hbWVcIiwgW3ZhbHVlXSwgcGwuTGlzdChwbC5GbG9hdDY0KSldKVxuICAgICAgICAubGF6eSgpXG5cbiAgICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJnZW9wb2ludFwiIGFzIGNvbnN0LCBmb3JtYXQ6IFwiYXJyYXlcIiBhcyBjb25zdCB9LFxuICAgICAgICBdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZW5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEpXG4gICAgICBjb25zdCBmcmFtZSA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcblxuICAgICAgZXhwZWN0KGZyYW1lLnRvUmVjb3JkcygpWzBdPy5uYW1lKS50b0VxdWFsKGV4cGVjdGVkKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoXCJvYmplY3QgZm9ybWF0XCIsICgpID0+IHtcbiAgICBpdC5lYWNoKFtcbiAgICAgIC8vIENvb3JkaW5hdGUgYXJyYXlzIHRvIG9iamVjdCBmb3JtYXQgc3RyaW5nXG4gICAgICBbWzkwLjUsIDQ1LjVdLCAne1wibG9uXCI6OTAuNSxcImxhdFwiOjQ1LjV9J10sXG4gICAgICBbWzAsIDBdLCAne1wibG9uXCI6MC4wLFwibGF0XCI6MC4wfSddLFxuICAgICAgW1stMTIyLjQsIDM3Ljc4XSwgJ3tcImxvblwiOi0xMjIuNCxcImxhdFwiOjM3Ljc4fSddLFxuICAgICAgW1stMTgwLjAsIC05MC4wXSwgJ3tcImxvblwiOi0xODAuMCxcImxhdFwiOi05MC4wfSddLFxuICAgICAgW1sxODAuMCwgOTAuMF0sICd7XCJsb25cIjoxODAuMCxcImxhdFwiOjkwLjB9J10sXG5cbiAgICAgIC8vIE51bGwgaGFuZGxpbmdcbiAgICAgIC8vW251bGwsIG51bGxdLFxuICAgIF0pKFwiJXMgLT4gJXNcIiwgYXN5bmMgKHZhbHVlLCBleHBlY3RlZCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgICAuRGF0YUZyYW1lKFtwbC5TZXJpZXMoXCJuYW1lXCIsIFt2YWx1ZV0sIHBsLkxpc3QocGwuRmxvYXQ2NCkpXSlcbiAgICAgICAgLmxhenkoKVxuXG4gICAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgICAgdHlwZTogXCJnZW9wb2ludFwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgZm9ybWF0OiBcIm9iamVjdFwiIGFzIGNvbnN0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlbm9ybWFsaXplVGFibGUodGFibGUsIHNjaGVtYSlcbiAgICAgIGNvbnN0IGZyYW1lID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuXG4gICAgICBleHBlY3QoZnJhbWUudG9SZWNvcmRzKClbMF0/Lm5hbWUpLnRvRXF1YWwoZXhwZWN0ZWQpXG4gICAgfSlcbiAgfSlcbn0pXG4iXX0=
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { IntegerField } from "@frictionless-ts/metadata";
|
|
2
|
+
import * as pl from "nodejs-polars";
|
|
3
|
+
export declare function parseIntegerField(field: IntegerField, fieldExpr: pl.Expr): pl.Expr;
|
|
4
|
+
export declare function stringifyIntegerField(_field: IntegerField, fieldExpr: pl.Expr): pl.Expr;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
// TODO: support categories
|
|
3
|
+
// TODO: support categoriesOrder
|
|
4
|
+
export function parseIntegerField(field, fieldExpr) {
|
|
5
|
+
const groupChar = field.groupChar;
|
|
6
|
+
const bareNumber = field.bareNumber;
|
|
7
|
+
const flattenCategories = field.categories?.map(it => typeof it === "number" ? it : it.value);
|
|
8
|
+
// Handle non-bare numbers (with currency symbols, percent signs, etc.)
|
|
9
|
+
if (bareNumber === false) {
|
|
10
|
+
// Preserve the minus sign when removing leading characters
|
|
11
|
+
fieldExpr = fieldExpr.str.replaceAll("^[^\\d\\-]+", "");
|
|
12
|
+
fieldExpr = fieldExpr.str.replaceAll("[^\\d\\-]+$", "");
|
|
13
|
+
}
|
|
14
|
+
// Handle group character (thousands separator)
|
|
15
|
+
if (groupChar) {
|
|
16
|
+
// Escape special characters for regex
|
|
17
|
+
const escapedGroupChar = groupChar.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
18
|
+
fieldExpr = fieldExpr.str.replaceAll(escapedGroupChar, "");
|
|
19
|
+
}
|
|
20
|
+
// Cast to int64 (will handle values up to 2^63-1)
|
|
21
|
+
fieldExpr = fieldExpr.cast(pl.Int64);
|
|
22
|
+
// Currently, only string categories are supported
|
|
23
|
+
if (flattenCategories) {
|
|
24
|
+
return pl
|
|
25
|
+
.when(fieldExpr.isIn(flattenCategories))
|
|
26
|
+
.then(fieldExpr)
|
|
27
|
+
.otherwise(pl.lit(null))
|
|
28
|
+
.alias(field.name);
|
|
29
|
+
}
|
|
30
|
+
return fieldExpr;
|
|
31
|
+
}
|
|
32
|
+
export function stringifyIntegerField(_field, fieldExpr) {
|
|
33
|
+
// Convert to string
|
|
34
|
+
fieldExpr = fieldExpr.cast(pl.String);
|
|
35
|
+
//const groupChar = field.groupChar
|
|
36
|
+
//const bareNumber = field.bareNumber
|
|
37
|
+
// TODO: Add group character formatting (thousands separator) when needed
|
|
38
|
+
// TODO: Add non-bare number formatting (currency symbols, etc.) when needed
|
|
39
|
+
return fieldExpr;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2ZpZWxkL3R5cGVzL2ludGVnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFbkMsMkJBQTJCO0FBQzNCLGdDQUFnQztBQUNoQyxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBbUIsRUFBRSxTQUFrQjtJQUN2RSxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFBO0lBQ2pDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUE7SUFDbkMsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUNuRCxPQUFPLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FDdkMsQ0FBQTtJQUVELHVFQUF1RTtJQUN2RSxJQUFJLFVBQVUsS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUN6QiwyREFBMkQ7UUFDM0QsU0FBUyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUN2RCxTQUFTLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ3pELENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNkLHNDQUFzQztRQUN0QyxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDekUsU0FBUyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzVELENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsU0FBUyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRXBDLGtEQUFrRDtJQUNsRCxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDdEIsT0FBTyxFQUFFO2FBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQzthQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDO2FBQ2YsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDdkIsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN0QixDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsTUFBb0IsRUFDcEIsU0FBa0I7SUFFbEIsb0JBQW9CO0lBQ3BCLFNBQVMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUVyQyxtQ0FBbUM7SUFDbkMscUNBQXFDO0lBRXJDLHlFQUF5RTtJQUN6RSw0RUFBNEU7SUFFNUUsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgSW50ZWdlckZpZWxkIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuXG4vLyBUT0RPOiBzdXBwb3J0IGNhdGVnb3JpZXNcbi8vIFRPRE86IHN1cHBvcnQgY2F0ZWdvcmllc09yZGVyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJbnRlZ2VyRmllbGQoZmllbGQ6IEludGVnZXJGaWVsZCwgZmllbGRFeHByOiBwbC5FeHByKSB7XG4gIGNvbnN0IGdyb3VwQ2hhciA9IGZpZWxkLmdyb3VwQ2hhclxuICBjb25zdCBiYXJlTnVtYmVyID0gZmllbGQuYmFyZU51bWJlclxuICBjb25zdCBmbGF0dGVuQ2F0ZWdvcmllcyA9IGZpZWxkLmNhdGVnb3JpZXM/Lm1hcChpdCA9PlxuICAgIHR5cGVvZiBpdCA9PT0gXCJudW1iZXJcIiA/IGl0IDogaXQudmFsdWUsXG4gIClcblxuICAvLyBIYW5kbGUgbm9uLWJhcmUgbnVtYmVycyAod2l0aCBjdXJyZW5jeSBzeW1ib2xzLCBwZXJjZW50IHNpZ25zLCBldGMuKVxuICBpZiAoYmFyZU51bWJlciA9PT0gZmFsc2UpIHtcbiAgICAvLyBQcmVzZXJ2ZSB0aGUgbWludXMgc2lnbiB3aGVuIHJlbW92aW5nIGxlYWRpbmcgY2hhcmFjdGVyc1xuICAgIGZpZWxkRXhwciA9IGZpZWxkRXhwci5zdHIucmVwbGFjZUFsbChcIl5bXlxcXFxkXFxcXC1dK1wiLCBcIlwiKVxuICAgIGZpZWxkRXhwciA9IGZpZWxkRXhwci5zdHIucmVwbGFjZUFsbChcIlteXFxcXGRcXFxcLV0rJFwiLCBcIlwiKVxuICB9XG5cbiAgLy8gSGFuZGxlIGdyb3VwIGNoYXJhY3RlciAodGhvdXNhbmRzIHNlcGFyYXRvcilcbiAgaWYgKGdyb3VwQ2hhcikge1xuICAgIC8vIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgZm9yIHJlZ2V4XG4gICAgY29uc3QgZXNjYXBlZEdyb3VwQ2hhciA9IGdyb3VwQ2hhci5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIilcbiAgICBmaWVsZEV4cHIgPSBmaWVsZEV4cHIuc3RyLnJlcGxhY2VBbGwoZXNjYXBlZEdyb3VwQ2hhciwgXCJcIilcbiAgfVxuXG4gIC8vIENhc3QgdG8gaW50NjQgKHdpbGwgaGFuZGxlIHZhbHVlcyB1cCB0byAyXjYzLTEpXG4gIGZpZWxkRXhwciA9IGZpZWxkRXhwci5jYXN0KHBsLkludDY0KVxuXG4gIC8vIEN1cnJlbnRseSwgb25seSBzdHJpbmcgY2F0ZWdvcmllcyBhcmUgc3VwcG9ydGVkXG4gIGlmIChmbGF0dGVuQ2F0ZWdvcmllcykge1xuICAgIHJldHVybiBwbFxuICAgICAgLndoZW4oZmllbGRFeHByLmlzSW4oZmxhdHRlbkNhdGVnb3JpZXMpKVxuICAgICAgLnRoZW4oZmllbGRFeHByKVxuICAgICAgLm90aGVyd2lzZShwbC5saXQobnVsbCkpXG4gICAgICAuYWxpYXMoZmllbGQubmFtZSlcbiAgfVxuXG4gIHJldHVybiBmaWVsZEV4cHJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeUludGVnZXJGaWVsZChcbiAgX2ZpZWxkOiBJbnRlZ2VyRmllbGQsXG4gIGZpZWxkRXhwcjogcGwuRXhwcixcbikge1xuICAvLyBDb252ZXJ0IHRvIHN0cmluZ1xuICBmaWVsZEV4cHIgPSBmaWVsZEV4cHIuY2FzdChwbC5TdHJpbmcpXG5cbiAgLy9jb25zdCBncm91cENoYXIgPSBmaWVsZC5ncm91cENoYXJcbiAgLy9jb25zdCBiYXJlTnVtYmVyID0gZmllbGQuYmFyZU51bWJlclxuXG4gIC8vIFRPRE86IEFkZCBncm91cCBjaGFyYWN0ZXIgZm9ybWF0dGluZyAodGhvdXNhbmRzIHNlcGFyYXRvcikgd2hlbiBuZWVkZWRcbiAgLy8gVE9ETzogQWRkIG5vbi1iYXJlIG51bWJlciBmb3JtYXR0aW5nIChjdXJyZW5jeSBzeW1ib2xzLCBldGMuKSB3aGVuIG5lZWRlZFxuXG4gIHJldHVybiBmaWVsZEV4cHJcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { denormalizeTable, normalizeTable } from "../../table/index.js";
|
|
4
|
+
describe("parseIntegerField", () => {
|
|
5
|
+
it.each([
|
|
6
|
+
// Basic integer parsing
|
|
7
|
+
["1", 1, {}],
|
|
8
|
+
["2", 2, {}],
|
|
9
|
+
["1000", 1000, {}],
|
|
10
|
+
// Empty or invalid values
|
|
11
|
+
["", null, {}],
|
|
12
|
+
["2.1", null, {}],
|
|
13
|
+
["bad", null, {}],
|
|
14
|
+
["0.0003", null, {}],
|
|
15
|
+
["3.14", null, {}],
|
|
16
|
+
["1/2", null, {}],
|
|
17
|
+
// Group character handling
|
|
18
|
+
["1", 1, { groupChar: "," }],
|
|
19
|
+
["1,000", 1000, { groupChar: "," }],
|
|
20
|
+
["1,000,000", 1000000, { groupChar: "," }],
|
|
21
|
+
["1 000", 1000, { groupChar: " " }],
|
|
22
|
+
["1'000'000", 1000000, { groupChar: "'" }],
|
|
23
|
+
["1.000.000", 1000000, { groupChar: "." }],
|
|
24
|
+
// Bare number handling
|
|
25
|
+
["1", 1, { bareNumber: false }],
|
|
26
|
+
["1000", 1000, { bareNumber: false }],
|
|
27
|
+
["$1000", 1000, { bareNumber: false }],
|
|
28
|
+
["1000$", 1000, { bareNumber: false }],
|
|
29
|
+
["€1000", 1000, { bareNumber: false }],
|
|
30
|
+
["1000€", 1000, { bareNumber: false }],
|
|
31
|
+
["1,000", null, { bareNumber: false }],
|
|
32
|
+
["-12€", -12, { bareNumber: false }],
|
|
33
|
+
["€-12", -12, { bareNumber: false }],
|
|
34
|
+
// Leading zeros and whitespace
|
|
35
|
+
["000835", 835, {}],
|
|
36
|
+
["0", 0, {}],
|
|
37
|
+
["00", 0, {}],
|
|
38
|
+
["01", 1, {}],
|
|
39
|
+
//[" 01 ", 1, {}],
|
|
40
|
+
//[" 42 ", 42, {}],
|
|
41
|
+
// Combined cases
|
|
42
|
+
["$1,000,000", 1000000, { bareNumber: false, groupChar: "," }],
|
|
43
|
+
["1,000,000$", 1000000, { bareNumber: false, groupChar: "," }],
|
|
44
|
+
["€ 1.000.000", 1000000, { bareNumber: false, groupChar: "." }],
|
|
45
|
+
//[" -1,000 ", -1000, { groupChar: "," }],
|
|
46
|
+
["000,001", 1, { groupChar: "," }],
|
|
47
|
+
])("$0 -> $1 $2", async (cell, value, options) => {
|
|
48
|
+
const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
|
|
49
|
+
const schema = {
|
|
50
|
+
fields: [{ name: "name", type: "integer", ...options }],
|
|
51
|
+
};
|
|
52
|
+
const result = await normalizeTable(table, schema);
|
|
53
|
+
const frame = await result.collect();
|
|
54
|
+
expect(frame.getColumn("name").get(0)).toEqual(value);
|
|
55
|
+
expect(frame.getColumn("name").get(0)).toEqual(value);
|
|
56
|
+
});
|
|
57
|
+
describe("categories", () => {
|
|
58
|
+
it.each([
|
|
59
|
+
// Flat categories
|
|
60
|
+
["1", 1, { categories: [1, 2] }],
|
|
61
|
+
["2", 2, { categories: [1, 2] }],
|
|
62
|
+
["3", null, { categories: [1, 2] }],
|
|
63
|
+
// Object categories
|
|
64
|
+
["1", 1, { categories: [{ value: 1, label: "One" }] }],
|
|
65
|
+
["2", null, { categories: [{ value: 1, label: "One" }] }],
|
|
66
|
+
])("$0 -> $1 $2", async (cell, value, options) => {
|
|
67
|
+
const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
|
|
68
|
+
const schema = {
|
|
69
|
+
fields: [{ name: "name", type: "integer", ...options }],
|
|
70
|
+
};
|
|
71
|
+
const result = await normalizeTable(table, schema);
|
|
72
|
+
const frame = await result.collect();
|
|
73
|
+
expect(frame.toRecords()[0]?.name).toEqual(value);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe("stringifyIntegerField", () => {
|
|
78
|
+
it.each([
|
|
79
|
+
// Basic integer to string conversion
|
|
80
|
+
[1, "1"],
|
|
81
|
+
[2, "2"],
|
|
82
|
+
[1000, "1000"],
|
|
83
|
+
[42, "42"],
|
|
84
|
+
[-1, "-1"],
|
|
85
|
+
[-100, "-100"],
|
|
86
|
+
[0, "0"],
|
|
87
|
+
// Large integers
|
|
88
|
+
[1234567890, "1234567890"],
|
|
89
|
+
[-1234567890, "-1234567890"],
|
|
90
|
+
// Null handling
|
|
91
|
+
[null, ""],
|
|
92
|
+
])("%s -> %s", async (value, expected) => {
|
|
93
|
+
const table = pl.DataFrame([pl.Series("name", [value], pl.Int64)]).lazy();
|
|
94
|
+
const schema = {
|
|
95
|
+
fields: [{ name: "name", type: "integer" }],
|
|
96
|
+
};
|
|
97
|
+
const result = await denormalizeTable(table, schema);
|
|
98
|
+
const frame = await result.collect();
|
|
99
|
+
expect(frame.toRecords()[0]?.name).toEqual(expected);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdlci5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZmllbGQvdHlwZXMvaW50ZWdlci5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFFdkUsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ04sd0JBQXdCO1FBQ3hCLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDWixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ1osQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUVsQiwwQkFBMEI7UUFDMUIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNkLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFDakIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNqQixDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ3BCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFDbEIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUVqQiwyQkFBMkI7UUFDM0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQzVCLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNuQyxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUs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QUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7UUFFekUsTUFBTSxNQUFNLEdBQUc7WUFDYixNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQWtCLEVBQUUsQ0FBQztTQUNyRCxDQUFBO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDcEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7UUFFcEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDdEQsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBsIGZyb20gXCJub2RlanMtcG9sYXJzXCJcbmltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyBkZW5vcm1hbGl6ZVRhYmxlLCBub3JtYWxpemVUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS9pbmRleC50c1wiXG5cbmRlc2NyaWJlKFwicGFyc2VJbnRlZ2VyRmllbGRcIiwgKCkgPT4ge1xuICBpdC5lYWNoKFtcbiAgICAvLyBCYXNpYyBpbnRlZ2VyIHBhcnNpbmdcbiAgICBbXCIxXCIsIDEsIHt9XSxcbiAgICBbXCIyXCIsIDIsIHt9XSxcbiAgICBbXCIxMDAwXCIsIDEwMDAsIHt9XSxcblxuICAgIC8vIEVtcHR5IG9yIGludmFsaWQgdmFsdWVzXG4gICAgW1wiXCIsIG51bGwsIHt9XSxcbiAgICBbXCIyLjFcIiwgbnVsbCwge31dLFxuICAgIFtcImJhZFwiLCBudWxsLCB7fV0sXG4gICAgW1wiMC4wMDAzXCIsIG51bGwsIHt9XSxcbiAgICBbXCIzLjE0XCIsIG51bGwsIHt9XSxcbiAgICBbXCIxLzJcIiwgbnVsbCwge31dLFxuXG4gICAgLy8gR3JvdXAgY2hhcmFjdGVyIGhhbmRsaW5nXG4gICAgW1wiMVwiLCAxLCB7IGdyb3VwQ2hhcjogXCIsXCIgfV0sXG4gICAgW1wiMSwwMDBcIiwgMTAwMCwgeyBncm91cENoYXI6IFwiLFwiIH1dLFxuICAgIFtcIjEsMDAwLDAwMFwiLCAxMDAwMDAwLCB7IGdyb3VwQ2hhcjogXCIsXCIgfV0sXG4gICAgW1wiMSAwMDBcIiwgMTAwMCwgeyBncm91cENoYXI6IFwiIFwiIH1dLFxuICAgIFtcIjEnMDAwJzAwMFwiLCAxMDAwMDAwLCB7IGdyb3VwQ2hhcjogXCInXCIgfV0sXG4gICAgW1wiMS4wMDAuMDAwXCIsIDEwMDAwMDAsIHsgZ3JvdXBDaGFyOiBcIi5cIiB9XSxcblxuICAgIC8vIEJhcmUgbnVtYmVyIGhhbmRsaW5nXG4gICAgW1wiMVwiLCAxLCB7IGJhcmVOdW1iZXI6IGZhbHNlIH1dLFxuICAgIFtcIjEwMDBcIiwgMTAwMCwgeyBiYXJlTnVtYmVyOiBmYWxzZSB9XSxcbiAgICBbXCIkMTAwMFwiLCAxMDAwLCB7IGJhcmVOdW1iZXI6IGZhbHNlIH1dLFxuICAgIFtcIjEwMDAkXCIsIDEwMDAsIHsgYmFyZU51bWJlcjogZmFsc2UgfV0sXG4gICAgW1wi4oKsMTAwMFwiLCAxMDAwLCB7IGJhcmVOdW1iZXI6IGZhbHNlIH1dLFxuICAgIFtcIjEwMDDigqxcIiwgMTAwMCwgeyBiYXJlTnVtYmVyOiBmYWxzZSB9XSxcbiAgICBbXCIxLDAwMFwiLCBudWxsLCB7IGJhcmVOdW1iZXI6IGZhbHNlIH1dLFxuICAgIFtcIi0xMuKCrFwiLCAtMTIsIHsgYmFyZU51bWJlcjogZmFsc2UgfV0sXG4gICAgW1wi4oKsLTEyXCIsIC0xMiwgeyBiYXJlTnVtYmVyOiBmYWxzZSB9XSxcblxuICAgIC8vIExlYWRpbmcgemVyb3MgYW5kIHdoaXRlc3BhY2VcbiAgICBbXCIwMDA4MzVcIiwgODM1LCB7fV0sXG4gICAgW1wiMFwiLCAwLCB7fV0sXG4gICAgW1wiMDBcIiwgMCwge31dLFxuICAgIFtcIjAxXCIsIDEsIHt9XSxcbiAgICAvL1tcIiAwMSBcIiwgMSwge31dLFxuICAgIC8vW1wiICA0MiAgXCIsIDQyLCB7fV0sXG5cbiAgICAvLyBDb21iaW5lZCBjYXNlc1xuICAgIFtcIiQxLDAwMCwwMDBcIiwgMTAwMDAwMCwgeyBiYXJlTnVtYmVyOiBmYWxzZSwgZ3JvdXBDaGFyOiBcIixcIiB9XSxcbiAgICBbXCIxLDAwMCwwMDAkXCIsIDEwMDAwMDAsIHsgYmFyZU51bWJlcjogZmFsc2UsIGdyb3VwQ2hhcjogXCIsXCIgfV0sXG4gICAgW1wi4oKsIDEuMDAwLjAwMFwiLCAxMDAwMDAwLCB7IGJhcmVOdW1iZXI6IGZhbHNlLCBncm91cENoYXI6IFwiLlwiIH1dLFxuICAgIC8vW1wiIC0xLDAwMCBcIiwgLTEwMDAsIHsgZ3JvdXBDaGFyOiBcIixcIiB9XSxcbiAgICBbXCIwMDAsMDAxXCIsIDEsIHsgZ3JvdXBDaGFyOiBcIixcIiB9XSxcbiAgXSkoXCIkMCAtPiAkMSAkMlwiLCBhc3luYyAoY2VsbCwgdmFsdWUsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbY2VsbF0sIHBsLlN0cmluZyldKS5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW3sgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwiaW50ZWdlclwiIGFzIGNvbnN0LCAuLi5vcHRpb25zIH1dLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEpXG4gICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICBleHBlY3QoZnJhbWUuZ2V0Q29sdW1uKFwibmFtZVwiKS5nZXQoMCkpLnRvRXF1YWwodmFsdWUpXG4gICAgZXhwZWN0KGZyYW1lLmdldENvbHVtbihcIm5hbWVcIikuZ2V0KDApKS50b0VxdWFsKHZhbHVlKVxuICB9KVxuXG4gIGRlc2NyaWJlKFwiY2F0ZWdvcmllc1wiLCAoKSA9PiB7XG4gICAgaXQuZWFjaChbXG4gICAgICAvLyBGbGF0IGNhdGVnb3JpZXNcbiAgICAgIFtcIjFcIiwgMSwgeyBjYXRlZ29yaWVzOiBbMSwgMl0gfV0sXG4gICAgICBbXCIyXCIsIDIsIHsgY2F0ZWdvcmllczogWzEsIDJdIH1dLFxuICAgICAgW1wiM1wiLCBudWxsLCB7IGNhdGVnb3JpZXM6IFsxLCAyXSB9XSxcblxuICAgICAgLy8gT2JqZWN0IGNhdGVnb3JpZXNcbiAgICAgIFtcIjFcIiwgMSwgeyBjYXRlZ29yaWVzOiBbeyB2YWx1ZTogMSwgbGFiZWw6IFwiT25lXCIgfV0gfV0sXG4gICAgICBbXCIyXCIsIG51bGwsIHsgY2F0ZWdvcmllczogW3sgdmFsdWU6IDEsIGxhYmVsOiBcIk9uZVwiIH1dIH1dLFxuICAgIF0pKFwiJDAgLT4gJDEgJDJcIiwgYXN5bmMgKGNlbGwsIHZhbHVlLCBvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbY2VsbF0sIHBsLlN0cmluZyldKS5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgICBmaWVsZHM6IFt7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcImludGVnZXJcIiBhcyBjb25zdCwgLi4ub3B0aW9ucyB9XSxcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbm9ybWFsaXplVGFibGUodGFibGUsIHNjaGVtYSlcbiAgICAgIGNvbnN0IGZyYW1lID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuXG4gICAgICBleHBlY3QoZnJhbWUudG9SZWNvcmRzKClbMF0/Lm5hbWUpLnRvRXF1YWwodmFsdWUpXG4gICAgfSlcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKFwic3RyaW5naWZ5SW50ZWdlckZpZWxkXCIsICgpID0+IHtcbiAgaXQuZWFjaChbXG4gICAgLy8gQmFzaWMgaW50ZWdlciB0byBzdHJpbmcgY29udmVyc2lvblxuICAgIFsxLCBcIjFcIl0sXG4gICAgWzIsIFwiMlwiXSxcbiAgICBbMTAwMCwgXCIxMDAwXCJdLFxuICAgIFs0MiwgXCI0MlwiXSxcbiAgICBbLTEsIFwiLTFcIl0sXG4gICAgWy0xMDAsIFwiLTEwMFwiXSxcbiAgICBbMCwgXCIwXCJdLFxuXG4gICAgLy8gTGFyZ2UgaW50ZWdlcnNcbiAgICBbMTIzNDU2Nzg5MCwgXCIxMjM0NTY3ODkwXCJdLFxuICAgIFstMTIzNDU2Nzg5MCwgXCItMTIzNDU2Nzg5MFwiXSxcblxuICAgIC8vIE51bGwgaGFuZGxpbmdcbiAgICBbbnVsbCwgXCJcIl0sXG4gIF0pKFwiJXMgLT4gJXNcIiwgYXN5bmMgKHZhbHVlLCBleHBlY3RlZCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGwuRGF0YUZyYW1lKFtwbC5TZXJpZXMoXCJuYW1lXCIsIFt2YWx1ZV0sIHBsLkludDY0KV0pLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJpbnRlZ2VyXCIgYXMgY29uc3QgfV0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVub3JtYWxpemVUYWJsZSh0YWJsZSwgc2NoZW1hKVxuICAgIGNvbnN0IGZyYW1lID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuXG4gICAgZXhwZWN0KGZyYW1lLnRvUmVjb3JkcygpWzBdPy5uYW1lKS50b0VxdWFsKGV4cGVjdGVkKVxuICB9KVxufSlcbiJdfQ==
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ArrayField, GeojsonField, ObjectField } from "@frictionless-ts/metadata";
|
|
2
|
+
import type { CellError } from "@frictionless-ts/metadata";
|
|
3
|
+
import type { Table } from "../../table/index.ts";
|
|
4
|
+
export declare function inspectJsonField(field: ArrayField | GeojsonField | ObjectField, table: Table, options?: {
|
|
5
|
+
formatJsonSchema?: Record<string, any>;
|
|
6
|
+
}): Promise<CellError[]>;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { inspectJsonValue } from "@frictionless-ts/metadata";
|
|
2
|
+
import * as pl from "nodejs-polars";
|
|
3
|
+
import { isObject } from "../../helpers.js";
|
|
4
|
+
// TODO: Improve the implementation
|
|
5
|
+
// Make unblocking / handle large data / process in parallel / move processing to Rust?
|
|
6
|
+
export async function inspectJsonField(field, table, options) {
|
|
7
|
+
const errors = [];
|
|
8
|
+
const formatJsonSchema = options?.formatJsonSchema;
|
|
9
|
+
const constraintJsonSchema = field.constraints?.jsonSchema;
|
|
10
|
+
const frame = await table
|
|
11
|
+
.withRowCount()
|
|
12
|
+
.select(pl.pl.col("row_nr").add(1).alias("number"), pl.pl.col(field.name).alias("source"))
|
|
13
|
+
.collect();
|
|
14
|
+
for (const row of frame.toRecords()) {
|
|
15
|
+
if (row.source === null)
|
|
16
|
+
continue;
|
|
17
|
+
let target;
|
|
18
|
+
const checkCompat = field.type === "array" ? Array.isArray : isObject;
|
|
19
|
+
try {
|
|
20
|
+
target = JSON.parse(row.source);
|
|
21
|
+
}
|
|
22
|
+
catch (error) { }
|
|
23
|
+
if (!target || !checkCompat(target)) {
|
|
24
|
+
errors.push({
|
|
25
|
+
type: "cell/type",
|
|
26
|
+
cell: String(row.source),
|
|
27
|
+
fieldName: field.name,
|
|
28
|
+
fieldType: field.type,
|
|
29
|
+
fieldFormat: field.format,
|
|
30
|
+
rowNumber: row.number,
|
|
31
|
+
});
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (formatJsonSchema) {
|
|
35
|
+
const formatErrors = await inspectJsonValue(target, {
|
|
36
|
+
jsonSchema: formatJsonSchema,
|
|
37
|
+
});
|
|
38
|
+
if (formatErrors.length) {
|
|
39
|
+
errors.push({
|
|
40
|
+
type: "cell/type",
|
|
41
|
+
cell: String(row.source),
|
|
42
|
+
fieldName: field.name,
|
|
43
|
+
fieldType: field.type,
|
|
44
|
+
fieldFormat: field.format,
|
|
45
|
+
rowNumber: row.number,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (constraintJsonSchema) {
|
|
51
|
+
const constraintErrors = await inspectJsonValue(target, {
|
|
52
|
+
jsonSchema: constraintJsonSchema,
|
|
53
|
+
});
|
|
54
|
+
for (const error of constraintErrors) {
|
|
55
|
+
errors.push({
|
|
56
|
+
type: "cell/jsonSchema",
|
|
57
|
+
cell: String(row.source),
|
|
58
|
+
fieldName: field.name,
|
|
59
|
+
rowNumber: row.number,
|
|
60
|
+
pointer: error.pointer,
|
|
61
|
+
message: error.message,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return errors;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2ZpZWxkL3R5cGVzL2pzb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFFNUQsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRzNDLG1DQUFtQztBQUNuQyx1RkFBdUY7QUFFdkYsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsS0FBOEMsRUFDOUMsS0FBWSxFQUNaLE9BRUM7SUFFRCxNQUFNLE1BQU0sR0FBZ0IsRUFBRSxDQUFBO0lBRTlCLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxFQUFFLGdCQUFnQixDQUFBO0lBQ2xELE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUE7SUFFMUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxLQUFLO1NBQ3RCLFlBQVksRUFBRTtTQUNkLE1BQU0sQ0FDTCxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUMxQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUN0QztTQUNBLE9BQU8sRUFBRSxDQUFBO0lBRVosS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFXLEVBQUUsQ0FBQztRQUM3QyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssSUFBSTtZQUFFLFNBQVE7UUFFakMsSUFBSSxNQUF1QyxDQUFBO1FBQzNDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUE7UUFFckUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2pDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUEsQ0FBQztRQUVsQixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDVixJQUFJLEVBQUUsV0FBVztnQkFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO2dCQUN4QixTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUk7Z0JBQ3JCLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDckIsV0FBVyxFQUFFLEtBQUssQ0FBQyxNQUFNO2dCQUN6QixTQUFTLEVBQUUsR0FBRyxDQUFDLE1BQU07YUFDdEIsQ0FBQyxDQUFBO1lBRUYsU0FBUTtRQUNWLENBQUM7UUFFRCxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckIsTUFBTSxZQUFZLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2xELFVBQVUsRUFBRSxnQkFBZ0I7YUFDN0IsQ0FBQyxDQUFBO1lBRUYsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ1YsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztvQkFDeEIsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJO29CQUNyQixTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUk7b0JBQ3JCLFdBQVcsRUFBRSxLQUFLLENBQUMsTUFBTTtvQkFDekIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxNQUFNO2lCQUN0QixDQUFDLENBQUE7WUFDSixDQUFDO1lBRUQsU0FBUTtRQUNWLENBQUM7UUFFRCxJQUFJLG9CQUFvQixFQUFFLENBQUM7WUFDekIsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLGdCQUFnQixDQUFDLE1BQU0sRUFBRTtnQkFDdEQsVUFBVSxFQUFFLG9CQUFvQjthQUNqQyxDQUFDLENBQUE7WUFFRixLQUFLLE1BQU0sS0FBSyxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ1YsSUFBSSxFQUFFLGlCQUFpQjtvQkFDdkIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO29CQUN4QixTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUk7b0JBQ3JCLFNBQVMsRUFBRSxHQUFHLENBQUMsTUFBTTtvQkFDckIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO29CQUN0QixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87aUJBQ3ZCLENBQUMsQ0FBQTtZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgQXJyYXlGaWVsZCxcbiAgR2VvanNvbkZpZWxkLFxuICBPYmplY3RGaWVsZCxcbn0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHsgaW5zcGVjdEpzb25WYWx1ZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgQ2VsbEVycm9yIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi4vLi4vaGVscGVycy50c1wiXG5pbXBvcnQgdHlwZSB7IFRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlL2luZGV4LnRzXCJcblxuLy8gVE9ETzogSW1wcm92ZSB0aGUgaW1wbGVtZW50YXRpb25cbi8vIE1ha2UgdW5ibG9ja2luZyAvIGhhbmRsZSBsYXJnZSBkYXRhIC8gcHJvY2VzcyBpbiBwYXJhbGxlbCAvIG1vdmUgcHJvY2Vzc2luZyB0byBSdXN0P1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zcGVjdEpzb25GaWVsZChcbiAgZmllbGQ6IEFycmF5RmllbGQgfCBHZW9qc29uRmllbGQgfCBPYmplY3RGaWVsZCxcbiAgdGFibGU6IFRhYmxlLFxuICBvcHRpb25zPzoge1xuICAgIGZvcm1hdEpzb25TY2hlbWE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIH0sXG4pIHtcbiAgY29uc3QgZXJyb3JzOiBDZWxsRXJyb3JbXSA9IFtdXG5cbiAgY29uc3QgZm9ybWF0SnNvblNjaGVtYSA9IG9wdGlvbnM/LmZvcm1hdEpzb25TY2hlbWFcbiAgY29uc3QgY29uc3RyYWludEpzb25TY2hlbWEgPSBmaWVsZC5jb25zdHJhaW50cz8uanNvblNjaGVtYVxuXG4gIGNvbnN0IGZyYW1lID0gYXdhaXQgdGFibGVcbiAgICAud2l0aFJvd0NvdW50KClcbiAgICAuc2VsZWN0KFxuICAgICAgcGwucGwuY29sKFwicm93X25yXCIpLmFkZCgxKS5hbGlhcyhcIm51bWJlclwiKSxcbiAgICAgIHBsLnBsLmNvbChmaWVsZC5uYW1lKS5hbGlhcyhcInNvdXJjZVwiKSxcbiAgICApXG4gICAgLmNvbGxlY3QoKVxuXG4gIGZvciAoY29uc3Qgcm93IG9mIGZyYW1lLnRvUmVjb3JkcygpIGFzIGFueVtdKSB7XG4gICAgaWYgKHJvdy5zb3VyY2UgPT09IG51bGwpIGNvbnRpbnVlXG5cbiAgICBsZXQgdGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkXG4gICAgY29uc3QgY2hlY2tDb21wYXQgPSBmaWVsZC50eXBlID09PSBcImFycmF5XCIgPyBBcnJheS5pc0FycmF5IDogaXNPYmplY3RcblxuICAgIHRyeSB7XG4gICAgICB0YXJnZXQgPSBKU09OLnBhcnNlKHJvdy5zb3VyY2UpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHt9XG5cbiAgICBpZiAoIXRhcmdldCB8fCAhY2hlY2tDb21wYXQodGFyZ2V0KSkge1xuICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICB0eXBlOiBcImNlbGwvdHlwZVwiLFxuICAgICAgICBjZWxsOiBTdHJpbmcocm93LnNvdXJjZSksXG4gICAgICAgIGZpZWxkTmFtZTogZmllbGQubmFtZSxcbiAgICAgICAgZmllbGRUeXBlOiBmaWVsZC50eXBlLFxuICAgICAgICBmaWVsZEZvcm1hdDogZmllbGQuZm9ybWF0LFxuICAgICAgICByb3dOdW1iZXI6IHJvdy5udW1iZXIsXG4gICAgICB9KVxuXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChmb3JtYXRKc29uU2NoZW1hKSB7XG4gICAgICBjb25zdCBmb3JtYXRFcnJvcnMgPSBhd2FpdCBpbnNwZWN0SnNvblZhbHVlKHRhcmdldCwge1xuICAgICAgICBqc29uU2NoZW1hOiBmb3JtYXRKc29uU2NoZW1hLFxuICAgICAgfSlcblxuICAgICAgaWYgKGZvcm1hdEVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwiY2VsbC90eXBlXCIsXG4gICAgICAgICAgY2VsbDogU3RyaW5nKHJvdy5zb3VyY2UpLFxuICAgICAgICAgIGZpZWxkTmFtZTogZmllbGQubmFtZSxcbiAgICAgICAgICBmaWVsZFR5cGU6IGZpZWxkLnR5cGUsXG4gICAgICAgICAgZmllbGRGb3JtYXQ6IGZpZWxkLmZvcm1hdCxcbiAgICAgICAgICByb3dOdW1iZXI6IHJvdy5udW1iZXIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGNvbnN0cmFpbnRKc29uU2NoZW1hKSB7XG4gICAgICBjb25zdCBjb25zdHJhaW50RXJyb3JzID0gYXdhaXQgaW5zcGVjdEpzb25WYWx1ZSh0YXJnZXQsIHtcbiAgICAgICAganNvblNjaGVtYTogY29uc3RyYWludEpzb25TY2hlbWEsXG4gICAgICB9KVxuXG4gICAgICBmb3IgKGNvbnN0IGVycm9yIG9mIGNvbnN0cmFpbnRFcnJvcnMpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwiY2VsbC9qc29uU2NoZW1hXCIsXG4gICAgICAgICAgY2VsbDogU3RyaW5nKHJvdy5zb3VyY2UpLFxuICAgICAgICAgIGZpZWxkTmFtZTogZmllbGQubmFtZSxcbiAgICAgICAgICByb3dOdW1iZXI6IHJvdy5udW1iZXIsXG4gICAgICAgICAgcG9pbnRlcjogZXJyb3IucG9pbnRlcixcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlcnJvcnNcbn1cbiJdfQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ListField } from "@frictionless-ts/metadata";
|
|
2
|
+
import * as pl from "nodejs-polars";
|
|
3
|
+
export declare function parseListField(field: ListField, fieldExpr: pl.Expr): pl.Expr;
|
|
4
|
+
export declare function stringifyListField(field: ListField, fieldExpr: pl.Expr): pl.Expr;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
// TODO:
|
|
3
|
+
// Add more validation:
|
|
4
|
+
// - Return null instead of list if all array values are nulls?
|
|
5
|
+
export function parseListField(field, fieldExpr) {
|
|
6
|
+
const delimiter = field.delimiter ?? ",";
|
|
7
|
+
const itemType = field.itemType;
|
|
8
|
+
let dtype = pl.String;
|
|
9
|
+
if (itemType === "integer")
|
|
10
|
+
dtype = pl.Int64;
|
|
11
|
+
if (itemType === "number")
|
|
12
|
+
dtype = pl.Float64;
|
|
13
|
+
if (itemType === "boolean")
|
|
14
|
+
dtype = pl.Bool;
|
|
15
|
+
if (itemType === "datetime")
|
|
16
|
+
dtype = pl.Datetime;
|
|
17
|
+
if (itemType === "date")
|
|
18
|
+
dtype = pl.Date;
|
|
19
|
+
if (itemType === "time")
|
|
20
|
+
dtype = pl.Time;
|
|
21
|
+
fieldExpr = fieldExpr.str.split(delimiter).cast(pl.List(dtype));
|
|
22
|
+
return fieldExpr;
|
|
23
|
+
}
|
|
24
|
+
export function stringifyListField(field, fieldExpr) {
|
|
25
|
+
const delimiter = field.delimiter ?? ",";
|
|
26
|
+
return fieldExpr
|
|
27
|
+
.cast(pl.List(pl.String))
|
|
28
|
+
.lst.join({ separator: delimiter, ignoreNulls: true });
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2ZpZWxkL3R5cGVzL2xpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFbkMsUUFBUTtBQUNSLHVCQUF1QjtBQUN2QiwrREFBK0Q7QUFDL0QsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUFnQixFQUFFLFNBQWtCO0lBQ2pFLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFBO0lBQ3hDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUE7SUFFL0IsSUFBSSxLQUFLLEdBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQTtJQUMxQixJQUFJLFFBQVEsS0FBSyxTQUFTO1FBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUE7SUFDNUMsSUFBSSxRQUFRLEtBQUssUUFBUTtRQUFFLEtBQUssR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFBO0lBQzdDLElBQUksUUFBUSxLQUFLLFNBQVM7UUFBRSxLQUFLLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQTtJQUMzQyxJQUFJLFFBQVEsS0FBSyxVQUFVO1FBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUE7SUFDaEQsSUFBSSxRQUFRLEtBQUssTUFBTTtRQUFFLEtBQUssR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFBO0lBQ3hDLElBQUksUUFBUSxLQUFLLE1BQU07UUFBRSxLQUFLLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQTtJQUV4QyxTQUFTLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUUvRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWdCLEVBQUUsU0FBa0I7SUFDckUsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUE7SUFFeEMsT0FBTyxTQUFTO1NBQ2IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3hCLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQzFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IExpc3RGaWVsZCB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCAqIGFzIHBsIGZyb20gXCJub2RlanMtcG9sYXJzXCJcblxuLy8gVE9ETzpcbi8vIEFkZCBtb3JlIHZhbGlkYXRpb246XG4vLyAtIFJldHVybiBudWxsIGluc3RlYWQgb2YgbGlzdCBpZiBhbGwgYXJyYXkgdmFsdWVzIGFyZSBudWxscz9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpc3RGaWVsZChmaWVsZDogTGlzdEZpZWxkLCBmaWVsZEV4cHI6IHBsLkV4cHIpIHtcbiAgY29uc3QgZGVsaW1pdGVyID0gZmllbGQuZGVsaW1pdGVyID8/IFwiLFwiXG4gIGNvbnN0IGl0ZW1UeXBlID0gZmllbGQuaXRlbVR5cGVcblxuICBsZXQgZHR5cGU6IGFueSA9IHBsLlN0cmluZ1xuICBpZiAoaXRlbVR5cGUgPT09IFwiaW50ZWdlclwiKSBkdHlwZSA9IHBsLkludDY0XG4gIGlmIChpdGVtVHlwZSA9PT0gXCJudW1iZXJcIikgZHR5cGUgPSBwbC5GbG9hdDY0XG4gIGlmIChpdGVtVHlwZSA9PT0gXCJib29sZWFuXCIpIGR0eXBlID0gcGwuQm9vbFxuICBpZiAoaXRlbVR5cGUgPT09IFwiZGF0ZXRpbWVcIikgZHR5cGUgPSBwbC5EYXRldGltZVxuICBpZiAoaXRlbVR5cGUgPT09IFwiZGF0ZVwiKSBkdHlwZSA9IHBsLkRhdGVcbiAgaWYgKGl0ZW1UeXBlID09PSBcInRpbWVcIikgZHR5cGUgPSBwbC5UaW1lXG5cbiAgZmllbGRFeHByID0gZmllbGRFeHByLnN0ci5zcGxpdChkZWxpbWl0ZXIpLmNhc3QocGwuTGlzdChkdHlwZSkpXG5cbiAgcmV0dXJuIGZpZWxkRXhwclxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5TGlzdEZpZWxkKGZpZWxkOiBMaXN0RmllbGQsIGZpZWxkRXhwcjogcGwuRXhwcikge1xuICBjb25zdCBkZWxpbWl0ZXIgPSBmaWVsZC5kZWxpbWl0ZXIgPz8gXCIsXCJcblxuICByZXR1cm4gZmllbGRFeHByXG4gICAgLmNhc3QocGwuTGlzdChwbC5TdHJpbmcpKVxuICAgIC5sc3Quam9pbih7IHNlcGFyYXRvcjogZGVsaW1pdGVyLCBpZ25vcmVOdWxsczogdHJ1ZSB9KVxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|