@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,200 @@
|
|
|
1
|
+
import { writeTempFile } from "@frictionless-ts/dataset";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { useRecording } from "vitest-polly";
|
|
4
|
+
import { loadJsonTable } from "./load.js";
|
|
5
|
+
useRecording();
|
|
6
|
+
describe("loadJsonTable", () => {
|
|
7
|
+
describe("file variations", () => {
|
|
8
|
+
it("should load local file", async () => {
|
|
9
|
+
const body = '[{"id":1,"name":"english"},{"id":2,"name":"中文"}]';
|
|
10
|
+
const path = await writeTempFile(body);
|
|
11
|
+
const table = await loadJsonTable({ path });
|
|
12
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
13
|
+
{ id: 1, name: "english" },
|
|
14
|
+
{ id: 2, name: "中文" },
|
|
15
|
+
]);
|
|
16
|
+
});
|
|
17
|
+
it("should load local file (multipart)", async () => {
|
|
18
|
+
const body = '[{"id":1,"name":"english"},{"id":2,"name":"中文"}]';
|
|
19
|
+
const path1 = await writeTempFile(body);
|
|
20
|
+
const path2 = await writeTempFile(body);
|
|
21
|
+
const table = await loadJsonTable({
|
|
22
|
+
path: [path1, path2],
|
|
23
|
+
});
|
|
24
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
25
|
+
{ id: 1, name: "english" },
|
|
26
|
+
{ id: 2, name: "中文" },
|
|
27
|
+
{ id: 1, name: "english" },
|
|
28
|
+
{ id: 2, name: "中文" },
|
|
29
|
+
]);
|
|
30
|
+
});
|
|
31
|
+
it("should load remote file", async () => {
|
|
32
|
+
const table = await loadJsonTable({
|
|
33
|
+
path: "https://raw.githubusercontent.com/datisthq/dpkit/refs/heads/main/json/table/fixtures/table.json",
|
|
34
|
+
});
|
|
35
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
36
|
+
{ id: 1, name: "english" },
|
|
37
|
+
{ id: 2, name: "中文" },
|
|
38
|
+
]);
|
|
39
|
+
});
|
|
40
|
+
it("should load remote file (multipart)", async () => {
|
|
41
|
+
const table = await loadJsonTable({
|
|
42
|
+
path: [
|
|
43
|
+
"https://raw.githubusercontent.com/datisthq/dpkit/refs/heads/main/json/table/fixtures/table.json",
|
|
44
|
+
"https://raw.githubusercontent.com/datisthq/dpkit/refs/heads/main/json/table/fixtures/table.json",
|
|
45
|
+
],
|
|
46
|
+
});
|
|
47
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
48
|
+
{ id: 1, name: "english" },
|
|
49
|
+
{ id: 2, name: "中文" },
|
|
50
|
+
{ id: 1, name: "english" },
|
|
51
|
+
{ id: 2, name: "中文" },
|
|
52
|
+
]);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe("dialect variations", () => {
|
|
56
|
+
it("should handle property", async () => {
|
|
57
|
+
const body = '{"key": [{"id":1,"name":"english"},{"id":2,"name":"中文"}]}';
|
|
58
|
+
const path = await writeTempFile(body);
|
|
59
|
+
const table = await loadJsonTable({
|
|
60
|
+
path,
|
|
61
|
+
dialect: { property: "key" },
|
|
62
|
+
});
|
|
63
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
64
|
+
{ id: 1, name: "english" },
|
|
65
|
+
{ id: 2, name: "中文" },
|
|
66
|
+
]);
|
|
67
|
+
});
|
|
68
|
+
it("should handle item keys", async () => {
|
|
69
|
+
const body = '[{"id":1,"name":"english"},{"id":2,"name":"中文"}]';
|
|
70
|
+
const path = await writeTempFile(body);
|
|
71
|
+
const table = await loadJsonTable({
|
|
72
|
+
path,
|
|
73
|
+
dialect: { itemKeys: ["name"] },
|
|
74
|
+
});
|
|
75
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
76
|
+
{ name: "english" },
|
|
77
|
+
{ name: "中文" },
|
|
78
|
+
]);
|
|
79
|
+
});
|
|
80
|
+
it("should handle item type (array)", async () => {
|
|
81
|
+
const body = '[["id","name"],[1,"english"],[2,"中文"]]';
|
|
82
|
+
const path = await writeTempFile(body);
|
|
83
|
+
const table = await loadJsonTable({
|
|
84
|
+
path,
|
|
85
|
+
dialect: { itemType: "array" },
|
|
86
|
+
});
|
|
87
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
88
|
+
{ id: 1, name: "english" },
|
|
89
|
+
{ id: 2, name: "中文" },
|
|
90
|
+
]);
|
|
91
|
+
});
|
|
92
|
+
it("should load item type (object)", async () => {
|
|
93
|
+
const body = '[{"id":1,"name":"english"},{"id":2,"name":"中文"}]';
|
|
94
|
+
const path = await writeTempFile(body);
|
|
95
|
+
const table = await loadJsonTable({
|
|
96
|
+
path,
|
|
97
|
+
dialect: { itemType: "object" },
|
|
98
|
+
});
|
|
99
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
100
|
+
{ id: 1, name: "english" },
|
|
101
|
+
{ id: 2, name: "中文" },
|
|
102
|
+
]);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe("loadJsonTable (format=jsonl)", () => {
|
|
107
|
+
describe("file variations", () => {
|
|
108
|
+
it("should load local file", async () => {
|
|
109
|
+
const body = '{"id":1,"name":"english"}\n{"id":2,"name":"中文"}';
|
|
110
|
+
const path = await writeTempFile(body);
|
|
111
|
+
const table = await loadJsonTable({ path, format: "jsonl" });
|
|
112
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
113
|
+
{ id: 1, name: "english" },
|
|
114
|
+
{ id: 2, name: "中文" },
|
|
115
|
+
]);
|
|
116
|
+
});
|
|
117
|
+
it("should load local file (multipart)", async () => {
|
|
118
|
+
const body = '{"id":1,"name":"english"}\n{"id":2,"name":"中文"}';
|
|
119
|
+
const path1 = await writeTempFile(body);
|
|
120
|
+
const path2 = await writeTempFile(body);
|
|
121
|
+
const table = await loadJsonTable({
|
|
122
|
+
path: [path1, path2],
|
|
123
|
+
format: "jsonl",
|
|
124
|
+
});
|
|
125
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
126
|
+
{ id: 1, name: "english" },
|
|
127
|
+
{ id: 2, name: "中文" },
|
|
128
|
+
{ id: 1, name: "english" },
|
|
129
|
+
{ id: 2, name: "中文" },
|
|
130
|
+
]);
|
|
131
|
+
});
|
|
132
|
+
it("should load remote file", async () => {
|
|
133
|
+
const table = await loadJsonTable({
|
|
134
|
+
path: "https://raw.githubusercontent.com/datisthq/dpkit/refs/heads/main/json/table/fixtures/table.jsonl",
|
|
135
|
+
format: "jsonl",
|
|
136
|
+
});
|
|
137
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
138
|
+
{ id: 1, name: "english" },
|
|
139
|
+
{ id: 2, name: "中文" },
|
|
140
|
+
]);
|
|
141
|
+
});
|
|
142
|
+
it("should load remote file (multipart)", async () => {
|
|
143
|
+
const table = await loadJsonTable({
|
|
144
|
+
path: [
|
|
145
|
+
"https://raw.githubusercontent.com/datisthq/dpkit/refs/heads/main/json/table/fixtures/table.jsonl",
|
|
146
|
+
"https://raw.githubusercontent.com/datisthq/dpkit/refs/heads/main/json/table/fixtures/table.jsonl",
|
|
147
|
+
],
|
|
148
|
+
format: "jsonl",
|
|
149
|
+
});
|
|
150
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
151
|
+
{ id: 1, name: "english" },
|
|
152
|
+
{ id: 2, name: "中文" },
|
|
153
|
+
{ id: 1, name: "english" },
|
|
154
|
+
{ id: 2, name: "中文" },
|
|
155
|
+
]);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe("dialect variations", () => {
|
|
159
|
+
it("should handle item keys", async () => {
|
|
160
|
+
const body = '{"id":1,"name":"english"}\n{"id":2,"name":"中文"}';
|
|
161
|
+
const path = await writeTempFile(body);
|
|
162
|
+
const table = await loadJsonTable({
|
|
163
|
+
path,
|
|
164
|
+
format: "jsonl",
|
|
165
|
+
dialect: { itemKeys: ["name"] },
|
|
166
|
+
});
|
|
167
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
168
|
+
{ name: "english" },
|
|
169
|
+
{ name: "中文" },
|
|
170
|
+
]);
|
|
171
|
+
});
|
|
172
|
+
it("should handle item type (array)", async () => {
|
|
173
|
+
const body = '["id","name"]\n[1,"english"]\n[2,"中文"]';
|
|
174
|
+
const path = await writeTempFile(body);
|
|
175
|
+
const table = await loadJsonTable({
|
|
176
|
+
path,
|
|
177
|
+
format: "jsonl",
|
|
178
|
+
dialect: { itemType: "array" },
|
|
179
|
+
});
|
|
180
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
181
|
+
{ id: 1, name: "english" },
|
|
182
|
+
{ id: 2, name: "中文" },
|
|
183
|
+
]);
|
|
184
|
+
});
|
|
185
|
+
it("should load item type (object)", async () => {
|
|
186
|
+
const body = '{"id":1,"name":"english"}\n{"id":2,"name":"中文"}';
|
|
187
|
+
const path = await writeTempFile(body);
|
|
188
|
+
const table = await loadJsonTable({
|
|
189
|
+
path,
|
|
190
|
+
format: "jsonl",
|
|
191
|
+
dialect: { itemType: "object" },
|
|
192
|
+
});
|
|
193
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
194
|
+
{ id: 1, name: "english" },
|
|
195
|
+
{ id: 2, name: "中文" },
|
|
196
|
+
]);
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGx1Z2lucy9qc29uL3RhYmxlL2xvYWQuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUV6QyxZQUFZLEVBQUUsQ0FBQTtBQUVkLFFBQVEsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO0lBQzdCLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7UUFDL0IsRUFBRSxDQUFDLHdCQUF3QixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3RDLE1BQU0sSUFBSSxHQUFHLGtEQUFrRCxDQUFBO1lBQy9ELE1BQU0sSUFBSSxHQUFHLE1BQU0sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBRXRDLE1BQU0sS0FBSyxHQUFHLE1BQU0sYUFBYSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtZQUUzQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUNsRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtnQkFDMUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7YUFDdEIsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7UUFFRixFQUFFLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbEQsTUFBTSxJQUFJLEdBQUcsa0RBQWtELENBQUE7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TUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7WUFFdEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxhQUFhLENBQUM7Z0JBQ2hDLElBQUk7Z0JBQ0osTUFBTSxFQUFFLE9BQU87Z0JBQ2YsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTthQUNoQyxDQUFDLENBQUE7WUFFRixNQUFNLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUNsRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtnQkFDMUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7YUFDdEIsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgd3JpdGVUZW1wRmlsZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL2RhdGFzZXRcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IHVzZVJlY29yZGluZyB9IGZyb20gXCJ2aXRlc3QtcG9sbHlcIlxuaW1wb3J0IHsgbG9hZEpzb25UYWJsZSB9IGZyb20gXCIuL2xvYWQudHNcIlxuXG51c2VSZWNvcmRpbmcoKVxuXG5kZXNjcmliZShcImxvYWRKc29uVGFibGVcIiwgKCkgPT4ge1xuICBkZXNjcmliZShcImZpbGUgdmFyaWF0aW9uc1wiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgbG9hZCBsb2NhbCBmaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSAnW3tcImlkXCI6MSxcIm5hbWVcIjpcImVuZ2xpc2hcIn0se1wiaWRcIjoyLFwibmFtZVwiOlwi5Lit5paHXCJ9XSdcbiAgICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKGJvZHkpXG5cbiAgICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZEpzb25UYWJsZSh7IHBhdGggfSlcblxuICAgICAgZXhwZWN0KChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgICAgeyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgICAgeyBpZDogMiwgbmFtZTogXCLkuK3mlodcIiB9LFxuICAgICAgXSlcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgbG9hZCBsb2NhbCBmaWxlIChtdWx0aXBhcnQpXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSAnW3tcImlkXCI6MSxcIm5hbWVcIjpcImVuZ2xpc2hcIn0se1wiaWRcIjoyLFwibmFtZVwiOlwi5Lit5paHXCJ9XSdcbiAgICAgIGNvbnN0IHBhdGgxID0gYXdhaXQgd3JpdGVUZW1wRmlsZShib2R5KVxuICAgICAgY29uc3QgcGF0aDIgPSBhd2FpdCB3cml0ZVRlbXBGaWxlKGJvZHkpXG5cbiAgICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZEpzb25UYWJsZSh7XG4gICAgICAgIHBhdGg6IFtwYXRoMSwgcGF0aDJdLFxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgICAgeyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgICAgeyBpZDogMiwgbmFtZTogXCLkuK3mlodcIiB9LFxuICAgICAgICB7IGlkOiAxLCBuYW1lOiBcImVuZ2xpc2hcIiB9LFxuICAgICAgICB7IGlkOiAyLCBuYW1lOiBcIuS4reaWh1wiIH0sXG4gICAgICBdKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBsb2FkIHJlbW90ZSBmaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZEpzb25UYWJsZSh7XG4gICAgICAgIHBhdGg6IFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2RhdGlzdGhxL2Rwa2l0L3JlZnMvaGVhZHMvbWFpbi9qc29uL3RhYmxlL2ZpeHR1cmVzL3RhYmxlLmpzb25cIixcbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiZW5nbGlzaFwiIH0sXG4gICAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICAgIF0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGxvYWQgcmVtb3RlIGZpbGUgKG11bHRpcGFydClcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkSnNvblRhYmxlKHtcbiAgICAgICAgcGF0aDogW1xuICAgICAgICAgIFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2RhdGlzdGhxL2Rwa2l0L3JlZnMvaGVhZHMvbWFpbi9qc29uL3RhYmxlL2ZpeHR1cmVzL3RhYmxlLmpzb25cIixcbiAgICAgICAgICBcImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kYXRpc3RocS9kcGtpdC9yZWZzL2hlYWRzL21haW4vanNvbi90YWJsZS9maXh0dXJlcy90YWJsZS5qc29uXCIsXG4gICAgICAgIF0sXG4gICAgICB9KVxuXG4gICAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgICB7IGlkOiAxLCBuYW1lOiBcImVuZ2xpc2hcIiB9LFxuICAgICAgICB7IGlkOiAyLCBuYW1lOiBcIuS4reaWh1wiIH0sXG4gICAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiZW5nbGlzaFwiIH0sXG4gICAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICAgIF0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZShcImRpYWxlY3QgdmFyaWF0aW9uc1wiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgaGFuZGxlIHByb3BlcnR5XCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSAne1wia2V5XCI6IFt7XCJpZFwiOjEsXCJuYW1lXCI6XCJlbmdsaXNoXCJ9LHtcImlkXCI6MixcIm5hbWVcIjpcIuS4reaWh1wifV19J1xuICAgICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoYm9keSlcblxuICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkSnNvblRhYmxlKHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZGlhbGVjdDogeyBwcm9wZXJ0eTogXCJrZXlcIiB9LFxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgICAgeyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgICAgeyBpZDogMiwgbmFtZTogXCLkuK3mlodcIiB9LFxuICAgICAgXSlcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgaGFuZGxlIGl0ZW0ga2V5c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBib2R5ID0gJ1t7XCJpZFwiOjEsXCJuYW1lXCI6XCJlbmdsaXNoXCJ9LHtcImlkXCI6MixcIm5hbWVcIjpcIuS4reaWh1wifV0nXG4gICAgICBjb25zdCBwYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShib2R5KVxuXG4gICAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRKc29uVGFibGUoe1xuICAgICAgICBwYXRoLFxuICAgICAgICBkaWFsZWN0OiB7IGl0ZW1LZXlzOiBbXCJuYW1lXCJdIH0sXG4gICAgICB9KVxuXG4gICAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgICB7IG5hbWU6IFwiZW5nbGlzaFwiIH0sXG4gICAgICAgIHsgbmFtZTogXCLkuK3mlodcIiB9LFxuICAgICAgXSlcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgaGFuZGxlIGl0ZW0gdHlwZSAoYXJyYXkpXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSAnW1tcImlkXCIsXCJuYW1lXCJdLFsxLFwiZW5nbGlzaFwiXSxbMixcIuS4reaWh1wiXV0nXG4gICAgICBjb25zdCBwYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShib2R5KVxuXG4gICAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRKc29uVGFibGUoe1xuICAgICAgICBwYXRoLFxuICAgICAgICBkaWFsZWN0OiB7IGl0ZW1UeXBlOiBcImFycmF5XCIgfSxcbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiZW5nbGlzaFwiIH0sXG4gICAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICAgIF0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGxvYWQgaXRlbSB0eXBlIChvYmplY3QpXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSAnW3tcImlkXCI6MSxcIm5hbWVcIjpcImVuZ2xpc2hcIn0se1wiaWRcIjoyLFwibmFtZVwiOlwi5Lit5paHXCJ9XSdcbiAgICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKGJvZHkpXG5cbiAgICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZEpzb25UYWJsZSh7XG4gICAgICAgIHBhdGgsXG4gICAgICAgIGRpYWxlY3Q6IHsgaXRlbVR5cGU6IFwib2JqZWN0XCIgfSxcbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiZW5nbGlzaFwiIH0sXG4gICAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICAgIF0pXG4gICAgfSlcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKFwibG9hZEpzb25UYWJsZSAoZm9ybWF0PWpzb25sKVwiLCAoKSA9PiB7XG4gIGRlc2NyaWJlKFwiZmlsZSB2YXJpYXRpb25zXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBsb2FkIGxvY2FsIGZpbGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYm9keSA9ICd7XCJpZFwiOjEsXCJuYW1lXCI6XCJlbmdsaXNoXCJ9XFxue1wiaWRcIjoyLFwibmFtZVwiOlwi5Lit5paHXCJ9J1xuICAgICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoYm9keSlcblxuICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkSnNvblRhYmxlKHsgcGF0aCwgZm9ybWF0OiBcImpzb25sXCIgfSlcbiAgICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiZW5nbGlzaFwiIH0sXG4gICAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICAgIF0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGxvYWQgbG9jYWwgZmlsZSAobXVsdGlwYXJ0KVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBib2R5ID0gJ3tcImlkXCI6MSxcIm5hbWVcIjpcImVuZ2xpc2hcIn1cXG57XCJpZFwiOjIsXCJuYW1lXCI6XCLkuK3mlodcIn0nXG4gICAgICBjb25zdCBwYXRoMSA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoYm9keSlcbiAgICAgIGNvbnN0IHBhdGgyID0gYXdhaXQgd3JpdGVUZW1wRmlsZShib2R5KVxuXG4gICAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRKc29uVGFibGUoe1xuICAgICAgICBwYXRoOiBbcGF0aDEsIHBhdGgyXSxcbiAgICAgICAgZm9ybWF0OiBcImpzb25sXCIsXG4gICAgICB9KVxuXG4gICAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgICB7IGlkOiAxLCBuYW1lOiBcImVuZ2xpc2hcIiB9LFxuICAgICAgICB7IGlkOiAyLCBuYW1lOiBcIuS4reaWh1wiIH0sXG4gICAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiZW5nbGlzaFwiIH0sXG4gICAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICAgIF0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGxvYWQgcmVtb3RlIGZpbGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkSnNvblRhYmxlKHtcbiAgICAgICAgcGF0aDogXCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZGF0aXN0aHEvZHBraXQvcmVmcy9oZWFkcy9tYWluL2pzb24vdGFibGUvZml4dHVyZXMvdGFibGUuanNvbmxcIixcbiAgICAgICAgZm9ybWF0OiBcImpzb25sXCIsXG4gICAgICB9KVxuXG4gICAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgICB7IGlkOiAxLCBuYW1lOiBcImVuZ2xpc2hcIiB9LFxuICAgICAgICB7IGlkOiAyLCBuYW1lOiBcIuS4reaWh1wiIH0sXG4gICAgICBdKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBsb2FkIHJlbW90ZSBmaWxlIChtdWx0aXBhcnQpXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZEpzb25UYWJsZSh7XG4gICAgICAgIHBhdGg6IFtcbiAgICAgICAgICBcImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kYXRpc3RocS9kcGtpdC9yZWZzL2hlYWRzL21haW4vanNvbi90YWJsZS9maXh0dXJlcy90YWJsZS5qc29ubFwiLFxuICAgICAgICAgIFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2RhdGlzdGhxL2Rwa2l0L3JlZnMvaGVhZHMvbWFpbi9qc29uL3RhYmxlL2ZpeHR1cmVzL3RhYmxlLmpzb25sXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGZvcm1hdDogXCJqc29ubFwiLFxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgICAgeyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgICAgeyBpZDogMiwgbmFtZTogXCLkuK3mlodcIiB9LFxuICAgICAgICB7IGlkOiAxLCBuYW1lOiBcImVuZ2xpc2hcIiB9LFxuICAgICAgICB7IGlkOiAyLCBuYW1lOiBcIuS4reaWh1wiIH0sXG4gICAgICBdKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoXCJkaWFsZWN0IHZhcmlhdGlvbnNcIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIGhhbmRsZSBpdGVtIGtleXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYm9keSA9ICd7XCJpZFwiOjEsXCJuYW1lXCI6XCJlbmdsaXNoXCJ9XFxue1wiaWRcIjoyLFwibmFtZVwiOlwi5Lit5paHXCJ9J1xuICAgICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoYm9keSlcblxuICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkSnNvblRhYmxlKHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZm9ybWF0OiBcImpzb25sXCIsXG4gICAgICAgIGRpYWxlY3Q6IHsgaXRlbUtleXM6IFtcIm5hbWVcIl0gfSxcbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICAgIHsgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIuS4reaWh1wiIH0sXG4gICAgICBdKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgaXRlbSB0eXBlIChhcnJheSlcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYm9keSA9ICdbXCJpZFwiLFwibmFtZVwiXVxcblsxLFwiZW5nbGlzaFwiXVxcblsyLFwi5Lit5paHXCJdJ1xuICAgICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoYm9keSlcblxuICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkSnNvblRhYmxlKHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZm9ybWF0OiBcImpzb25sXCIsXG4gICAgICAgIGRpYWxlY3Q6IHsgaXRlbVR5cGU6IFwiYXJyYXlcIiB9LFxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgICAgeyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgICAgeyBpZDogMiwgbmFtZTogXCLkuK3mlodcIiB9LFxuICAgICAgXSlcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgbG9hZCBpdGVtIHR5cGUgKG9iamVjdClcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYm9keSA9ICd7XCJpZFwiOjEsXCJuYW1lXCI6XCJlbmdsaXNoXCJ9XFxue1wiaWRcIjoyLFwibmFtZVwiOlwi5Lit5paHXCJ9J1xuICAgICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoYm9keSlcblxuICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkSnNvblRhYmxlKHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZm9ybWF0OiBcImpzb25sXCIsXG4gICAgICAgIGRpYWxlY3Q6IHsgaXRlbVR5cGU6IFwib2JqZWN0XCIgfSxcbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiZW5nbGlzaFwiIH0sXG4gICAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICAgIF0pXG4gICAgfSlcbiAgfSlcbn0pXG4iXX0=
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export function parseJson(string, options) {
|
|
2
|
+
return options.isLines
|
|
3
|
+
? string.split("\n").map(line => JSON.parse(line))
|
|
4
|
+
: JSON.parse(string);
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wbHVnaW5zL2pzb24vdGFibGUvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLFNBQVMsQ0FBQyxNQUFjLEVBQUUsT0FBNkI7SUFDckUsT0FBTyxPQUFPLENBQUMsT0FBTztRQUNwQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gcGFyc2VKc29uKHN0cmluZzogc3RyaW5nLCBvcHRpb25zOiB7IGlzTGluZXM6IGJvb2xlYW4gfSkge1xuICByZXR1cm4gb3B0aW9ucy5pc0xpbmVzXG4gICAgPyBzdHJpbmcuc3BsaXQoXCJcXG5cIikubWFwKGxpbmUgPT4gSlNPTi5wYXJzZShsaW5lKSlcbiAgICA6IEpTT04ucGFyc2Uoc3RyaW5nKVxufVxuIl19
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { saveFile } from "@frictionless-ts/dataset";
|
|
2
|
+
import { inferSchemaFromTable } from "../../../schema/index.js";
|
|
3
|
+
import { denormalizeTable } from "../../../table/index.js";
|
|
4
|
+
import { decodeJsonBuffer, encodeJsonBuffer } from "../buffer/index.js";
|
|
5
|
+
// TODO: rebase on sinkJSON when it is available
|
|
6
|
+
// https://github.com/pola-rs/nodejs-polars/issues/353
|
|
7
|
+
export async function saveJsonTable(table, options) {
|
|
8
|
+
const { path, dialect, overwrite, format } = options;
|
|
9
|
+
const isLines = format === "jsonl" || format === "ndjson";
|
|
10
|
+
const schema = options.schema ??
|
|
11
|
+
(await inferSchemaFromTable(table, {
|
|
12
|
+
...options,
|
|
13
|
+
keepStrings: true,
|
|
14
|
+
}));
|
|
15
|
+
table = await denormalizeTable(table, schema, {
|
|
16
|
+
nativeTypes: ["boolean", "integer", "list", "number", "string", "year"],
|
|
17
|
+
});
|
|
18
|
+
// We use polars to serialize the data
|
|
19
|
+
// But encode it manually to support dialects/formatting
|
|
20
|
+
const frame = await table.collect();
|
|
21
|
+
let buffer = frame.writeJSON({ format: isLines ? "lines" : "json" });
|
|
22
|
+
let data = decodeJsonBuffer(buffer, { isLines });
|
|
23
|
+
if (dialect) {
|
|
24
|
+
data = processData(data, dialect);
|
|
25
|
+
}
|
|
26
|
+
buffer = encodeJsonBuffer(data, { isLines });
|
|
27
|
+
await saveFile(path, buffer, { overwrite });
|
|
28
|
+
return path;
|
|
29
|
+
}
|
|
30
|
+
function processData(records, dialect) {
|
|
31
|
+
let data = records;
|
|
32
|
+
if (dialect.itemKeys) {
|
|
33
|
+
const keys = dialect.itemKeys;
|
|
34
|
+
data = data.map((row) => Object.fromEntries(keys.map((key) => [key, row[key]])));
|
|
35
|
+
}
|
|
36
|
+
if (dialect.itemType === "array") {
|
|
37
|
+
const keys = dialect.itemKeys ?? Object.keys(data[0]);
|
|
38
|
+
data = [keys, ...data.map((row) => keys.map((key) => row[key]))];
|
|
39
|
+
}
|
|
40
|
+
if (dialect.property) {
|
|
41
|
+
data = { [dialect.property]: data };
|
|
42
|
+
}
|
|
43
|
+
return data;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BsdWdpbnMvanNvbi90YWJsZS9zYXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUduRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUUxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUV2RSxnREFBZ0Q7QUFDaEQsc0RBQXNEO0FBRXRELE1BQU0sQ0FBQyxLQUFLLFVBQVUsYUFBYSxDQUNqQyxLQUFZLEVBQ1osT0FBb0U7SUFFcEUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQTtJQUNwRCxNQUFNLE9BQU8sR0FBRyxNQUFNLEtBQUssT0FBTyxJQUFJLE1BQU0sS0FBSyxRQUFRLENBQUE7SUFFekQsTUFBTSxNQUFNLEdBQ1YsT0FBTyxDQUFDLE1BQU07UUFDZCxDQUFDLE1BQU0sb0JBQW9CLENBQUMsS0FBSyxFQUFFO1lBQ2pDLEdBQUcsT0FBTztZQUNWLFdBQVcsRUFBRSxJQUFJO1NBQ2xCLENBQUMsQ0FBQyxDQUFBO0lBRUwsS0FBSyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRTtRQUM1QyxXQUFXLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztLQUN4RSxDQUFDLENBQUE7SUFFRixzQ0FBc0M7SUFDdEMsd0RBQXdEO0lBQ3hELE1BQU0sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQ25DLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7SUFDcEUsSUFBSSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtJQUVoRCxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1osSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDbkMsQ0FBQztJQUVELE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQzVDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBRTNDLE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE9BQThCLEVBQUUsT0FBZ0I7SUFDbkUsSUFBSSxJQUFJLEdBQVEsT0FBTyxDQUFBO0lBRXZCLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUE7UUFDN0IsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUMzQixNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDNUQsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDakMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3JELElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM1RSxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDckIsSUFBSSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUE7SUFDckMsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNhdmVGaWxlIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvZGF0YXNldFwiXG5pbXBvcnQgdHlwZSB7IERpYWxlY3QgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IFNhdmVUYWJsZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vcGx1Z2luLnRzXCJcbmltcG9ydCB7IGluZmVyU2NoZW1hRnJvbVRhYmxlIH0gZnJvbSBcIi4uLy4uLy4uL3NjaGVtYS9pbmRleC50c1wiXG5pbXBvcnQgeyBkZW5vcm1hbGl6ZVRhYmxlIH0gZnJvbSBcIi4uLy4uLy4uL3RhYmxlL2luZGV4LnRzXCJcbmltcG9ydCB0eXBlIHsgVGFibGUgfSBmcm9tIFwiLi4vLi4vLi4vdGFibGUvaW5kZXgudHNcIlxuaW1wb3J0IHsgZGVjb2RlSnNvbkJ1ZmZlciwgZW5jb2RlSnNvbkJ1ZmZlciB9IGZyb20gXCIuLi9idWZmZXIvaW5kZXgudHNcIlxuXG4vLyBUT0RPOiByZWJhc2Ugb24gc2lua0pTT04gd2hlbiBpdCBpcyBhdmFpbGFibGVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb2xhLXJzL25vZGVqcy1wb2xhcnMvaXNzdWVzLzM1M1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZUpzb25UYWJsZShcbiAgdGFibGU6IFRhYmxlLFxuICBvcHRpb25zOiBTYXZlVGFibGVPcHRpb25zICYgeyBmb3JtYXQ/OiBcImpzb25cIiB8IFwianNvbmxcIiB8IFwibmRqc29uXCIgfSxcbikge1xuICBjb25zdCB7IHBhdGgsIGRpYWxlY3QsIG92ZXJ3cml0ZSwgZm9ybWF0IH0gPSBvcHRpb25zXG4gIGNvbnN0IGlzTGluZXMgPSBmb3JtYXQgPT09IFwianNvbmxcIiB8fCBmb3JtYXQgPT09IFwibmRqc29uXCJcblxuICBjb25zdCBzY2hlbWEgPVxuICAgIG9wdGlvbnMuc2NoZW1hID8/XG4gICAgKGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAga2VlcFN0cmluZ3M6IHRydWUsXG4gICAgfSkpXG5cbiAgdGFibGUgPSBhd2FpdCBkZW5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEsIHtcbiAgICBuYXRpdmVUeXBlczogW1wiYm9vbGVhblwiLCBcImludGVnZXJcIiwgXCJsaXN0XCIsIFwibnVtYmVyXCIsIFwic3RyaW5nXCIsIFwieWVhclwiXSxcbiAgfSlcblxuICAvLyBXZSB1c2UgcG9sYXJzIHRvIHNlcmlhbGl6ZSB0aGUgZGF0YVxuICAvLyBCdXQgZW5jb2RlIGl0IG1hbnVhbGx5IHRvIHN1cHBvcnQgZGlhbGVjdHMvZm9ybWF0dGluZ1xuICBjb25zdCBmcmFtZSA9IGF3YWl0IHRhYmxlLmNvbGxlY3QoKVxuICBsZXQgYnVmZmVyID0gZnJhbWUud3JpdGVKU09OKHsgZm9ybWF0OiBpc0xpbmVzID8gXCJsaW5lc1wiIDogXCJqc29uXCIgfSlcbiAgbGV0IGRhdGEgPSBkZWNvZGVKc29uQnVmZmVyKGJ1ZmZlciwgeyBpc0xpbmVzIH0pXG5cbiAgaWYgKGRpYWxlY3QpIHtcbiAgICBkYXRhID0gcHJvY2Vzc0RhdGEoZGF0YSwgZGlhbGVjdClcbiAgfVxuXG4gIGJ1ZmZlciA9IGVuY29kZUpzb25CdWZmZXIoZGF0YSwgeyBpc0xpbmVzIH0pXG4gIGF3YWl0IHNhdmVGaWxlKHBhdGgsIGJ1ZmZlciwgeyBvdmVyd3JpdGUgfSlcblxuICByZXR1cm4gcGF0aFxufVxuXG5mdW5jdGlvbiBwcm9jZXNzRGF0YShyZWNvcmRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sIGRpYWxlY3Q6IERpYWxlY3QpIHtcbiAgbGV0IGRhdGE6IGFueSA9IHJlY29yZHNcblxuICBpZiAoZGlhbGVjdC5pdGVtS2V5cykge1xuICAgIGNvbnN0IGtleXMgPSBkaWFsZWN0Lml0ZW1LZXlzXG4gICAgZGF0YSA9IGRhdGEubWFwKChyb3c6IGFueSkgPT5cbiAgICAgIE9iamVjdC5mcm9tRW50cmllcyhrZXlzLm1hcCgoa2V5OiBhbnkpID0+IFtrZXksIHJvd1trZXldXSkpLFxuICAgIClcbiAgfVxuXG4gIGlmIChkaWFsZWN0Lml0ZW1UeXBlID09PSBcImFycmF5XCIpIHtcbiAgICBjb25zdCBrZXlzID0gZGlhbGVjdC5pdGVtS2V5cyA/PyBPYmplY3Qua2V5cyhkYXRhWzBdKVxuICAgIGRhdGEgPSBba2V5cywgLi4uZGF0YS5tYXAoKHJvdzogYW55KSA9PiBrZXlzLm1hcCgoa2V5OiBhbnkpID0+IHJvd1trZXldKSldXG4gIH1cblxuICBpZiAoZGlhbGVjdC5wcm9wZXJ0eSkge1xuICAgIGRhdGEgPSB7IFtkaWFsZWN0LnByb3BlcnR5XTogZGF0YSB9XG4gIH1cblxuICByZXR1cm4gZGF0YVxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { getTempFilePath } from "@frictionless-ts/dataset";
|
|
3
|
+
import * as pl from "nodejs-polars";
|
|
4
|
+
import { describe, expect, it } from "vitest";
|
|
5
|
+
import { loadJsonTable } from "./load.js";
|
|
6
|
+
import { saveJsonTable } from "./save.js";
|
|
7
|
+
const row1 = { id: 1, name: "english" };
|
|
8
|
+
const row2 = { id: 2, name: "中文" };
|
|
9
|
+
const table = pl.readRecords([row1, row2]).lazy();
|
|
10
|
+
describe("saveJsonTable", () => {
|
|
11
|
+
it("should save table to file", async () => {
|
|
12
|
+
const path = getTempFilePath();
|
|
13
|
+
await saveJsonTable(table, { path });
|
|
14
|
+
const content = await readFile(path, "utf-8");
|
|
15
|
+
expect(content).toEqual(JSON.stringify([row1, row2], null, 2));
|
|
16
|
+
});
|
|
17
|
+
it("should handle property", async () => {
|
|
18
|
+
const path = getTempFilePath();
|
|
19
|
+
await saveJsonTable(table, {
|
|
20
|
+
path,
|
|
21
|
+
dialect: { property: "key" },
|
|
22
|
+
});
|
|
23
|
+
const content = await readFile(path, "utf-8");
|
|
24
|
+
expect(content).toEqual(JSON.stringify({ key: [row1, row2] }, null, 2));
|
|
25
|
+
});
|
|
26
|
+
it("should handle item keys", async () => {
|
|
27
|
+
const path = getTempFilePath();
|
|
28
|
+
await saveJsonTable(table, {
|
|
29
|
+
path,
|
|
30
|
+
dialect: { itemKeys: ["name"] },
|
|
31
|
+
});
|
|
32
|
+
const content = await readFile(path, "utf-8");
|
|
33
|
+
expect(content).toEqual(JSON.stringify([{ name: row1.name }, { name: row2.name }], null, 2));
|
|
34
|
+
});
|
|
35
|
+
it("should handle item type (array)", async () => {
|
|
36
|
+
const path = getTempFilePath();
|
|
37
|
+
await saveJsonTable(table, {
|
|
38
|
+
path,
|
|
39
|
+
dialect: { itemType: "array" },
|
|
40
|
+
});
|
|
41
|
+
const content = await readFile(path, "utf-8");
|
|
42
|
+
expect(content).toEqual(JSON.stringify([Object.keys(row1), Object.values(row1), Object.values(row2)], null, 2));
|
|
43
|
+
});
|
|
44
|
+
it("should save and load various data types", async () => {
|
|
45
|
+
const path = getTempFilePath();
|
|
46
|
+
const source = pl
|
|
47
|
+
.DataFrame([
|
|
48
|
+
pl.Series("array", ["[1, 2, 3]"], pl.String),
|
|
49
|
+
pl.Series("boolean", [true], pl.Bool),
|
|
50
|
+
pl.Series("date", [new Date(Date.UTC(2025, 0, 1))], pl.Date),
|
|
51
|
+
pl.Series("datetime", [new Date(Date.UTC(2025, 0, 1))], pl.Datetime),
|
|
52
|
+
pl.Series("duration", ["P23DT23H"], pl.String),
|
|
53
|
+
pl.Series("geojson", ['{"value": 1}'], pl.String),
|
|
54
|
+
pl.Series("geopoint", [[40.0, 50.0]], pl.List(pl.Float32)),
|
|
55
|
+
pl.Series("integer", [1], pl.Int32),
|
|
56
|
+
pl.Series("list", [[1.0, 2.0, 3.0]], pl.List(pl.Float32)),
|
|
57
|
+
pl.Series("number", [1.1], pl.Float64),
|
|
58
|
+
pl.Series("object", ['{"value": 1}']),
|
|
59
|
+
pl.Series("string", ["string"], pl.String),
|
|
60
|
+
pl.Series("time", [new Date(Date.UTC(2025, 0, 1))], pl.Time),
|
|
61
|
+
pl.Series("year", [2025], pl.Int32),
|
|
62
|
+
pl.Series("yearmonth", [[2025, 1]], pl.List(pl.Int16)),
|
|
63
|
+
])
|
|
64
|
+
.lazy();
|
|
65
|
+
await saveJsonTable(source, {
|
|
66
|
+
path,
|
|
67
|
+
fieldTypes: {
|
|
68
|
+
array: "array",
|
|
69
|
+
geojson: "geojson",
|
|
70
|
+
geopoint: "geopoint",
|
|
71
|
+
list: "list",
|
|
72
|
+
object: "object",
|
|
73
|
+
// TODO: Remove time after:
|
|
74
|
+
// https://github.com/pola-rs/nodejs-polars/issues/364
|
|
75
|
+
time: "time",
|
|
76
|
+
year: "year",
|
|
77
|
+
yearmonth: "yearmonth",
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
const target = await loadJsonTable({ path }, { denormalized: true });
|
|
81
|
+
expect((await target.collect()).toRecords()).toEqual([
|
|
82
|
+
{
|
|
83
|
+
array: "[1, 2, 3]",
|
|
84
|
+
boolean: true,
|
|
85
|
+
date: "2025-01-01",
|
|
86
|
+
datetime: "2025-01-01T00:00:00",
|
|
87
|
+
duration: "P23DT23H",
|
|
88
|
+
geojson: '{"value": 1}',
|
|
89
|
+
geopoint: "40.0,50.0",
|
|
90
|
+
integer: 1,
|
|
91
|
+
list: [1.0, 2.0, 3.0],
|
|
92
|
+
number: 1.1,
|
|
93
|
+
object: '{"value": 1}',
|
|
94
|
+
string: "string",
|
|
95
|
+
time: "00:00:00",
|
|
96
|
+
year: 2025,
|
|
97
|
+
yearmonth: "2025-01",
|
|
98
|
+
},
|
|
99
|
+
]);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
describe("saveJsonTable (format=jsonl)", () => {
|
|
103
|
+
it("should save table to file", async () => {
|
|
104
|
+
const path = getTempFilePath();
|
|
105
|
+
await saveJsonTable(table, { path, format: "jsonl" });
|
|
106
|
+
const content = await readFile(path, "utf-8");
|
|
107
|
+
expect(content).toEqual([JSON.stringify(row1), JSON.stringify(row2)].join("\n"));
|
|
108
|
+
});
|
|
109
|
+
it("should handle item keys", async () => {
|
|
110
|
+
const path = getTempFilePath();
|
|
111
|
+
await saveJsonTable(table, {
|
|
112
|
+
path,
|
|
113
|
+
format: "jsonl",
|
|
114
|
+
dialect: { itemKeys: ["name"] },
|
|
115
|
+
});
|
|
116
|
+
const content = await readFile(path, "utf-8");
|
|
117
|
+
expect(content).toEqual([
|
|
118
|
+
JSON.stringify({ name: row1.name }),
|
|
119
|
+
JSON.stringify({ name: row2.name }),
|
|
120
|
+
].join("\n"));
|
|
121
|
+
});
|
|
122
|
+
it("should handle item type (array)", async () => {
|
|
123
|
+
const path = getTempFilePath();
|
|
124
|
+
await saveJsonTable(table, {
|
|
125
|
+
path,
|
|
126
|
+
format: "jsonl",
|
|
127
|
+
dialect: { itemType: "array" },
|
|
128
|
+
});
|
|
129
|
+
const content = await readFile(path, "utf-8");
|
|
130
|
+
expect(content).toEqual([
|
|
131
|
+
JSON.stringify(Object.keys(row1)),
|
|
132
|
+
JSON.stringify(Object.values(row1)),
|
|
133
|
+
JSON.stringify(Object.values(row2)),
|
|
134
|
+
].join("\n"));
|
|
135
|
+
});
|
|
136
|
+
it("should handle item type (object)", async () => {
|
|
137
|
+
const path = getTempFilePath();
|
|
138
|
+
await saveJsonTable(table, {
|
|
139
|
+
path,
|
|
140
|
+
format: "jsonl",
|
|
141
|
+
dialect: { itemType: "object" },
|
|
142
|
+
});
|
|
143
|
+
const content = await readFile(path, "utf-8");
|
|
144
|
+
expect(content).toEqual([JSON.stringify(row1), JSON.stringify(row2)].join("\n"));
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGx1Z2lucy9qc29uL3RhYmxlL3NhdmUuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQzFELE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFekMsTUFBTSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQTtBQUN2QyxNQUFNLElBQUksR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFBO0FBQ2xDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtBQUVqRCxRQUFRLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTtJQUM3QixFQUFFLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDekMsTUFBTSxJQUFJLEdBQUcsZUFBZSxFQUFFLENBQUE7UUFDOUIsTUFBTSxhQUFhLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUVwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDN0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FB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RUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQzVELEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BFLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUM5QyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDakQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFELEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pELEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUN0QyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3JDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUMxQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUks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QUksRUFBRTtRQUNoRCxNQUFNLElBQUksR0FBRyxlQUFlLEVBQUUsQ0FBQTtRQUM5QixNQUFNLGFBQWEsQ0FBQyxLQUFLLEVBQUU7WUFDekIsSUFBSTtZQUNKLE1BQU0sRUFBRSxPQUFPO1lBQ2YsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtTQUNoQyxDQUFDLENBQUE7UUFFRixNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDN0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FDckIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ3hELENBQUE7SUFDSCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgeyBnZXRUZW1wRmlsZVBhdGggfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9kYXRhc2V0XCJcbmltcG9ydCAqIGFzIHBsIGZyb20gXCJub2RlanMtcG9sYXJzXCJcbmltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyBsb2FkSnNvblRhYmxlIH0gZnJvbSBcIi4vbG9hZC50c1wiXG5pbXBvcnQgeyBzYXZlSnNvblRhYmxlIH0gZnJvbSBcIi4vc2F2ZS50c1wiXG5cbmNvbnN0IHJvdzEgPSB7IGlkOiAxLCBuYW1lOiBcImVuZ2xpc2hcIiB9XG5jb25zdCByb3cyID0geyBpZDogMiwgbmFtZTogXCLkuK3mlodcIiB9XG5jb25zdCB0YWJsZSA9IHBsLnJlYWRSZWNvcmRzKFtyb3cxLCByb3cyXSkubGF6eSgpXG5cbmRlc2NyaWJlKFwic2F2ZUpzb25UYWJsZVwiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIHNhdmUgdGFibGUgdG8gZmlsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGdldFRlbXBGaWxlUGF0aCgpXG4gICAgYXdhaXQgc2F2ZUpzb25UYWJsZSh0YWJsZSwgeyBwYXRoIH0pXG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKVxuICAgIGV4cGVjdChjb250ZW50KS50b0VxdWFsKEpTT04uc3RyaW5naWZ5KFtyb3cxLCByb3cyXSwgbnVsbCwgMikpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIHByb3BlcnR5XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gZ2V0VGVtcEZpbGVQYXRoKClcblxuICAgIGF3YWl0IHNhdmVKc29uVGFibGUodGFibGUsIHtcbiAgICAgIHBhdGgsXG4gICAgICBkaWFsZWN0OiB7IHByb3BlcnR5OiBcImtleVwiIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShwYXRoLCBcInV0Zi04XCIpXG4gICAgZXhwZWN0KGNvbnRlbnQpLnRvRXF1YWwoSlNPTi5zdHJpbmdpZnkoeyBrZXk6IFtyb3cxLCByb3cyXSB9LCBudWxsLCAyKSlcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgaXRlbSBrZXlzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gZ2V0VGVtcEZpbGVQYXRoKClcblxuICAgIGF3YWl0IHNhdmVKc29uVGFibGUodGFibGUsIHtcbiAgICAgIHBhdGgsXG4gICAgICBkaWFsZWN0OiB7IGl0ZW1LZXlzOiBbXCJuYW1lXCJdIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShwYXRoLCBcInV0Zi04XCIpXG4gICAgZXhwZWN0KGNvbnRlbnQpLnRvRXF1YWwoXG4gICAgICBKU09OLnN0cmluZ2lmeShbeyBuYW1lOiByb3cxLm5hbWUgfSwgeyBuYW1lOiByb3cyLm5hbWUgfV0sIG51bGwsIDIpLFxuICAgIClcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgaXRlbSB0eXBlIChhcnJheSlcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBnZXRUZW1wRmlsZVBhdGgoKVxuXG4gICAgYXdhaXQgc2F2ZUpzb25UYWJsZSh0YWJsZSwge1xuICAgICAgcGF0aCxcbiAgICAgIGRpYWxlY3Q6IHsgaXRlbVR5cGU6IFwiYXJyYXlcIiB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKVxuICAgIGV4cGVjdChjb250ZW50KS50b0VxdWFsKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIFtPYmplY3Qua2V5cyhyb3cxKSwgT2JqZWN0LnZhbHVlcyhyb3cxKSwgT2JqZWN0LnZhbHVlcyhyb3cyKV0sXG4gICAgICAgIG51bGwsXG4gICAgICAgIDIsXG4gICAgICApLFxuICAgIClcbiAgfSlcblxuICBpdChcInNob3VsZCBzYXZlIGFuZCBsb2FkIHZhcmlvdXMgZGF0YSB0eXBlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGdldFRlbXBGaWxlUGF0aCgpXG5cbiAgICBjb25zdCBzb3VyY2UgPSBwbFxuICAgICAgLkRhdGFGcmFtZShbXG4gICAgICAgIHBsLlNlcmllcyhcImFycmF5XCIsIFtcIlsxLCAyLCAzXVwiXSwgcGwuU3RyaW5nKSxcbiAgICAgICAgcGwuU2VyaWVzKFwiYm9vbGVhblwiLCBbdHJ1ZV0sIHBsLkJvb2wpLFxuICAgICAgICBwbC5TZXJpZXMoXCJkYXRlXCIsIFtuZXcgRGF0ZShEYXRlLlVUQygyMDI1LCAwLCAxKSldLCBwbC5EYXRlKSxcbiAgICAgICAgcGwuU2VyaWVzKFwiZGF0ZXRpbWVcIiwgW25ldyBEYXRlKERhdGUuVVRDKDIwMjUsIDAsIDEpKV0sIHBsLkRhdGV0aW1lKSxcbiAgICAgICAgcGwuU2VyaWVzKFwiZHVyYXRpb25cIiwgW1wiUDIzRFQyM0hcIl0sIHBsLlN0cmluZyksXG4gICAgICAgIHBsLlNlcmllcyhcImdlb2pzb25cIiwgWyd7XCJ2YWx1ZVwiOiAxfSddLCBwbC5TdHJpbmcpLFxuICAgICAgICBwbC5TZXJpZXMoXCJnZW9wb2ludFwiLCBbWzQwLjAsIDUwLjBdXSwgcGwuTGlzdChwbC5GbG9hdDMyKSksXG4gICAgICAgIHBsLlNlcmllcyhcImludGVnZXJcIiwgWzFdLCBwbC5JbnQzMiksXG4gICAgICAgIHBsLlNlcmllcyhcImxpc3RcIiwgW1sxLjAsIDIuMCwgMy4wXV0sIHBsLkxpc3QocGwuRmxvYXQzMikpLFxuICAgICAgICBwbC5TZXJpZXMoXCJudW1iZXJcIiwgWzEuMV0sIHBsLkZsb2F0NjQpLFxuICAgICAgICBwbC5TZXJpZXMoXCJvYmplY3RcIiwgWyd7XCJ2YWx1ZVwiOiAxfSddKSxcbiAgICAgICAgcGwuU2VyaWVzKFwic3RyaW5nXCIsIFtcInN0cmluZ1wiXSwgcGwuU3RyaW5nKSxcbiAgICAgICAgcGwuU2VyaWVzKFwidGltZVwiLCBbbmV3IERhdGUoRGF0ZS5VVEMoMjAyNSwgMCwgMSkpXSwgcGwuVGltZSksXG4gICAgICAgIHBsLlNlcmllcyhcInllYXJcIiwgWzIwMjVdLCBwbC5JbnQzMiksXG4gICAgICAgIHBsLlNlcmllcyhcInllYXJtb250aFwiLCBbWzIwMjUsIDFdXSwgcGwuTGlzdChwbC5JbnQxNikpLFxuICAgICAgXSlcbiAgICAgIC5sYXp5KClcblxuICAgIGF3YWl0IHNhdmVKc29uVGFibGUoc291cmNlLCB7XG4gICAgICBwYXRoLFxuICAgICAgZmllbGRUeXBlczoge1xuICAgICAgICBhcnJheTogXCJhcnJheVwiLFxuICAgICAgICBnZW9qc29uOiBcImdlb2pzb25cIixcbiAgICAgICAgZ2VvcG9pbnQ6IFwiZ2VvcG9pbnRcIixcbiAgICAgICAgbGlzdDogXCJsaXN0XCIsXG4gICAgICAgIG9iamVjdDogXCJvYmplY3RcIixcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRpbWUgYWZ0ZXI6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb2xhLXJzL25vZGVqcy1wb2xhcnMvaXNzdWVzLzM2NFxuICAgICAgICB0aW1lOiBcInRpbWVcIixcbiAgICAgICAgeWVhcjogXCJ5ZWFyXCIsXG4gICAgICAgIHllYXJtb250aDogXCJ5ZWFybW9udGhcIixcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IGxvYWRKc29uVGFibGUoeyBwYXRoIH0sIHsgZGVub3JtYWxpemVkOiB0cnVlIH0pXG4gICAgZXhwZWN0KChhd2FpdCB0YXJnZXQuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIGFycmF5OiBcIlsxLCAyLCAzXVwiLFxuICAgICAgICBib29sZWFuOiB0cnVlLFxuICAgICAgICBkYXRlOiBcIjIwMjUtMDEtMDFcIixcbiAgICAgICAgZGF0ZXRpbWU6IFwiMjAyNS0wMS0wMVQwMDowMDowMFwiLFxuICAgICAgICBkdXJhdGlvbjogXCJQMjNEVDIzSFwiLFxuICAgICAgICBnZW9qc29uOiAne1widmFsdWVcIjogMX0nLFxuICAgICAgICBnZW9wb2ludDogXCI0MC4wLDUwLjBcIixcbiAgICAgICAgaW50ZWdlcjogMSxcbiAgICAgICAgbGlzdDogWzEuMCwgMi4wLCAzLjBdLFxuICAgICAgICBudW1iZXI6IDEuMSxcbiAgICAgICAgb2JqZWN0OiAne1widmFsdWVcIjogMX0nLFxuICAgICAgICBzdHJpbmc6IFwic3RyaW5nXCIsXG4gICAgICAgIHRpbWU6IFwiMDA6MDA6MDBcIixcbiAgICAgICAgeWVhcjogMjAyNSxcbiAgICAgICAgeWVhcm1vbnRoOiBcIjIwMjUtMDFcIixcbiAgICAgIH0sXG4gICAgXSlcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKFwic2F2ZUpzb25UYWJsZSAoZm9ybWF0PWpzb25sKVwiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIHNhdmUgdGFibGUgdG8gZmlsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGdldFRlbXBGaWxlUGF0aCgpXG5cbiAgICBhd2FpdCBzYXZlSnNvblRhYmxlKHRhYmxlLCB7IHBhdGgsIGZvcm1hdDogXCJqc29ubFwiIH0pXG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKVxuICAgIGV4cGVjdChjb250ZW50KS50b0VxdWFsKFxuICAgICAgW0pTT04uc3RyaW5naWZ5KHJvdzEpLCBKU09OLnN0cmluZ2lmeShyb3cyKV0uam9pbihcIlxcblwiKSxcbiAgICApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIGl0ZW0ga2V5c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGdldFRlbXBGaWxlUGF0aCgpXG4gICAgYXdhaXQgc2F2ZUpzb25UYWJsZSh0YWJsZSwge1xuICAgICAgcGF0aCxcbiAgICAgIGZvcm1hdDogXCJqc29ubFwiLFxuICAgICAgZGlhbGVjdDogeyBpdGVtS2V5czogW1wibmFtZVwiXSB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKVxuICAgIGV4cGVjdChjb250ZW50KS50b0VxdWFsKFxuICAgICAgW1xuICAgICAgICBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IHJvdzEubmFtZSB9KSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiByb3cyLm5hbWUgfSksXG4gICAgICBdLmpvaW4oXCJcXG5cIiksXG4gICAgKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBpdGVtIHR5cGUgKGFycmF5KVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGdldFRlbXBGaWxlUGF0aCgpXG4gICAgYXdhaXQgc2F2ZUpzb25UYWJsZSh0YWJsZSwge1xuICAgICAgcGF0aCxcbiAgICAgIGZvcm1hdDogXCJqc29ubFwiLFxuICAgICAgZGlhbGVjdDogeyBpdGVtVHlwZTogXCJhcnJheVwiIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShwYXRoLCBcInV0Zi04XCIpXG4gICAgZXhwZWN0KGNvbnRlbnQpLnRvRXF1YWwoXG4gICAgICBbXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHJvdzEpKSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LnZhbHVlcyhyb3cxKSksXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KE9iamVjdC52YWx1ZXMocm93MikpLFxuICAgICAgXS5qb2luKFwiXFxuXCIpLFxuICAgIClcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgaXRlbSB0eXBlIChvYmplY3QpXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gZ2V0VGVtcEZpbGVQYXRoKClcbiAgICBhd2FpdCBzYXZlSnNvblRhYmxlKHRhYmxlLCB7XG4gICAgICBwYXRoLFxuICAgICAgZm9ybWF0OiBcImpzb25sXCIsXG4gICAgICBkaWFsZWN0OiB7IGl0ZW1UeXBlOiBcIm9iamVjdFwiIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShwYXRoLCBcInV0Zi04XCIpXG4gICAgZXhwZWN0KGNvbnRlbnQpLnRvRXF1YWwoXG4gICAgICBbSlNPTi5zdHJpbmdpZnkocm93MSksIEpTT04uc3RyaW5naWZ5KHJvdzIpXS5qb2luKFwiXFxuXCIpLFxuICAgIClcbiAgfSlcbn0pXG4iXX0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from "./table/index.js";
|
|
2
|
+
export * from "./plugin.js";
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW5zL29kcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFBO0FBQ2hDLGNBQWMsYUFBYSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vdGFibGUvaW5kZXgudHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vcGx1Z2luLnRzXCJcbiJdfQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Resource } from "@frictionless-ts/metadata";
|
|
2
|
+
import type { LoadTableOptions, SaveTableOptions, TablePlugin } from "../../plugin.ts";
|
|
3
|
+
import type { Table } from "../../table/index.ts";
|
|
4
|
+
export declare class OdsPlugin implements TablePlugin {
|
|
5
|
+
loadTable(resource: Partial<Resource>, options?: LoadTableOptions): Promise<import("nodejs-polars").LazyDataFrame<any> | undefined>;
|
|
6
|
+
saveTable(table: Table, options: SaveTableOptions): Promise<string | undefined>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { inferFormat } from "@frictionless-ts/metadata";
|
|
2
|
+
import { loadOdsTable } from "./table/index.js";
|
|
3
|
+
import { saveOdsTable } from "./table/index.js";
|
|
4
|
+
export class OdsPlugin {
|
|
5
|
+
async loadTable(resource, options) {
|
|
6
|
+
const isOds = getIsOds(resource);
|
|
7
|
+
if (!isOds)
|
|
8
|
+
return undefined;
|
|
9
|
+
return await loadOdsTable(resource, options);
|
|
10
|
+
}
|
|
11
|
+
async saveTable(table, options) {
|
|
12
|
+
const { path, format } = options;
|
|
13
|
+
const isOds = getIsOds({ path, format });
|
|
14
|
+
if (!isOds)
|
|
15
|
+
return undefined;
|
|
16
|
+
return await saveOdsTable(table, options);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function getIsOds(resource) {
|
|
20
|
+
const format = inferFormat(resource);
|
|
21
|
+
return ["ods"].includes(format ?? "");
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2lucy9vZHMvcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQU92RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRS9DLE1BQU0sT0FBTyxTQUFTO0lBQ3BCLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBMkIsRUFBRSxPQUEwQjtRQUNyRSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDaEMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUU1QixPQUFPLE1BQU0sWUFBWSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFZLEVBQUUsT0FBeUI7UUFDckQsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUE7UUFFaEMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDeEMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUU1QixPQUFPLE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUMzQyxDQUFDO0NBQ0Y7QUFFRCxTQUFTLFFBQVEsQ0FBQyxRQUEyQjtJQUMzQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDcEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUE7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVzb3VyY2UgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgeyBpbmZlckZvcm1hdCB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHtcbiAgTG9hZFRhYmxlT3B0aW9ucyxcbiAgU2F2ZVRhYmxlT3B0aW9ucyxcbiAgVGFibGVQbHVnaW4sXG59IGZyb20gXCIuLi8uLi9wbHVnaW4udHNcIlxuaW1wb3J0IHR5cGUgeyBUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS9pbmRleC50c1wiXG5pbXBvcnQgeyBsb2FkT2RzVGFibGUgfSBmcm9tIFwiLi90YWJsZS9pbmRleC50c1wiXG5pbXBvcnQgeyBzYXZlT2RzVGFibGUgfSBmcm9tIFwiLi90YWJsZS9pbmRleC50c1wiXG5cbmV4cG9ydCBjbGFzcyBPZHNQbHVnaW4gaW1wbGVtZW50cyBUYWJsZVBsdWdpbiB7XG4gIGFzeW5jIGxvYWRUYWJsZShyZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4sIG9wdGlvbnM/OiBMb2FkVGFibGVPcHRpb25zKSB7XG4gICAgY29uc3QgaXNPZHMgPSBnZXRJc09kcyhyZXNvdXJjZSlcbiAgICBpZiAoIWlzT2RzKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICByZXR1cm4gYXdhaXQgbG9hZE9kc1RhYmxlKHJlc291cmNlLCBvcHRpb25zKVxuICB9XG5cbiAgYXN5bmMgc2F2ZVRhYmxlKHRhYmxlOiBUYWJsZSwgb3B0aW9uczogU2F2ZVRhYmxlT3B0aW9ucykge1xuICAgIGNvbnN0IHsgcGF0aCwgZm9ybWF0IH0gPSBvcHRpb25zXG5cbiAgICBjb25zdCBpc09kcyA9IGdldElzT2RzKHsgcGF0aCwgZm9ybWF0IH0pXG4gICAgaWYgKCFpc09kcykgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIGF3YWl0IHNhdmVPZHNUYWJsZSh0YWJsZSwgb3B0aW9ucylcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRJc09kcyhyZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4pIHtcbiAgY29uc3QgZm9ybWF0ID0gaW5mZXJGb3JtYXQocmVzb3VyY2UpXG4gIHJldHVybiBbXCJvZHNcIl0uaW5jbHVkZXMoZm9ybWF0ID8/IFwiXCIpXG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|