@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,230 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { denormalizeTable, normalizeTable } from "../../table/index.js";
|
|
4
|
+
describe("parseListField", () => {
|
|
5
|
+
describe("default settings (string items, comma delimiter)", () => {
|
|
6
|
+
it.each([
|
|
7
|
+
// Basic list parsing
|
|
8
|
+
["a,b,c", ["a", "b", "c"]],
|
|
9
|
+
["1,2,3", ["1", "2", "3"]],
|
|
10
|
+
["foo,bar,baz", ["foo", "bar", "baz"]],
|
|
11
|
+
// Empty list
|
|
12
|
+
//["", null],
|
|
13
|
+
// Single item
|
|
14
|
+
["single", ["single"]],
|
|
15
|
+
// Whitespace handling
|
|
16
|
+
//[" a, b, c ", ["a", "b", "c"]],
|
|
17
|
+
//["\ta,b,c\n", ["a", "b", "c"]],
|
|
18
|
+
// Empty items in list
|
|
19
|
+
["a,,c", ["a", "", "c"]],
|
|
20
|
+
[",b,", ["", "b", ""]],
|
|
21
|
+
[",,,", ["", "", "", ""]],
|
|
22
|
+
// Null handling
|
|
23
|
+
//[null, null],
|
|
24
|
+
])("%s -> %s", async (cell, value) => {
|
|
25
|
+
const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
|
|
26
|
+
const schema = {
|
|
27
|
+
fields: [{ name: "name", type: "list" }],
|
|
28
|
+
};
|
|
29
|
+
const result = await normalizeTable(table, schema);
|
|
30
|
+
const frame = await result.collect();
|
|
31
|
+
expect(frame.toRecords()[0]?.name).toEqual(value);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe("integer item type", () => {
|
|
35
|
+
it.each([
|
|
36
|
+
// Valid integers
|
|
37
|
+
["1,2,3", [1, 2, 3]],
|
|
38
|
+
["0,-1,42", [0, -1, 42]],
|
|
39
|
+
["-10,0,10", [-10, 0, 10]],
|
|
40
|
+
// Empty list
|
|
41
|
+
//["", null],
|
|
42
|
+
// Single item
|
|
43
|
+
["42", [42]],
|
|
44
|
+
// Whitespace handling
|
|
45
|
+
//[" 1, 2, 3 ", [1, 2, 3]],
|
|
46
|
+
//["\t-5,0,5\n", [-5, 0, 5]],
|
|
47
|
+
// Empty items in list (become nulls when converted to integers)
|
|
48
|
+
["1,,3", [1, null, 3]],
|
|
49
|
+
[",2,", [null, 2, null]],
|
|
50
|
+
// Invalid integers become null
|
|
51
|
+
["1,a,3", [1, null, 3]],
|
|
52
|
+
["1.5,2,3", [null, 2, 3]],
|
|
53
|
+
])("%s -> %s", async (cell, value) => {
|
|
54
|
+
const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
|
|
55
|
+
const schema = {
|
|
56
|
+
fields: [
|
|
57
|
+
{ name: "name", type: "list", itemType: "integer" },
|
|
58
|
+
],
|
|
59
|
+
};
|
|
60
|
+
const result = await normalizeTable(table, schema);
|
|
61
|
+
const frame = await result.collect();
|
|
62
|
+
expect(frame.toRecords()[0]?.name).toEqual(value);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe("number item type", () => {
|
|
66
|
+
it.each([
|
|
67
|
+
// Valid numbers
|
|
68
|
+
["1.5,2.1,3.7", [1.5, 2.1, 3.7]],
|
|
69
|
+
["0,-1.1,42", [0, -1.1, 42]],
|
|
70
|
+
["-10.5,0,10", [-10.5, 0, 10]],
|
|
71
|
+
// Empty list
|
|
72
|
+
//["", null],
|
|
73
|
+
// Single item
|
|
74
|
+
["3.14", [3.14]],
|
|
75
|
+
// Whitespace handling
|
|
76
|
+
//[" 1.1, 2.2, 3.3 ", [1.1, 2.2, 3.3]],
|
|
77
|
+
//["\t-5.5,0,5.5\n", [-5.5, 0, 5.5]],
|
|
78
|
+
// Empty items in list (become nulls when converted to numbers)
|
|
79
|
+
["1.1,,3.3", [1.1, null, 3.3]],
|
|
80
|
+
[",2.2,", [null, 2.2, null]],
|
|
81
|
+
// Invalid numbers become null
|
|
82
|
+
["1.1,a,3.3", [1.1, null, 3.3]],
|
|
83
|
+
])("%s -> %s", async (cell, value) => {
|
|
84
|
+
const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
|
|
85
|
+
const schema = {
|
|
86
|
+
fields: [
|
|
87
|
+
{ name: "name", type: "list", itemType: "number" },
|
|
88
|
+
],
|
|
89
|
+
};
|
|
90
|
+
const result = await normalizeTable(table, schema);
|
|
91
|
+
const frame = await result.collect();
|
|
92
|
+
expect(frame.toRecords()[0]?.name).toEqual(value);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe("custom delimiter", () => {
|
|
96
|
+
it.each([
|
|
97
|
+
// Semicolon delimiter
|
|
98
|
+
["a;b;c", ["a", "b", "c"]],
|
|
99
|
+
["1;2;3", ["1", "2", "3"]],
|
|
100
|
+
// Empty list
|
|
101
|
+
//["", null],
|
|
102
|
+
// Single item
|
|
103
|
+
["single", ["single"]],
|
|
104
|
+
// Whitespace handling
|
|
105
|
+
//[" a; b; c ", ["a", "b", "c"]],
|
|
106
|
+
// Empty items in list
|
|
107
|
+
["a;;c", ["a", "", "c"]],
|
|
108
|
+
])("%s -> %s", async (cell, value) => {
|
|
109
|
+
const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
|
|
110
|
+
const schema = {
|
|
111
|
+
fields: [{ name: "name", type: "list", delimiter: ";" }],
|
|
112
|
+
};
|
|
113
|
+
const result = await normalizeTable(table, schema);
|
|
114
|
+
const frame = await result.collect();
|
|
115
|
+
expect(frame.toRecords()[0]?.name).toEqual(value);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
describe("stringifyListField", () => {
|
|
120
|
+
describe("default settings (string items, comma delimiter)", () => {
|
|
121
|
+
it.each([
|
|
122
|
+
// Basic list stringifying
|
|
123
|
+
[["a", "b", "c"], "a,b,c"],
|
|
124
|
+
[["foo", "bar", "baz"], "foo,bar,baz"],
|
|
125
|
+
[["1", "2", "3"], "1,2,3"],
|
|
126
|
+
// Single item
|
|
127
|
+
[["single"], "single"],
|
|
128
|
+
// Empty items in list
|
|
129
|
+
[["a", "", "c"], "a,,c"],
|
|
130
|
+
[["", "b", ""], ",b,"],
|
|
131
|
+
[["", "", "", ""], ",,,"],
|
|
132
|
+
// Null handling
|
|
133
|
+
[[null, "b", null], "b"],
|
|
134
|
+
[["a", null, "c"], "a,c"],
|
|
135
|
+
// Empty array
|
|
136
|
+
[[], ""],
|
|
137
|
+
])("%s -> %s", async (value, expected) => {
|
|
138
|
+
const table = pl
|
|
139
|
+
.DataFrame([pl.Series("name", [value], pl.List(pl.String))])
|
|
140
|
+
.lazy();
|
|
141
|
+
const schema = {
|
|
142
|
+
fields: [{ name: "name", type: "list" }],
|
|
143
|
+
};
|
|
144
|
+
const result = await denormalizeTable(table, schema);
|
|
145
|
+
const frame = await result.collect();
|
|
146
|
+
expect(frame.toRecords()[0]?.name).toEqual(expected);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
describe("integer item type", () => {
|
|
150
|
+
it.each([
|
|
151
|
+
// Integer lists to string
|
|
152
|
+
[[1, 2, 3], "1,2,3"],
|
|
153
|
+
[[0, -1, 42], "0,-1,42"],
|
|
154
|
+
[[-10, 0, 10], "-10,0,10"],
|
|
155
|
+
// Single item
|
|
156
|
+
[[42], "42"],
|
|
157
|
+
// With nulls (nulls are filtered out)
|
|
158
|
+
[[1, null, 3], "1,3"],
|
|
159
|
+
[[null, 2, null], "2"],
|
|
160
|
+
// Empty array
|
|
161
|
+
[[], ""],
|
|
162
|
+
])("%s -> %s", async (value, expected) => {
|
|
163
|
+
const table = pl
|
|
164
|
+
.DataFrame([pl.Series("name", [value], pl.List(pl.Int16))])
|
|
165
|
+
.lazy();
|
|
166
|
+
const schema = {
|
|
167
|
+
fields: [
|
|
168
|
+
{ name: "name", type: "list", itemType: "integer" },
|
|
169
|
+
],
|
|
170
|
+
};
|
|
171
|
+
const result = await denormalizeTable(table, schema);
|
|
172
|
+
const frame = await result.collect();
|
|
173
|
+
expect(frame.toRecords()[0]?.name).toEqual(expected);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
describe("number item type", () => {
|
|
177
|
+
it.each([
|
|
178
|
+
// Number lists to string
|
|
179
|
+
[[1.5, 2.1, 3.7], "1.5,2.1,3.7"],
|
|
180
|
+
[[0, -1.1, 42], "0.0,-1.1,42.0"],
|
|
181
|
+
[[-10.5, 0, 10], "-10.5,0.0,10.0"],
|
|
182
|
+
// Single item
|
|
183
|
+
[[3.14], "3.14"],
|
|
184
|
+
// With nulls
|
|
185
|
+
[[1.1, null, 3.3], "1.1,3.3"],
|
|
186
|
+
[[null, 2.2, null], "2.2"],
|
|
187
|
+
// Empty array
|
|
188
|
+
[[], ""],
|
|
189
|
+
])("%s -> %s", async (value, expected) => {
|
|
190
|
+
const table = pl
|
|
191
|
+
.DataFrame([pl.Series("name", [value], pl.List(pl.Float64))])
|
|
192
|
+
.lazy();
|
|
193
|
+
const schema = {
|
|
194
|
+
fields: [
|
|
195
|
+
{ name: "name", type: "list", itemType: "number" },
|
|
196
|
+
],
|
|
197
|
+
};
|
|
198
|
+
const result = await denormalizeTable(table, schema);
|
|
199
|
+
const frame = await result.collect();
|
|
200
|
+
expect(frame.toRecords()[0]?.name).toEqual(expected);
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
describe("custom delimiter", () => {
|
|
204
|
+
it.each([
|
|
205
|
+
// Semicolon delimiter
|
|
206
|
+
[["a", "b", "c"], "a;b;c"],
|
|
207
|
+
[["1", "2", "3"], "1;2;3"],
|
|
208
|
+
// Single item
|
|
209
|
+
[["single"], "single"],
|
|
210
|
+
// Empty items in list
|
|
211
|
+
[["a", "", "c"], "a;;c"],
|
|
212
|
+
[["", "b", ""], ";b;"],
|
|
213
|
+
// Numeric items
|
|
214
|
+
[[1.0, 2.0, 3.0], "1.0;2.0;3.0"],
|
|
215
|
+
// Empty array
|
|
216
|
+
[[], ""],
|
|
217
|
+
])("%s -> %s", async (value, expected) => {
|
|
218
|
+
const table = pl
|
|
219
|
+
.DataFrame([pl.Series("name", [value], pl.List(pl.String))])
|
|
220
|
+
.lazy();
|
|
221
|
+
const schema = {
|
|
222
|
+
fields: [{ name: "name", type: "list", delimiter: ";" }],
|
|
223
|
+
};
|
|
224
|
+
const result = await denormalizeTable(table, schema);
|
|
225
|
+
const frame = await result.collect();
|
|
226
|
+
expect(frame.toRecords()[0]?.name).toEqual(expected);
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZmllbGQvdHlwZXMvbGlzdC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFFdkUsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtJQUM5QixRQUFRLENBQUMsa0RBQWtELEVBQUUsR0FBRyxFQUFFO1FBQ2hFLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDTixxQkFBcUI7WUFDckIsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMxQixDQUFDLGFBQWEsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFdEMsYUFBYTtZQUNiLGFBQWE7WUFFYixjQUFjO1lBQ2QsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUV0QixzQkFBc0I7WUFDdEIsaUNBQWlDO1lBQ2pDLGlDQUFpQztZQUVqQyxzQkFBc0I7WUFDdEIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0QixDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRXpCLGdCQUFnQjtZ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LEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzRCxJQUFJLEVBQUUsQ0FBQTtZQUVULE1BQU0sTUFBTSxHQUFHO2dCQUNiLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBZSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQzthQUNsRSxDQUFBO1lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUE7WUFDcEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7WUFFcEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdEQsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGRlbm9ybWFsaXplVGFibGUsIG5vcm1hbGl6ZVRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlL2luZGV4LnRzXCJcblxuZGVzY3JpYmUoXCJwYXJzZUxpc3RGaWVsZFwiLCAoKSA9PiB7XG4gIGRlc2NyaWJlKFwiZGVmYXVsdCBzZXR0aW5ncyAoc3RyaW5nIGl0ZW1zLCBjb21tYSBkZWxpbWl0ZXIpXCIsICgpID0+IHtcbiAgICBpdC5lYWNoKFtcbiAgICAgIC8vIEJhc2ljIGxpc3QgcGFyc2luZ1xuICAgICAgW1wiYSxiLGNcIiwgW1wiYVwiLCBcImJcIiwgXCJjXCJdXSxcbiAgICAgIFtcIjEsMiwzXCIsIFtcIjFcIiwgXCIyXCIsIFwiM1wiXV0sXG4gICAgICBbXCJmb28sYmFyLGJhelwiLCBbXCJmb29cIiwgXCJiYXJcIiwgXCJiYXpcIl1dLFxuXG4gICAgICAvLyBFbXB0eSBsaXN0XG4gICAgICAvL1tcIlwiLCBudWxsXSxcblxuICAgICAgLy8gU2luZ2xlIGl0ZW1cbiAgICAgIFtcInNpbmdsZVwiLCBbXCJzaW5nbGVcIl1dLFxuXG4gICAgICAvLyBXaGl0ZXNwYWNlIGhhbmRsaW5nXG4gICAgICAvL1tcIiBhLCBiLCBjIFwiLCBbXCJhXCIsIFwiYlwiLCBcImNcIl1dLFxuICAgICAgLy9bXCJcXHRhLGIsY1xcblwiLCBbXCJhXCIsIFwiYlwiLCBcImNcIl1dLFxuXG4gICAgICAvLyBFbXB0eSBpdGVtcyBpbiBsaXN0XG4gICAgICBbXCJhLCxjXCIsIFtcImFcIiwgXCJcIiwgXCJjXCJdXSxcbiAgICAgIFtcIixiLFwiLCBbXCJcIiwgXCJiXCIsIFwiXCJdXSxcbiAgICAgIFtcIiwsLFwiLCBbXCJcIiwgXCJcIiwgXCJcIiwgXCJcIl1dLFxuXG4gICAgICAvLyBOdWxsIGhhbmRsaW5nXG4gICAgICAvL1tudWxsLCBudWxsXSxcbiAgICBdKShcIiVzIC0+ICVzXCIsIGFzeW5jIChjZWxsLCB2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbC5EYXRhRnJhbWUoW3BsLlNlcmllcyhcIm5hbWVcIiwgW2NlbGxdLCBwbC5TdHJpbmcpXSkubGF6eSgpXG5cbiAgICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgICAgZmllbGRzOiBbeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJsaXN0XCIgYXMgY29uc3QgfV0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEpXG4gICAgICBjb25zdCBmcmFtZSA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcblxuICAgICAgZXhwZWN0KGZyYW1lLnRvUmVjb3JkcygpWzBdPy5uYW1lKS50b0VxdWFsKHZhbHVlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoXCJpbnRlZ2VyIGl0ZW0gdHlwZVwiLCAoKSA9PiB7XG4gICAgaXQuZWFjaChbXG4gICAgICAvLyBWYWxpZCBpbnRlZ2Vyc1xuICAgICAgW1wiMSwyLDNcIiwgWzEsIDIsIDNdXSxcbiAgICAgIFtcIjAsLTEsNDJcIiwgWzAsIC0xLCA0Ml1dLFxuICAgICAgW1wiLTEwLDAsMTBcIiwgWy0xMCwgMCwgMTBdXSxcblxuICAgICAgLy8gRW1wdHkgbGlzdFxuICAgICAgLy9bXCJcIiwgbnVsbF0sXG5cbiAgICAgIC8vIFNpbmdsZSBpdGVtXG4gICAgICBbXCI0MlwiLCBbNDJdXSxcblxuICAgICAgLy8gV2hpdGVzcGFjZSBoYW5kbGluZ1xuICAgICAgLy9bXCIgMSwgMiwgMyBcIiwgWzEsIDIsIDNdXSxcbiAgICAgIC8vW1wiXFx0LTUsMCw1XFxuXCIsIFstNSwgMCwgNV1dLFxuXG4gICAgICAvLyBFbXB0eSBpdGVtcyBpbiBsaXN0IChiZWNvbWUgbnVsbHMgd2hlbiBjb252ZXJ0ZWQgdG8gaW50ZWdlcnMpXG4gICAgICBbXCIxLCwzXCIsIFsxLCBudWxsLCAzXV0sXG4gICAgICBbXCIsMixcIiwgW251bGwsIDIsIG51bGxdXSxcblxuICAgICAgLy8gSW52YWxpZCBpbnRlZ2VycyBiZWNvbWUgbnVsbFxuICAgICAgW1wiMSxhLDNcIiwgWzEsIG51bGwsIDNdXSxcbiAgICAgIFtcIjEuNSwyLDNcIiwgW251bGwsIDIsIDNdXSxcbiAgICBdKShcIiVzIC0+ICVzXCIsIGFzeW5jIChjZWxsLCB2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbC5EYXRhRnJhbWUoW3BsLlNlcmllcyhcIm5hbWVcIiwgW2NlbGxdLCBwbC5TdHJpbmcpXSkubGF6eSgpXG5cbiAgICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJsaXN0XCIgYXMgY29uc3QsIGl0ZW1UeXBlOiBcImludGVnZXJcIiBhcyBjb25zdCB9LFxuICAgICAgICBdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBub3JtYWxpemVUYWJsZSh0YWJsZSwgc2NoZW1hKVxuICAgICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICAgIGV4cGVjdChmcmFtZS50b1JlY29yZHMoKVswXT8ubmFtZSkudG9FcXVhbCh2YWx1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKFwibnVtYmVyIGl0ZW0gdHlwZVwiLCAoKSA9PiB7XG4gICAgaXQuZWFjaChbXG4gICAgICAvLyBWYWxpZCBudW1iZXJzXG4gICAgICBbXCIxLjUsMi4xLDMuN1wiLCBbMS41LCAyLjEsIDMuN11dLFxuICAgICAgW1wiMCwtMS4xLDQyXCIsIFswLCAtMS4xLCA0Ml1dLFxuICAgICAgW1wiLTEwLjUsMCwxMFwiLCBbLTEwLjUsIDAsIDEwXV0sXG5cbiAgICAgIC8vIEVtcHR5IGxpc3RcbiAgICAgIC8vW1wiXCIsIG51bGxdLFxuXG4gICAgICAvLyBTaW5nbGUgaXRlbVxuICAgICAgW1wiMy4xNFwiLCBbMy4xNF1dLFxuXG4gICAgICAvLyBXaGl0ZXNwYWNlIGhhbmRsaW5nXG4gICAgICAvL1tcIiAxLjEsIDIuMiwgMy4zIFwiLCBbMS4xLCAyLjIsIDMuM11dLFxuICAgICAgLy9bXCJcXHQtNS41LDAsNS41XFxuXCIsIFstNS41LCAwLCA1LjVdXSxcblxuICAgICAgLy8gRW1wdHkgaXRlbXMgaW4gbGlzdCAoYmVjb21lIG51bGxzIHdoZW4gY29udmVydGVkIHRvIG51bWJlcnMpXG4gICAgICBbXCIxLjEsLDMuM1wiLCBbMS4xLCBudWxsLCAzLjNdXSxcbiAgICAgIFtcIiwyLjIsXCIsIFtudWxsLCAyLjIsIG51bGxdXSxcblxuICAgICAgLy8gSW52YWxpZCBudW1iZXJzIGJlY29tZSBudWxsXG4gICAgICBbXCIxLjEsYSwzLjNcIiwgWzEuMSwgbnVsbCwgMy4zXV0sXG4gICAgXSkoXCIlcyAtPiAlc1wiLCBhc3luYyAoY2VsbCwgdmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGwuRGF0YUZyYW1lKFtwbC5TZXJpZXMoXCJuYW1lXCIsIFtjZWxsXSwgcGwuU3RyaW5nKV0pLmxhenkoKVxuXG4gICAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwibGlzdFwiIGFzIGNvbnN0LCBpdGVtVHlwZTogXCJudW1iZXJcIiBhcyBjb25zdCB9LFxuICAgICAgICBdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBub3JtYWxpemVUYWJsZSh0YWJsZSwgc2NoZW1hKVxuICAgICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICAgIGV4cGVjdChmcmFtZS50b1JlY29yZHMoKVswXT8ubmFtZSkudG9FcXVhbCh2YWx1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKFwiY3VzdG9tIGRlbGltaXRlclwiLCAoKSA9PiB7XG4gICAgaXQuZWFjaChbXG4gICAgICAvLyBTZW1pY29sb24gZGVsaW1pdGVyXG4gICAgICBbXCJhO2I7Y1wiLCBbXCJhXCIsIFwiYlwiLCBcImNcIl1dLFxuICAgICAgW1wiMTsyOzNcIiwgW1wiMVwiLCBcIjJcIiwgXCIzXCJdXSxcblxuICAgICAgLy8gRW1wdHkgbGlzdFxuICAgICAgLy9bXCJcIiwgbnVsbF0sXG5cbiAgICAgIC8vIFNpbmdsZSBpdGVtXG4gICAgICBbXCJzaW5nbGVcIiwgW1wic2luZ2xlXCJdXSxcblxuICAgICAgLy8gV2hpdGVzcGFjZSBoYW5kbGluZ1xuICAgICAgLy9bXCIgYTsgYjsgYyBcIiwgW1wiYVwiLCBcImJcIiwgXCJjXCJdXSxcblxuICAgICAgLy8gRW1wdHkgaXRlbXMgaW4gbGlzdFxuICAgICAgW1wiYTs7Y1wiLCBbXCJhXCIsIFwiXCIsIFwiY1wiXV0sXG4gICAgXSkoXCIlcyAtPiAlc1wiLCBhc3luYyAoY2VsbCwgdmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGwuRGF0YUZyYW1lKFtwbC5TZXJpZXMoXCJuYW1lXCIsIFtjZWxsXSwgcGwuU3RyaW5nKV0pLmxhenkoKVxuXG4gICAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkczogW3sgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwibGlzdFwiIGFzIGNvbnN0LCBkZWxpbWl0ZXI6IFwiO1wiIH1dLFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBub3JtYWxpemVUYWJsZSh0YWJsZSwgc2NoZW1hKVxuICAgICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICAgIGV4cGVjdChmcmFtZS50b1JlY29yZHMoKVswXT8ubmFtZSkudG9FcXVhbCh2YWx1ZSlcbiAgICB9KVxuICB9KVxufSlcblxuZGVzY3JpYmUoXCJzdHJpbmdpZnlMaXN0RmllbGRcIiwgKCkgPT4ge1xuICBkZXNjcmliZShcImRlZmF1bHQgc2V0dGluZ3MgKHN0cmluZyBpdGVtcywgY29tbWEgZGVsaW1pdGVyKVwiLCAoKSA9PiB7XG4gICAgaXQuZWFjaChbXG4gICAgICAvLyBCYXNpYyBsaXN0IHN0cmluZ2lmeWluZ1xuICAgICAgW1tcImFcIiwgXCJiXCIsIFwiY1wiXSwgXCJhLGIsY1wiXSxcbiAgICAgIFtbXCJmb29cIiwgXCJiYXJcIiwgXCJiYXpcIl0sIFwiZm9vLGJhcixiYXpcIl0sXG4gICAgICBbW1wiMVwiLCBcIjJcIiwgXCIzXCJdLCBcIjEsMiwzXCJdLFxuXG4gICAgICAvLyBTaW5nbGUgaXRlbVxuICAgICAgW1tcInNpbmdsZVwiXSwgXCJzaW5nbGVcIl0sXG5cbiAgICAgIC8vIEVtcHR5IGl0ZW1zIGluIGxpc3RcbiAgICAgIFtbXCJhXCIsIFwiXCIsIFwiY1wiXSwgXCJhLCxjXCJdLFxuICAgICAgW1tcIlwiLCBcImJcIiwgXCJcIl0sIFwiLGIsXCJdLFxuICAgICAgW1tcIlwiLCBcIlwiLCBcIlwiLCBcIlwiXSwgXCIsLCxcIl0sXG5cbiAgICAgIC8vIE51bGwgaGFuZGxpbmdcbiAgICAgIFtbbnVsbCwgXCJiXCIsIG51bGxdLCBcImJcIl0sXG4gICAgICBbW1wiYVwiLCBudWxsLCBcImNcIl0sIFwiYSxjXCJdLFxuXG4gICAgICAvLyBFbXB0eSBhcnJheVxuICAgICAgW1tdLCBcIlwiXSxcbiAgICBdKShcIiVzIC0+ICVzXCIsIGFzeW5jICh2YWx1ZSwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgICAgLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbdmFsdWVdLCBwbC5MaXN0KHBsLlN0cmluZykpXSlcbiAgICAgICAgLmxhenkoKVxuXG4gICAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkczogW3sgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwibGlzdFwiIGFzIGNvbnN0IH1dLFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZW5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEpXG4gICAgICBjb25zdCBmcmFtZSA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcblxuICAgICAgZXhwZWN0KGZyYW1lLnRvUmVjb3JkcygpWzBdPy5uYW1lKS50b0VxdWFsKGV4cGVjdGVkKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoXCJpbnRlZ2VyIGl0ZW0gdHlwZVwiLCAoKSA9PiB7XG4gICAgaXQuZWFjaChbXG4gICAgICAvLyBJbnRlZ2VyIGxpc3RzIHRvIHN0cmluZ1xuICAgICAgW1sxLCAyLCAzXSwgXCIxLDIsM1wiXSxcbiAgICAgIFtbMCwgLTEsIDQyXSwgXCIwLC0xLDQyXCJdLFxuICAgICAgW1stMTAsIDAsIDEwXSwgXCItMTAsMCwxMFwiXSxcblxuICAgICAgLy8gU2luZ2xlIGl0ZW1cbiAgICAgIFtbNDJdLCBcIjQyXCJdLFxuXG4gICAgICAvLyBXaXRoIG51bGxzIChudWxscyBhcmUgZmlsdGVyZWQgb3V0KVxuICAgICAgW1sxLCBudWxsLCAzXSwgXCIxLDNcIl0sXG4gICAgICBbW251bGwsIDIsIG51bGxdLCBcIjJcIl0sXG5cbiAgICAgIC8vIEVtcHR5IGFycmF5XG4gICAgICBbW10sIFwiXCJdLFxuICAgIF0pKFwiJXMgLT4gJXNcIiwgYXN5bmMgKHZhbHVlLCBleHBlY3RlZCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgICAuRGF0YUZyYW1lKFtwbC5TZXJpZXMoXCJuYW1lXCIsIFt2YWx1ZV0sIHBsLkxpc3QocGwuSW50MTYpKV0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcImxpc3RcIiBhcyBjb25zdCwgaXRlbVR5cGU6IFwiaW50ZWdlclwiIGFzIGNvbnN0IH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlbm9ybWFsaXplVGFibGUodGFibGUsIHNjaGVtYSlcbiAgICAgIGNvbnN0IGZyYW1lID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuXG4gICAgICBleHBlY3QoZnJhbWUudG9SZWNvcmRzKClbMF0/Lm5hbWUpLnRvRXF1YWwoZXhwZWN0ZWQpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZShcIm51bWJlciBpdGVtIHR5cGVcIiwgKCkgPT4ge1xuICAgIGl0LmVhY2goW1xuICAgICAgLy8gTnVtYmVyIGxpc3RzIHRvIHN0cmluZ1xuICAgICAgW1sxLjUsIDIuMSwgMy43XSwgXCIxLjUsMi4xLDMuN1wiXSxcbiAgICAgIFtbMCwgLTEuMSwgNDJdLCBcIjAuMCwtMS4xLDQyLjBcIl0sXG4gICAgICBbWy0xMC41LCAwLCAxMF0sIFwiLTEwLjUsMC4wLDEwLjBcIl0sXG5cbiAgICAgIC8vIFNpbmdsZSBpdGVtXG4gICAgICBbWzMuMTRdLCBcIjMuMTRcIl0sXG5cbiAgICAgIC8vIFdpdGggbnVsbHNcbiAgICAgIFtbMS4xLCBudWxsLCAzLjNdLCBcIjEuMSwzLjNcIl0sXG4gICAgICBbW251bGwsIDIuMiwgbnVsbF0sIFwiMi4yXCJdLFxuXG4gICAgICAvLyBFbXB0eSBhcnJheVxuICAgICAgW1tdLCBcIlwiXSxcbiAgICBdKShcIiVzIC0+ICVzXCIsIGFzeW5jICh2YWx1ZSwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgICAgLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbdmFsdWVdLCBwbC5MaXN0KHBsLkZsb2F0NjQpKV0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcImxpc3RcIiBhcyBjb25zdCwgaXRlbVR5cGU6IFwibnVtYmVyXCIgYXMgY29uc3QgfSxcbiAgICAgICAgXSxcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVub3JtYWxpemVUYWJsZSh0YWJsZSwgc2NoZW1hKVxuICAgICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICAgIGV4cGVjdChmcmFtZS50b1JlY29yZHMoKVswXT8ubmFtZSkudG9FcXVhbChleHBlY3RlZClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKFwiY3VzdG9tIGRlbGltaXRlclwiLCAoKSA9PiB7XG4gICAgaXQuZWFjaChbXG4gICAgICAvLyBTZW1pY29sb24gZGVsaW1pdGVyXG4gICAgICBbW1wiYVwiLCBcImJcIiwgXCJjXCJdLCBcImE7YjtjXCJdLFxuICAgICAgW1tcIjFcIiwgXCIyXCIsIFwiM1wiXSwgXCIxOzI7M1wiXSxcblxuICAgICAgLy8gU2luZ2xlIGl0ZW1cbiAgICAgIFtbXCJzaW5nbGVcIl0sIFwic2luZ2xlXCJdLFxuXG4gICAgICAvLyBFbXB0eSBpdGVtcyBpbiBsaXN0XG4gICAgICBbW1wiYVwiLCBcIlwiLCBcImNcIl0sIFwiYTs7Y1wiXSxcbiAgICAgIFtbXCJcIiwgXCJiXCIsIFwiXCJdLCBcIjtiO1wiXSxcblxuICAgICAgLy8gTnVtZXJpYyBpdGVtc1xuICAgICAgW1sxLjAsIDIuMCwgMy4wXSwgXCIxLjA7Mi4wOzMuMFwiXSxcblxuICAgICAgLy8gRW1wdHkgYXJyYXlcbiAgICAgIFtbXSwgXCJcIl0sXG4gICAgXSkoXCIlcyAtPiAlc1wiLCBhc3luYyAodmFsdWUsIGV4cGVjdGVkKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAgIC5EYXRhRnJhbWUoW3BsLlNlcmllcyhcIm5hbWVcIiwgW3ZhbHVlXSwgcGwuTGlzdChwbC5TdHJpbmcpKV0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgICBmaWVsZHM6IFt7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcImxpc3RcIiBhcyBjb25zdCwgZGVsaW1pdGVyOiBcIjtcIiB9XSxcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVub3JtYWxpemVUYWJsZSh0YWJsZSwgc2NoZW1hKVxuICAgICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICAgIGV4cGVjdChmcmFtZS50b1JlY29yZHMoKVswXT8ubmFtZSkudG9FcXVhbChleHBlY3RlZClcbiAgICB9KVxuICB9KVxufSlcbiJdfQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { NumberField } from "@frictionless-ts/metadata";
|
|
2
|
+
import * as pl from "nodejs-polars";
|
|
3
|
+
export declare function parseNumberField(field: NumberField, fieldExpr: pl.Expr): pl.Expr;
|
|
4
|
+
export declare function stringifyNumberField(_field: NumberField, fieldExpr: pl.Expr): pl.Expr;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
export function parseNumberField(field, fieldExpr) {
|
|
3
|
+
// Extract the decimal and group characters
|
|
4
|
+
const decimalChar = field.decimalChar ?? ".";
|
|
5
|
+
const groupChar = field.groupChar ?? "";
|
|
6
|
+
const bareNumber = field.bareNumber ?? true;
|
|
7
|
+
// Handle non-bare numbers (with currency symbols, percent signs, etc.)
|
|
8
|
+
if (bareNumber === false) {
|
|
9
|
+
// Remove leading non-digit characters (except minus sign and allowed decimal points)
|
|
10
|
+
const allowedDecimalChars = decimalChar === "." ? "\\." : `\\.${decimalChar}`;
|
|
11
|
+
fieldExpr = fieldExpr.str.replaceAll(`^[^\\d\\-${allowedDecimalChars}]+`, "");
|
|
12
|
+
// Remove trailing non-digit characters
|
|
13
|
+
fieldExpr = fieldExpr.str.replaceAll(`[^\\d${allowedDecimalChars}]+$`, "");
|
|
14
|
+
}
|
|
15
|
+
// Special case handling for European number format where "." is group and "," is decimal
|
|
16
|
+
if (groupChar === "." && decimalChar === ",") {
|
|
17
|
+
// First temporarily replace the decimal comma with a placeholder
|
|
18
|
+
fieldExpr = fieldExpr.str.replaceAll(",", "###DECIMAL###");
|
|
19
|
+
// Remove the group dots
|
|
20
|
+
fieldExpr = fieldExpr.str.replaceAll("\\.", "");
|
|
21
|
+
// Replace the placeholder with an actual decimal point
|
|
22
|
+
fieldExpr = fieldExpr.str.replaceAll("###DECIMAL###", ".");
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
// Standard case: first remove group characters
|
|
26
|
+
if (groupChar) {
|
|
27
|
+
// Escape special characters for regex
|
|
28
|
+
const escapedGroupChar = groupChar.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
29
|
+
fieldExpr = fieldExpr.str.replaceAll(escapedGroupChar, "");
|
|
30
|
+
}
|
|
31
|
+
// Then handle decimal character
|
|
32
|
+
if (decimalChar && decimalChar !== ".") {
|
|
33
|
+
fieldExpr = fieldExpr.str.replaceAll(decimalChar, ".");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Cast to float64
|
|
37
|
+
fieldExpr = fieldExpr.cast(pl.Float64);
|
|
38
|
+
return fieldExpr;
|
|
39
|
+
}
|
|
40
|
+
export function stringifyNumberField(_field, fieldExpr) {
|
|
41
|
+
// Convert to string
|
|
42
|
+
fieldExpr = fieldExpr.cast(pl.String);
|
|
43
|
+
//const decimalChar = field.decimalChar ?? "."
|
|
44
|
+
//const groupChar = field.groupChar ?? ""
|
|
45
|
+
// TODO: Add decimal character formatting when needed
|
|
46
|
+
// TODO: Add group character formatting (thousands separator) when needed
|
|
47
|
+
// TODO: Add non-bare number formatting (currency symbols, etc.) when needed
|
|
48
|
+
return fieldExpr;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZmllbGQvdHlwZXMvbnVtYmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRW5DLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFrQixFQUFFLFNBQWtCO0lBQ3JFLDJDQUEyQztJQUMzQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQTtJQUM1QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQTtJQUN2QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQTtJQUUzQyx1RUFBdUU7SUFDdkUsSUFBSSxVQUFVLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDekIscUZBQXFGO1FBQ3JGLE1BQU0sbUJBQW1CLEdBQ3ZCLFdBQVcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxXQUFXLEVBQUUsQ0FBQTtRQUNuRCxTQUFTLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQ2xDLFlBQVksbUJBQW1CLElBQUksRUFDbkMsRUFBRSxDQUNILENBQUE7UUFDRCx1Q0FBdUM7UUFDdkMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFFBQVEsbUJBQW1CLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUM1RSxDQUFDO0lBRUQseUZBQXlGO0lBQ3pGLElBQUksU0FBUyxLQUFLLEdBQUcsSUFBSSxXQUFXLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDN0MsaUVBQWlFO1FBQ2pFLFNBQVMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUE7UUFDMUQsd0JBQXdCO1FBQ3hCLFNBQVMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDL0MsdURBQXVEO1FBQ3ZELFNBQVMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDNUQsQ0FBQztTQUFNLENBQUM7UUFDTiwrQ0FBK0M7UUFDL0MsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLHNDQUFzQztZQUN0QyxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUE7WUFDekUsU0FBUyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQzVELENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxXQUFXLElBQUksV0FBVyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ3ZDLFNBQVMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFDeEQsQ0FBQztJQUNILENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsU0FBUyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3RDLE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsTUFBbUIsRUFBRSxTQUFrQjtJQUMxRSxvQkFBb0I7SUFDcEIsU0FBUyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRXJDLDhDQUE4QztJQUM5Qyx5Q0FBeUM7SUFFekMscURBQXFEO0lBQ3JELHlFQUF5RTtJQUN6RSw0RUFBNEU7SUFFNUUsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTnVtYmVyRmllbGQgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU51bWJlckZpZWxkKGZpZWxkOiBOdW1iZXJGaWVsZCwgZmllbGRFeHByOiBwbC5FeHByKSB7XG4gIC8vIEV4dHJhY3QgdGhlIGRlY2ltYWwgYW5kIGdyb3VwIGNoYXJhY3RlcnNcbiAgY29uc3QgZGVjaW1hbENoYXIgPSBmaWVsZC5kZWNpbWFsQ2hhciA/PyBcIi5cIlxuICBjb25zdCBncm91cENoYXIgPSBmaWVsZC5ncm91cENoYXIgPz8gXCJcIlxuICBjb25zdCBiYXJlTnVtYmVyID0gZmllbGQuYmFyZU51bWJlciA/PyB0cnVlXG5cbiAgLy8gSGFuZGxlIG5vbi1iYXJlIG51bWJlcnMgKHdpdGggY3VycmVuY3kgc3ltYm9scywgcGVyY2VudCBzaWducywgZXRjLilcbiAgaWYgKGJhcmVOdW1iZXIgPT09IGZhbHNlKSB7XG4gICAgLy8gUmVtb3ZlIGxlYWRpbmcgbm9uLWRpZ2l0IGNoYXJhY3RlcnMgKGV4Y2VwdCBtaW51cyBzaWduIGFuZCBhbGxvd2VkIGRlY2ltYWwgcG9pbnRzKVxuICAgIGNvbnN0IGFsbG93ZWREZWNpbWFsQ2hhcnMgPVxuICAgICAgZGVjaW1hbENoYXIgPT09IFwiLlwiID8gXCJcXFxcLlwiIDogYFxcXFwuJHtkZWNpbWFsQ2hhcn1gXG4gICAgZmllbGRFeHByID0gZmllbGRFeHByLnN0ci5yZXBsYWNlQWxsKFxuICAgICAgYF5bXlxcXFxkXFxcXC0ke2FsbG93ZWREZWNpbWFsQ2hhcnN9XStgLFxuICAgICAgXCJcIixcbiAgICApXG4gICAgLy8gUmVtb3ZlIHRyYWlsaW5nIG5vbi1kaWdpdCBjaGFyYWN0ZXJzXG4gICAgZmllbGRFeHByID0gZmllbGRFeHByLnN0ci5yZXBsYWNlQWxsKGBbXlxcXFxkJHthbGxvd2VkRGVjaW1hbENoYXJzfV0rJGAsIFwiXCIpXG4gIH1cblxuICAvLyBTcGVjaWFsIGNhc2UgaGFuZGxpbmcgZm9yIEV1cm9wZWFuIG51bWJlciBmb3JtYXQgd2hlcmUgXCIuXCIgaXMgZ3JvdXAgYW5kIFwiLFwiIGlzIGRlY2ltYWxcbiAgaWYgKGdyb3VwQ2hhciA9PT0gXCIuXCIgJiYgZGVjaW1hbENoYXIgPT09IFwiLFwiKSB7XG4gICAgLy8gRmlyc3QgdGVtcG9yYXJpbHkgcmVwbGFjZSB0aGUgZGVjaW1hbCBjb21tYSB3aXRoIGEgcGxhY2Vob2xkZXJcbiAgICBmaWVsZEV4cHIgPSBmaWVsZEV4cHIuc3RyLnJlcGxhY2VBbGwoXCIsXCIsIFwiIyMjREVDSU1BTCMjI1wiKVxuICAgIC8vIFJlbW92ZSB0aGUgZ3JvdXAgZG90c1xuICAgIGZpZWxkRXhwciA9IGZpZWxkRXhwci5zdHIucmVwbGFjZUFsbChcIlxcXFwuXCIsIFwiXCIpXG4gICAgLy8gUmVwbGFjZSB0aGUgcGxhY2Vob2xkZXIgd2l0aCBhbiBhY3R1YWwgZGVjaW1hbCBwb2ludFxuICAgIGZpZWxkRXhwciA9IGZpZWxkRXhwci5zdHIucmVwbGFjZUFsbChcIiMjI0RFQ0lNQUwjIyNcIiwgXCIuXCIpXG4gIH0gZWxzZSB7XG4gICAgLy8gU3RhbmRhcmQgY2FzZTogZmlyc3QgcmVtb3ZlIGdyb3VwIGNoYXJhY3RlcnNcbiAgICBpZiAoZ3JvdXBDaGFyKSB7XG4gICAgICAvLyBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGZvciByZWdleFxuICAgICAgY29uc3QgZXNjYXBlZEdyb3VwQ2hhciA9IGdyb3VwQ2hhci5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIilcbiAgICAgIGZpZWxkRXhwciA9IGZpZWxkRXhwci5zdHIucmVwbGFjZUFsbChlc2NhcGVkR3JvdXBDaGFyLCBcIlwiKVxuICAgIH1cblxuICAgIC8vIFRoZW4gaGFuZGxlIGRlY2ltYWwgY2hhcmFjdGVyXG4gICAgaWYgKGRlY2ltYWxDaGFyICYmIGRlY2ltYWxDaGFyICE9PSBcIi5cIikge1xuICAgICAgZmllbGRFeHByID0gZmllbGRFeHByLnN0ci5yZXBsYWNlQWxsKGRlY2ltYWxDaGFyLCBcIi5cIilcbiAgICB9XG4gIH1cblxuICAvLyBDYXN0IHRvIGZsb2F0NjRcbiAgZmllbGRFeHByID0gZmllbGRFeHByLmNhc3QocGwuRmxvYXQ2NClcbiAgcmV0dXJuIGZpZWxkRXhwclxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5TnVtYmVyRmllbGQoX2ZpZWxkOiBOdW1iZXJGaWVsZCwgZmllbGRFeHByOiBwbC5FeHByKSB7XG4gIC8vIENvbnZlcnQgdG8gc3RyaW5nXG4gIGZpZWxkRXhwciA9IGZpZWxkRXhwci5jYXN0KHBsLlN0cmluZylcblxuICAvL2NvbnN0IGRlY2ltYWxDaGFyID0gZmllbGQuZGVjaW1hbENoYXIgPz8gXCIuXCJcbiAgLy9jb25zdCBncm91cENoYXIgPSBmaWVsZC5ncm91cENoYXIgPz8gXCJcIlxuXG4gIC8vIFRPRE86IEFkZCBkZWNpbWFsIGNoYXJhY3RlciBmb3JtYXR0aW5nIHdoZW4gbmVlZGVkXG4gIC8vIFRPRE86IEFkZCBncm91cCBjaGFyYWN0ZXIgZm9ybWF0dGluZyAodGhvdXNhbmRzIHNlcGFyYXRvcikgd2hlbiBuZWVkZWRcbiAgLy8gVE9ETzogQWRkIG5vbi1iYXJlIG51bWJlciBmb3JtYXR0aW5nIChjdXJyZW5jeSBzeW1ib2xzLCBldGMuKSB3aGVuIG5lZWRlZFxuXG4gIHJldHVybiBmaWVsZEV4cHJcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { denormalizeTable, normalizeTable } from "../../table/index.js";
|
|
4
|
+
describe("parseNumberField", () => {
|
|
5
|
+
it.each([
|
|
6
|
+
// Basic number parsing
|
|
7
|
+
["1", 1.0, {}],
|
|
8
|
+
["2", 2.0, {}],
|
|
9
|
+
["1000", 1000.0, {}],
|
|
10
|
+
["1.5", 1.5, {}],
|
|
11
|
+
// biome-ignore lint/suspicious: tests
|
|
12
|
+
["3.14159", 3.14159, {}],
|
|
13
|
+
["-42", -42.0, {}],
|
|
14
|
+
["-3.14", -3.14, {}],
|
|
15
|
+
// Empty or invalid values
|
|
16
|
+
["", null, {}],
|
|
17
|
+
["bad", null, {}],
|
|
18
|
+
["text", null, {}],
|
|
19
|
+
// Group character handling
|
|
20
|
+
["1", 1.0, { groupChar: "," }],
|
|
21
|
+
["1,000", 1000.0, { groupChar: "," }],
|
|
22
|
+
["1,000,000", 1000000.0, { groupChar: "," }],
|
|
23
|
+
["1 000", 1000.0, { groupChar: " " }],
|
|
24
|
+
["1#000#000", 1000000.0, { groupChar: "#" }],
|
|
25
|
+
// Decimal character handling
|
|
26
|
+
["1.5", 1.5, { decimalChar: "." }],
|
|
27
|
+
["1,5", 1.5, { decimalChar: "," }],
|
|
28
|
+
["3,14", 3.14, { decimalChar: "," }],
|
|
29
|
+
["3.14", 3.14, { decimalChar: "." }],
|
|
30
|
+
// Bare number handling
|
|
31
|
+
["1.5", 1.5, { bareNumber: true }],
|
|
32
|
+
["$1.5", null, { bareNumber: true }],
|
|
33
|
+
["1.5%", null, { bareNumber: true }],
|
|
34
|
+
["$1.5", 1.5, { bareNumber: false }],
|
|
35
|
+
["1.5%", 1.5, { bareNumber: false }],
|
|
36
|
+
["$1,000.00", null, { bareNumber: true }],
|
|
37
|
+
["$1,000.00", 1000.0, { bareNumber: false, groupChar: "," }],
|
|
38
|
+
[
|
|
39
|
+
"€ 1.000,00",
|
|
40
|
+
1000.0,
|
|
41
|
+
{ bareNumber: false, groupChar: ".", decimalChar: "," },
|
|
42
|
+
],
|
|
43
|
+
[
|
|
44
|
+
"1.000,00 €",
|
|
45
|
+
1000.0,
|
|
46
|
+
{ bareNumber: false, groupChar: ".", decimalChar: "," },
|
|
47
|
+
],
|
|
48
|
+
// Complex cases with multiple options
|
|
49
|
+
["1,234.56", 1234.56, { groupChar: "," }],
|
|
50
|
+
["1.234,56", 1234.56, { groupChar: ".", decimalChar: "," }],
|
|
51
|
+
["$1,234.56", null, { bareNumber: true, groupChar: "," }],
|
|
52
|
+
["$1,234.56", 1234.56, { bareNumber: false, groupChar: "," }],
|
|
53
|
+
["1,234.56$", 1234.56, { bareNumber: false, groupChar: "," }],
|
|
54
|
+
[
|
|
55
|
+
"1.234,56 €",
|
|
56
|
+
1234.56,
|
|
57
|
+
{ bareNumber: false, groupChar: ".", decimalChar: "," },
|
|
58
|
+
],
|
|
59
|
+
])("$0 -> $1 $2", async (cell, value, options) => {
|
|
60
|
+
const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
|
|
61
|
+
const schema = {
|
|
62
|
+
fields: [{ name: "name", type: "number", ...options }],
|
|
63
|
+
};
|
|
64
|
+
const result = await normalizeTable(table, schema);
|
|
65
|
+
const frame = await result.collect();
|
|
66
|
+
expect(frame.getColumn("name").get(0)).toEqual(value);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe("stringifyNumberField", () => {
|
|
70
|
+
it.each([
|
|
71
|
+
// Basic number to string conversion
|
|
72
|
+
[1.0, "1.0"],
|
|
73
|
+
[2.0, "2.0"],
|
|
74
|
+
[1000.0, "1000.0"],
|
|
75
|
+
[3.14, "3.14"],
|
|
76
|
+
[42.5, "42.5"],
|
|
77
|
+
[-1.0, "-1.0"],
|
|
78
|
+
[-100.5, "-100.5"],
|
|
79
|
+
[0.0, "0.0"],
|
|
80
|
+
// Numbers with many decimal places
|
|
81
|
+
//[3.141592653589793, "3.141592653589793"],
|
|
82
|
+
[-123.456789, "-123.456789"],
|
|
83
|
+
// Large numbers
|
|
84
|
+
[1234567890.123, "1234567890.123"],
|
|
85
|
+
[-9876543210.987, "-9876543210.987"],
|
|
86
|
+
// Small numbers
|
|
87
|
+
[0.001, "0.001"],
|
|
88
|
+
[-0.0001, "-0.0001"],
|
|
89
|
+
// Null handling
|
|
90
|
+
[null, ""],
|
|
91
|
+
])("%s -> %s", async (value, expected) => {
|
|
92
|
+
const table = pl.DataFrame([pl.Series("name", [value], pl.Float64)]).lazy();
|
|
93
|
+
const schema = {
|
|
94
|
+
fields: [{ name: "name", type: "number" }],
|
|
95
|
+
};
|
|
96
|
+
const result = await denormalizeTable(table, schema);
|
|
97
|
+
const frame = await result.collect();
|
|
98
|
+
expect(frame.toRecords()[0]?.name).toEqual(expected);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9maWVsZC90eXBlcy9udW1iZXIuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDN0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBRXZFLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7SUFDaEMsRUFBRSxDQUFDLElBQUksQ0FBQztRQUNOLHVCQUF1QjtRQUN2QixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ2QsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUNkLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDcEIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUNoQixzQ0FBc0M7UUFDdEMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUN4QixDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDbEIsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBRXBCLDBCQUEwQjtRQUMxQixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ2QsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNqQixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBRWxCLDJCQUEyQjtRQUMzQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDOUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFF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RXBDLGdCQUFnQjtRQUNoQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7UUFDaEIsQ0FBQyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUM7UUFFcEIsZ0JBQWdCO1FBQ2hCLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztLQUNYLENBQUMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRTtRQUN2QyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO1FBRTNFLE1BQU0sTUFBTSxHQUFHO1lBQ2IsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFpQixFQUFFLENBQUM7U0FDcEQsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3BELE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBRXBDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3RELENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHsgZGVub3JtYWxpemVUYWJsZSwgbm9ybWFsaXplVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUvaW5kZXgudHNcIlxuXG5kZXNjcmliZShcInBhcnNlTnVtYmVyRmllbGRcIiwgKCkgPT4ge1xuICBpdC5lYWNoKFtcbiAgICAvLyBCYXNpYyBudW1iZXIgcGFyc2luZ1xuICAgIFtcIjFcIiwgMS4wLCB7fV0sXG4gICAgW1wiMlwiLCAyLjAsIHt9XSxcbiAgICBbXCIxMDAwXCIsIDEwMDAuMCwge31dLFxuICAgIFtcIjEuNVwiLCAxLjUsIHt9XSxcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzOiB0ZXN0c1xuICAgIFtcIjMuMTQxNTlcIiwgMy4xNDE1OSwge31dLFxuICAgIFtcIi00MlwiLCAtNDIuMCwge31dLFxuICAgIFtcIi0zLjE0XCIsIC0zLjE0LCB7fV0sXG5cbiAgICAvLyBFbXB0eSBvciBpbnZhbGlkIHZhbHVlc1xuICAgIFtcIlwiLCBudWxsLCB7fV0sXG4gICAgW1wiYmFkXCIsIG51bGwsIHt9XSxcbiAgICBbXCJ0ZXh0XCIsIG51bGwsIHt9XSxcblxuICAgIC8vIEdyb3VwIGNoYXJhY3RlciBoYW5kbGluZ1xuICAgIFtcIjFcIiwgMS4wLCB7IGdyb3VwQ2hhcjogXCIsXCIgfV0sXG4gICAgW1wiMSwwMDBcIiwgMTAwMC4wLCB7IGdyb3VwQ2hhcjogXCIsXCIgfV0sXG4gICAgW1wiMSwwMDAsMDAwXCIsIDEwMDAwMDAuMCwgeyBncm91cENoYXI6IFwiLFwiIH1dLFxuICAgIFtcIjEgMDAwXCIsIDEwMDAuMCwgeyBncm91cENoYXI6IFwiIFwiIH1dLFxuICAgIFtcIjEjMDAwIzAwMFwiLCAxMDAwMDAwLjAsIHsgZ3JvdXBDaGFyOiBcIiNcIiB9XSxcblxuICAgIC8vIERlY2ltYWwgY2hhcmFjdGVyIGhhbmRsaW5nXG4gICAgW1wiMS41XCIsIDEuNSwgeyBkZWNpbWFsQ2hhcjogXCIuXCIgfV0sXG4gICAgW1wiMSw1XCIsIDEuNSwgeyBkZWNpbWFsQ2hhcjogXCIsXCIgfV0sXG4gICAgW1wiMywxNFwiLCAzLjE0LCB7IGRlY2ltYWxDaGFyOiBcIixcIiB9XSxcbiAgICBbXCIzLjE0XCIsIDMuMTQsIHsgZGVjaW1hbENoYXI6IFwiLlwiIH1dLFxuXG4gICAgLy8gQmFyZSBudW1iZXIgaGFuZGxpbmdcbiAgICBbXCIxLjVcIiwgMS41LCB7IGJhcmVOdW1iZXI6IHRydWUgfV0sXG4gICAgW1wiJDEuNVwiLCBudWxsLCB7IGJhcmVOdW1iZXI6IHRydWUgfV0sXG4gICAgW1wiMS41JVwiLCBudWxsLCB7IGJhcmVOdW1iZXI6IHRydWUgfV0sXG4gICAgW1wiJDEuNVwiLCAxLjUsIHsgYmFyZU51bWJlcjogZmFsc2UgfV0sXG4gICAgW1wiMS41JVwiLCAxLjUsIHsgYmFyZU51bWJlcjogZmFsc2UgfV0sXG4gICAgW1wiJDEsMDAwLjAwXCIsIG51bGwsIHsgYmFyZU51bWJlcjogdHJ1ZSB9XSxcbiAgICBbXCIkMSwwMDAuMDBcIiwgMTAwMC4wLCB7IGJhcmVOdW1iZXI6IGZhbHNlLCBncm91cENoYXI6IFwiLFwiIH1dLFxuICAgIFtcbiAgICAgIFwi4oKsIDEuMDAwLDAwXCIsXG4gICAgICAxMDAwLjAsXG4gICAgICB7IGJhcmVOdW1iZXI6IGZhbHNlLCBncm91cENoYXI6IFwiLlwiLCBkZWNpbWFsQ2hhcjogXCIsXCIgfSxcbiAgICBdLFxuICAgIFtcbiAgICAgIFwiMS4wMDAsMDAg4oKsXCIsXG4gICAgICAxMDAwLjAsXG4gICAgICB7IGJhcmVOdW1iZXI6IGZhbHNlLCBncm91cENoYXI6IFwiLlwiLCBkZWNpbWFsQ2hhcjogXCIsXCIgfSxcbiAgICBdLFxuXG4gICAgLy8gQ29tcGxleCBjYXNlcyB3aXRoIG11bHRpcGxlIG9wdGlvbnNcbiAgICBbXCIxLDIzNC41NlwiLCAxMjM0LjU2LCB7IGdyb3VwQ2hhcjogXCIsXCIgfV0sXG4gICAgW1wiMS4yMzQsNTZcIiwgMTIzNC41NiwgeyBncm91cENoYXI6IFwiLlwiLCBkZWNpbWFsQ2hhcjogXCIsXCIgfV0sXG4gICAgW1wiJDEsMjM0LjU2XCIsIG51bGwsIHsgYmFyZU51bWJlcjogdHJ1ZSwgZ3JvdXBDaGFyOiBcIixcIiB9XSxcbiAgICBbXCIkMSwyMzQuNTZcIiwgMTIzNC41NiwgeyBiYXJlTnVtYmVyOiBmYWxzZSwgZ3JvdXBDaGFyOiBcIixcIiB9XSxcbiAgICBbXCIxLDIzNC41NiRcIiwgMTIzNC41NiwgeyBiYXJlTnVtYmVyOiBmYWxzZSwgZ3JvdXBDaGFyOiBcIixcIiB9XSxcbiAgICBbXG4gICAgICBcIjEuMjM0LDU2IOKCrFwiLFxuICAgICAgMTIzNC41NixcbiAgICAgIHsgYmFyZU51bWJlcjogZmFsc2UsIGdyb3VwQ2hhcjogXCIuXCIsIGRlY2ltYWxDaGFyOiBcIixcIiB9LFxuICAgIF0sXG4gIF0pKFwiJDAgLT4gJDEgJDJcIiwgYXN5bmMgKGNlbGwsIHZhbHVlLCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbC5EYXRhRnJhbWUoW3BsLlNlcmllcyhcIm5hbWVcIiwgW2NlbGxdLCBwbC5TdHJpbmcpXSkubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFt7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcIm51bWJlclwiIGFzIGNvbnN0LCAuLi5vcHRpb25zIH1dLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEpXG4gICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICBleHBlY3QoZnJhbWUuZ2V0Q29sdW1uKFwibmFtZVwiKS5nZXQoMCkpLnRvRXF1YWwodmFsdWUpXG4gIH0pXG59KVxuXG5kZXNjcmliZShcInN0cmluZ2lmeU51bWJlckZpZWxkXCIsICgpID0+IHtcbiAgaXQuZWFjaChbXG4gICAgLy8gQmFzaWMgbnVtYmVyIHRvIHN0cmluZyBjb252ZXJzaW9uXG4gICAgWzEuMCwgXCIxLjBcIl0sXG4gICAgWzIuMCwgXCIyLjBcIl0sXG4gICAgWzEwMDAuMCwgXCIxMDAwLjBcIl0sXG4gICAgWzMuMTQsIFwiMy4xNFwiXSxcbiAgICBbNDIuNSwgXCI0Mi41XCJdLFxuICAgIFstMS4wLCBcIi0xLjBcIl0sXG4gICAgWy0xMDAuNSwgXCItMTAwLjVcIl0sXG4gICAgWzAuMCwgXCIwLjBcIl0sXG5cbiAgICAvLyBOdW1iZXJzIHdpdGggbWFueSBkZWNpbWFsIHBsYWNlc1xuICAgIC8vWzMuMTQxNTkyNjUzNTg5NzkzLCBcIjMuMTQxNTkyNjUzNTg5NzkzXCJdLFxuICAgIFstMTIzLjQ1Njc4OSwgXCItMTIzLjQ1Njc4OVwiXSxcblxuICAgIC8vIExhcmdlIG51bWJlcnNcbiAgICBbMTIzNDU2Nzg5MC4xMjMsIFwiMTIzNDU2Nzg5MC4xMjNcIl0sXG4gICAgWy05ODc2NTQzMjEwLjk4NywgXCItOTg3NjU0MzIxMC45ODdcIl0sXG5cbiAgICAvLyBTbWFsbCBudW1iZXJzXG4gICAgWzAuMDAxLCBcIjAuMDAxXCJdLFxuICAgIFstMC4wMDAxLCBcIi0wLjAwMDFcIl0sXG5cbiAgICAvLyBOdWxsIGhhbmRsaW5nXG4gICAgW251bGwsIFwiXCJdLFxuICBdKShcIiVzIC0+ICVzXCIsIGFzeW5jICh2YWx1ZSwgZXhwZWN0ZWQpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbdmFsdWVdLCBwbC5GbG9hdDY0KV0pLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJudW1iZXJcIiBhcyBjb25zdCB9XSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZW5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEpXG4gICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICBleHBlY3QoZnJhbWUudG9SZWNvcmRzKClbMF0/Lm5hbWUpLnRvRXF1YWwoZXhwZWN0ZWQpXG4gIH0pXG59KVxuIl19
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { inspectJsonField } from "./json.js";
|
|
2
|
+
export async function inspectObjectField(field, table) {
|
|
3
|
+
return inspectJsonField(field, table);
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZmllbGQvdHlwZXMvb2JqZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUU1QyxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUFDLEtBQWtCLEVBQUUsS0FBWTtJQUN2RSxPQUFPLGdCQUFnQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBPYmplY3RGaWVsZCB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUvaW5kZXgudHNcIlxuaW1wb3J0IHsgaW5zcGVjdEpzb25GaWVsZCB9IGZyb20gXCIuL2pzb24udHNcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zcGVjdE9iamVjdEZpZWxkKGZpZWxkOiBPYmplY3RGaWVsZCwgdGFibGU6IFRhYmxlKSB7XG4gIHJldHVybiBpbnNwZWN0SnNvbkZpZWxkKGZpZWxkLCB0YWJsZSlcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|