@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,293 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
import { writeTempFile } from "@frictionless-ts/dataset";
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import { useRecording } from "vitest-polly";
|
|
5
|
+
import { loadCsvTable } from "./load.js";
|
|
6
|
+
useRecording();
|
|
7
|
+
describe("loadCsvTable", () => {
|
|
8
|
+
it("should load local file", async () => {
|
|
9
|
+
const path = await writeTempFile("id,name\n1,english\n2,中文");
|
|
10
|
+
const table = await loadCsvTable({ path });
|
|
11
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
12
|
+
{ id: 1, name: "english" },
|
|
13
|
+
{ id: 2, name: "中文" },
|
|
14
|
+
]);
|
|
15
|
+
});
|
|
16
|
+
it("should load local file (multipart)", async () => {
|
|
17
|
+
const path1 = await writeTempFile("id,name\n1,english");
|
|
18
|
+
const path2 = await writeTempFile("id,name\n2,中文\n3,german");
|
|
19
|
+
const table = await loadCsvTable({ path: [path1, path2] });
|
|
20
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
21
|
+
{ id: 1, name: "english" },
|
|
22
|
+
{ id: 2, name: "中文" },
|
|
23
|
+
{ id: 3, name: "german" },
|
|
24
|
+
]);
|
|
25
|
+
});
|
|
26
|
+
it.fails("should load remote file", async () => {
|
|
27
|
+
const table = await loadCsvTable({
|
|
28
|
+
path: "https://raw.githubusercontent.com/datisthq/dpkit/refs/heads/main/csv/table/fixtures/table.csv",
|
|
29
|
+
});
|
|
30
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
31
|
+
{ id: 1, name: "english" },
|
|
32
|
+
{ id: 2, name: "中文" },
|
|
33
|
+
]);
|
|
34
|
+
});
|
|
35
|
+
it.fails("should load remote file (multipart)", async () => {
|
|
36
|
+
const table = await loadCsvTable({
|
|
37
|
+
path: [
|
|
38
|
+
"https://raw.githubusercontent.com/datisthq/dpkit/refs/heads/main/csv/table/fixtures/table.csv",
|
|
39
|
+
"https://raw.githubusercontent.com/datisthq/dpkit/refs/heads/main/csv/table/fixtures/table.csv",
|
|
40
|
+
],
|
|
41
|
+
});
|
|
42
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
43
|
+
{ id: 1, name: "english" },
|
|
44
|
+
{ id: 2, name: "中文" },
|
|
45
|
+
{ id: 1, name: "english" },
|
|
46
|
+
{ id: 2, name: "中文" },
|
|
47
|
+
]);
|
|
48
|
+
});
|
|
49
|
+
it("should handle windows line terminator by default", async () => {
|
|
50
|
+
const path = await writeTempFile("id,name\r\n1,english\r\n2,中文");
|
|
51
|
+
const table = await loadCsvTable({ path });
|
|
52
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
53
|
+
{ id: 1, name: "english" },
|
|
54
|
+
{ id: 2, name: "中文" },
|
|
55
|
+
]);
|
|
56
|
+
});
|
|
57
|
+
it("should handle custom delimiter", async () => {
|
|
58
|
+
const path = await writeTempFile("id|name\n1|alice\n2|bob");
|
|
59
|
+
const table = await loadCsvTable({
|
|
60
|
+
path,
|
|
61
|
+
dialect: { delimiter: "|" },
|
|
62
|
+
});
|
|
63
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
64
|
+
{ id: 1, name: "alice" },
|
|
65
|
+
{ id: 2, name: "bob" },
|
|
66
|
+
]);
|
|
67
|
+
});
|
|
68
|
+
it("should handle files without header", async () => {
|
|
69
|
+
const path = await writeTempFile("1,alice\n2,bob");
|
|
70
|
+
const table = await loadCsvTable({
|
|
71
|
+
path,
|
|
72
|
+
dialect: { header: false },
|
|
73
|
+
});
|
|
74
|
+
const records = (await table.collect()).toRecords();
|
|
75
|
+
expect(records).toEqual([
|
|
76
|
+
{ field1: 1, field2: "alice" },
|
|
77
|
+
{ field1: 2, field2: "bob" },
|
|
78
|
+
]);
|
|
79
|
+
});
|
|
80
|
+
it("should handle custom line terminator", async () => {
|
|
81
|
+
const path = await writeTempFile("id,name|1,alice|2,bob");
|
|
82
|
+
const table = await loadCsvTable({
|
|
83
|
+
path,
|
|
84
|
+
dialect: { lineTerminator: "|" },
|
|
85
|
+
});
|
|
86
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
87
|
+
{ id: 1, name: "alice" },
|
|
88
|
+
{ id: 2, name: "bob" },
|
|
89
|
+
]);
|
|
90
|
+
});
|
|
91
|
+
it.skip("should handle escape char", async () => {
|
|
92
|
+
const path = await writeTempFile("id,name\n1,apple|,fruits\n2,orange|,fruits");
|
|
93
|
+
const table = await loadCsvTable({
|
|
94
|
+
path,
|
|
95
|
+
dialect: { escapeChar: "|" },
|
|
96
|
+
});
|
|
97
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
98
|
+
{ id: 1, name: "apple,fruits" },
|
|
99
|
+
{ id: 2, name: "orange,fruits" },
|
|
100
|
+
]);
|
|
101
|
+
});
|
|
102
|
+
it("should handle custom quote character", async () => {
|
|
103
|
+
const path = await writeTempFile("id,name\n1,'alice smith'\n2,'bob jones'");
|
|
104
|
+
const table = await loadCsvTable({
|
|
105
|
+
path,
|
|
106
|
+
dialect: { quoteChar: "'" },
|
|
107
|
+
});
|
|
108
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
109
|
+
{ id: 1, name: "alice smith" },
|
|
110
|
+
{ id: 2, name: "bob jones" },
|
|
111
|
+
]);
|
|
112
|
+
});
|
|
113
|
+
it("should handle double quote by default", async () => {
|
|
114
|
+
const path = await writeTempFile('id,name\n1,"alice""smith"\n2,"bob""jones"');
|
|
115
|
+
const table = await loadCsvTable({
|
|
116
|
+
path,
|
|
117
|
+
dialect: { doubleQuote: true },
|
|
118
|
+
});
|
|
119
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
120
|
+
{ id: 1, name: 'alice"smith' },
|
|
121
|
+
{ id: 2, name: 'bob"jones' },
|
|
122
|
+
]);
|
|
123
|
+
});
|
|
124
|
+
it.skip("should handle disabling double quote", async () => {
|
|
125
|
+
const path = await writeTempFile('id,name\n1,"alice""smith"\n2,"bob""jones"');
|
|
126
|
+
const table = await loadCsvTable({
|
|
127
|
+
path,
|
|
128
|
+
dialect: { doubleQuote: false },
|
|
129
|
+
});
|
|
130
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
131
|
+
{ id: 1, name: "alicesmith" },
|
|
132
|
+
{ id: 2, name: "bobjones" },
|
|
133
|
+
]);
|
|
134
|
+
});
|
|
135
|
+
it("should handle comment character", async () => {
|
|
136
|
+
const path = await writeTempFile("# This is a comment\nid,name\n1,alice\n# Another comment\n2,bob");
|
|
137
|
+
const table = await loadCsvTable({
|
|
138
|
+
path,
|
|
139
|
+
dialect: { commentChar: "#" },
|
|
140
|
+
});
|
|
141
|
+
const records = (await table.collect()).toRecords();
|
|
142
|
+
expect(records).toEqual([
|
|
143
|
+
{ id: 1, name: "alice" },
|
|
144
|
+
{ id: 2, name: "bob" },
|
|
145
|
+
]);
|
|
146
|
+
});
|
|
147
|
+
it("should support headerRows", async () => {
|
|
148
|
+
const path = await writeTempFile("#comment\nid,name\n1,alice\n2,bob");
|
|
149
|
+
const table = await loadCsvTable({
|
|
150
|
+
path,
|
|
151
|
+
dialect: { headerRows: [2] },
|
|
152
|
+
});
|
|
153
|
+
const records = (await table.collect()).toRecords();
|
|
154
|
+
expect(records).toEqual([
|
|
155
|
+
{ id: 1, name: "alice" },
|
|
156
|
+
{ id: 2, name: "bob" },
|
|
157
|
+
]);
|
|
158
|
+
});
|
|
159
|
+
it("should support headerJoin", async () => {
|
|
160
|
+
const path = await writeTempFile("#comment\nid,name\nint,str\n1,alice\n2,bob");
|
|
161
|
+
const table = await loadCsvTable({
|
|
162
|
+
path,
|
|
163
|
+
dialect: { headerRows: [2, 3], headerJoin: "_" },
|
|
164
|
+
});
|
|
165
|
+
const records = (await table.collect()).toRecords();
|
|
166
|
+
expect(records).toEqual([
|
|
167
|
+
{ id_int: 1, name_str: "alice" },
|
|
168
|
+
{ id_int: 2, name_str: "bob" },
|
|
169
|
+
]);
|
|
170
|
+
});
|
|
171
|
+
it("should support commentRows", async () => {
|
|
172
|
+
const path = await writeTempFile("id,name\n1,alice\ncomment\n2,bob");
|
|
173
|
+
const table = await loadCsvTable({
|
|
174
|
+
path,
|
|
175
|
+
dialect: { commentRows: [3] },
|
|
176
|
+
});
|
|
177
|
+
const records = (await table.collect()).toRecords();
|
|
178
|
+
expect(records).toEqual([
|
|
179
|
+
{ id: 1, name: "alice" },
|
|
180
|
+
{ id: 2, name: "bob" },
|
|
181
|
+
]);
|
|
182
|
+
});
|
|
183
|
+
it("should support headerRows and commentRows", async () => {
|
|
184
|
+
const path = await writeTempFile("#comment\nid,name\n1,alice\n#comment\n2,bob");
|
|
185
|
+
const table = await loadCsvTable({
|
|
186
|
+
path,
|
|
187
|
+
dialect: { headerRows: [2], commentRows: [4] },
|
|
188
|
+
});
|
|
189
|
+
const records = (await table.collect()).toRecords();
|
|
190
|
+
expect(records).toEqual([
|
|
191
|
+
{ id: 1, name: "alice" },
|
|
192
|
+
{ id: 2, name: "bob" },
|
|
193
|
+
]);
|
|
194
|
+
});
|
|
195
|
+
it("should support headerJoin and commentRows", async () => {
|
|
196
|
+
const path = await writeTempFile("#comment\nid,name\nint,str\n1,alice\n#comment\n2,bob");
|
|
197
|
+
const table = await loadCsvTable({
|
|
198
|
+
path,
|
|
199
|
+
dialect: { headerRows: [2, 3], headerJoin: "_", commentRows: [5] },
|
|
200
|
+
});
|
|
201
|
+
const records = (await table.collect()).toRecords();
|
|
202
|
+
expect(records).toEqual([
|
|
203
|
+
{ id_int: 1, name_str: "alice" },
|
|
204
|
+
{ id_int: 2, name_str: "bob" },
|
|
205
|
+
]);
|
|
206
|
+
});
|
|
207
|
+
it("should handle null sequence", async () => {
|
|
208
|
+
const path = await writeTempFile("id,name,age\n1,alice,25\n2,N/A,30\n3,bob,N/A");
|
|
209
|
+
const table = await loadCsvTable({
|
|
210
|
+
path,
|
|
211
|
+
dialect: { nullSequence: "N/A" },
|
|
212
|
+
});
|
|
213
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
214
|
+
{ id: 1, name: "alice", age: 25 },
|
|
215
|
+
{ id: 2, name: null, age: 30 },
|
|
216
|
+
{ id: 3, name: "bob", age: null },
|
|
217
|
+
]);
|
|
218
|
+
});
|
|
219
|
+
it("should handle skip initial space", async () => {
|
|
220
|
+
const path = await writeTempFile("id,name,category\n1, alice, fruits\n2, bob, vegetables\n3,charlie,grains");
|
|
221
|
+
const table = await loadCsvTable({
|
|
222
|
+
path,
|
|
223
|
+
dialect: { skipInitialSpace: true },
|
|
224
|
+
});
|
|
225
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
226
|
+
{ id: 1, name: "alice", category: "fruits" },
|
|
227
|
+
{ id: 2, name: "bob", category: "vegetables" },
|
|
228
|
+
{ id: 3, name: "charlie", category: "grains" },
|
|
229
|
+
]);
|
|
230
|
+
});
|
|
231
|
+
it("should handle multiple dialect options together", async () => {
|
|
232
|
+
const path = await writeTempFile("#comment\nid|'full name'|age\n1|'alice smith'|25\n2|'bob jones'|30");
|
|
233
|
+
const table = await loadCsvTable({
|
|
234
|
+
path,
|
|
235
|
+
dialect: {
|
|
236
|
+
delimiter: "|",
|
|
237
|
+
quoteChar: "'",
|
|
238
|
+
commentChar: "#",
|
|
239
|
+
header: true,
|
|
240
|
+
},
|
|
241
|
+
});
|
|
242
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
243
|
+
{ id: 1, "full name": "alice smith", age: 25 },
|
|
244
|
+
{ id: 2, "full name": "bob jones", age: 30 },
|
|
245
|
+
]);
|
|
246
|
+
});
|
|
247
|
+
it("should handle utf8 encoding", async () => {
|
|
248
|
+
const path = await writeTempFile(Buffer.from("id,name\n1,café\n2,naïve", "utf8"));
|
|
249
|
+
const table = await loadCsvTable({
|
|
250
|
+
path,
|
|
251
|
+
encoding: "utf8",
|
|
252
|
+
});
|
|
253
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
254
|
+
{ id: 1, name: "café" },
|
|
255
|
+
{ id: 2, name: "naïve" },
|
|
256
|
+
]);
|
|
257
|
+
});
|
|
258
|
+
// TODO: currently not supported by nodejs-polars
|
|
259
|
+
it.skip("should handle utf16 encoding", async () => {
|
|
260
|
+
const path = await writeTempFile(Buffer.from("id,name\n1,café\n2,naïve", "utf16le"));
|
|
261
|
+
const table = await loadCsvTable({
|
|
262
|
+
path,
|
|
263
|
+
encoding: "utf16",
|
|
264
|
+
});
|
|
265
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
266
|
+
{ id: 1, name: "café" },
|
|
267
|
+
{ id: 2, name: "naïve" },
|
|
268
|
+
]);
|
|
269
|
+
});
|
|
270
|
+
// TODO: currently not supported by nodejs-polars
|
|
271
|
+
it.skip("should handle latin1 encoding", async () => {
|
|
272
|
+
const path = await writeTempFile(Buffer.from("id,name\n1,café\n2,résumé", "latin1"));
|
|
273
|
+
const table = await loadCsvTable({
|
|
274
|
+
path,
|
|
275
|
+
encoding: "latin1",
|
|
276
|
+
});
|
|
277
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
278
|
+
{ id: 1, name: "café" },
|
|
279
|
+
{ id: 2, name: "résumé" },
|
|
280
|
+
]);
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
describe("loadCsvTable (format=tsv)", () => {
|
|
284
|
+
it("should load local file", async () => {
|
|
285
|
+
const path = await writeTempFile("id\tname\n1\tenglish\n2\t中文");
|
|
286
|
+
const table = await loadCsvTable({ path, format: "tsv" });
|
|
287
|
+
expect((await table.collect()).toRecords()).toEqual([
|
|
288
|
+
{ id: 1, name: "english" },
|
|
289
|
+
{ id: 2, name: "中文" },
|
|
290
|
+
]);
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGx1Z2lucy9jc3YvdGFibGUvbG9hZC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDcEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ3hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFeEMsWUFBWSxFQUFFLENBQUE7QUFFZCxRQUFRLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtJQUM1QixFQUFFLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxhQUFhLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtRQUM1RCxNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7UUFFMUMsTUFBTSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUNsRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtZQUMxQixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtTQUN0QixDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNsRCxNQUFNLEtBQUssR0FBRyxNQUFNLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBQ3ZELE1BQU0s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QUFFLElBQUksRUFBRSxTQUFTLEVBQUU7WUFDMUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7U0FDdEIsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJub2RlOmJ1ZmZlclwiXG5pbXBvcnQgeyB3cml0ZVRlbXBGaWxlIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvZGF0YXNldFwiXG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHsgdXNlUmVjb3JkaW5nIH0gZnJvbSBcInZpdGVzdC1wb2xseVwiXG5pbXBvcnQgeyBsb2FkQ3N2VGFibGUgfSBmcm9tIFwiLi9sb2FkLnRzXCJcblxudXNlUmVjb3JkaW5nKClcblxuZGVzY3JpYmUoXCJsb2FkQ3N2VGFibGVcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBsb2FkIGxvY2FsIGZpbGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZVxcbjEsZW5nbGlzaFxcbjIs5Lit5paHXCIpXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkQ3N2VGFibGUoeyBwYXRoIH0pXG5cbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGxvYWQgbG9jYWwgZmlsZSAobXVsdGlwYXJ0KVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aDEgPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZVxcbjEsZW5nbGlzaFwiKVxuICAgIGNvbnN0IHBhdGgyID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4yLOS4reaWh1xcbjMsZ2VybWFuXCIpXG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7IHBhdGg6IFtwYXRoMSwgcGF0aDJdIH0pXG5cbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICAgIHsgaWQ6IDMsIG5hbWU6IFwiZ2VybWFuXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0LmZhaWxzKFwic2hvdWxkIGxvYWQgcmVtb3RlIGZpbGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZENzdlRhYmxlKHtcbiAgICAgIHBhdGg6IFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2RhdGlzdGhxL2Rwa2l0L3JlZnMvaGVhZHMvbWFpbi9jc3YvdGFibGUvZml4dHVyZXMvdGFibGUuY3N2XCIsXG4gICAgfSlcblxuICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICB7IGlkOiAxLCBuYW1lOiBcImVuZ2xpc2hcIiB9LFxuICAgICAgeyBpZDogMiwgbmFtZTogXCLkuK3mlodcIiB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQuZmFpbHMoXCJzaG91bGQgbG9hZCByZW1vdGUgZmlsZSAobXVsdGlwYXJ0KVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkQ3N2VGFibGUoe1xuICAgICAgcGF0aDogW1xuICAgICAgICBcImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kYXRpc3RocS9kcGtpdC9yZWZzL2hlYWRzL21haW4vY3N2L3RhYmxlL2ZpeHR1cmVzL3RhYmxlLmNzdlwiLFxuICAgICAgICBcImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kYXRpc3RocS9kcGtpdC9yZWZzL2hlYWRzL21haW4vY3N2L3RhYmxlL2ZpeHR1cmVzL3RhYmxlLmNzdlwiLFxuICAgICAgXSxcbiAgICB9KVxuXG4gICAgZXhwZWN0KChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiZW5nbGlzaFwiIH0sXG4gICAgICB7IGlkOiAyLCBuYW1lOiBcIuS4reaWh1wiIH0sXG4gICAgICB7IGlkOiAxLCBuYW1lOiBcImVuZ2xpc2hcIiB9LFxuICAgICAgeyBpZDogMiwgbmFtZTogXCLkuK3mlodcIiB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIHdpbmRvd3MgbGluZSB0ZXJtaW5hdG9yIGJ5IGRlZmF1bHRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZVxcclxcbjEsZW5nbGlzaFxcclxcbjIs5Lit5paHXCIpXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkQ3N2VGFibGUoeyBwYXRoIH0pXG5cbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBjdXN0b20gZGVsaW1pdGVyXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkfG5hbWVcXG4xfGFsaWNlXFxuMnxib2JcIilcbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBkZWxpbWl0ZXI6IFwifFwiIH0sXG4gICAgfSlcblxuICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICB7IGlkOiAxLCBuYW1lOiBcImFsaWNlXCIgfSxcbiAgICAgIHsgaWQ6IDIsIG5hbWU6IFwiYm9iXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBmaWxlcyB3aXRob3V0IGhlYWRlclwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCIxLGFsaWNlXFxuMixib2JcIilcbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBoZWFkZXI6IGZhbHNlIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IHJlY29yZHMgPSAoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKVxuICAgIGV4cGVjdChyZWNvcmRzKS50b0VxdWFsKFtcbiAgICAgIHsgZmllbGQxOiAxLCBmaWVsZDI6IFwiYWxpY2VcIiB9LFxuICAgICAgeyBmaWVsZDE6IDIsIGZpZWxkMjogXCJib2JcIiB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIGN1c3RvbSBsaW5lIHRlcm1pbmF0b3JcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZXwxLGFsaWNlfDIsYm9iXCIpXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkQ3N2VGFibGUoe1xuICAgICAgcGF0aCxcbiAgICAgIGRpYWxlY3Q6IHsgbGluZVRlcm1pbmF0b3I6IFwifFwiIH0sXG4gICAgfSlcblxuICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICB7IGlkOiAxLCBuYW1lOiBcImFsaWNlXCIgfSxcbiAgICAgIHsgaWQ6IDIsIG5hbWU6IFwiYm9iXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0LnNraXAoXCJzaG91bGQgaGFuZGxlIGVzY2FwZSBjaGFyXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcbiAgICAgIFwiaWQsbmFtZVxcbjEsYXBwbGV8LGZydWl0c1xcbjIsb3JhbmdlfCxmcnVpdHNcIixcbiAgICApXG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBlc2NhcGVDaGFyOiBcInxcIiB9LFxuICAgIH0pXG5cbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogXCJhcHBsZSxmcnVpdHNcIiB9LFxuICAgICAgeyBpZDogMiwgbmFtZTogXCJvcmFuZ2UsZnJ1aXRzXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBjdXN0b20gcXVvdGUgY2hhcmFjdGVyXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4xLCdhbGljZSBzbWl0aCdcXG4yLCdib2Igam9uZXMnXCIpXG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBxdW90ZUNoYXI6IFwiJ1wiIH0sXG4gICAgfSlcblxuICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICB7IGlkOiAxLCBuYW1lOiBcImFsaWNlIHNtaXRoXCIgfSxcbiAgICAgIHsgaWQ6IDIsIG5hbWU6IFwiYm9iIGpvbmVzXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBkb3VibGUgcXVvdGUgYnkgZGVmYXVsdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXG4gICAgICAnaWQsbmFtZVxcbjEsXCJhbGljZVwiXCJzbWl0aFwiXFxuMixcImJvYlwiXCJqb25lc1wiJyxcbiAgICApXG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBkb3VibGVRdW90ZTogdHJ1ZSB9LFxuICAgIH0pXG5cbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogJ2FsaWNlXCJzbWl0aCcgfSxcbiAgICAgIHsgaWQ6IDIsIG5hbWU6ICdib2JcImpvbmVzJyB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQuc2tpcChcInNob3VsZCBoYW5kbGUgZGlzYWJsaW5nIGRvdWJsZSBxdW90ZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXG4gICAgICAnaWQsbmFtZVxcbjEsXCJhbGljZVwiXCJzbWl0aFwiXFxuMixcImJvYlwiXCJqb25lc1wiJyxcbiAgICApXG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBkb3VibGVRdW90ZTogZmFsc2UgfSxcbiAgICB9KVxuXG4gICAgZXhwZWN0KChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiYWxpY2VzbWl0aFwiIH0sXG4gICAgICB7IGlkOiAyLCBuYW1lOiBcImJvYmpvbmVzXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBjb21tZW50IGNoYXJhY3RlclwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXG4gICAgICBcIiMgVGhpcyBpcyBhIGNvbW1lbnRcXG5pZCxuYW1lXFxuMSxhbGljZVxcbiMgQW5vdGhlciBjb21tZW50XFxuMixib2JcIixcbiAgICApXG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBjb21tZW50Q2hhcjogXCIjXCIgfSxcbiAgICB9KVxuXG4gICAgY29uc3QgcmVjb3JkcyA9IChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpXG4gICAgZXhwZWN0KHJlY29yZHMpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogXCJhbGljZVwiIH0sXG4gICAgICB7IGlkOiAyLCBuYW1lOiBcImJvYlwiIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBzdXBwb3J0IGhlYWRlclJvd3NcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiI2NvbW1lbnRcXG5pZCxuYW1lXFxuMSxhbGljZVxcbjIsYm9iXCIpXG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBoZWFkZXJSb3dzOiBbMl0gfSxcbiAgICB9KVxuXG4gICAgY29uc3QgcmVjb3JkcyA9IChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpXG4gICAgZXhwZWN0KHJlY29yZHMpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogXCJhbGljZVwiIH0sXG4gICAgICB7IGlkOiAyLCBuYW1lOiBcImJvYlwiIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBzdXBwb3J0IGhlYWRlckpvaW5cIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFxuICAgICAgXCIjY29tbWVudFxcbmlkLG5hbWVcXG5pbnQsc3RyXFxuMSxhbGljZVxcbjIsYm9iXCIsXG4gICAgKVxuXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkQ3N2VGFibGUoe1xuICAgICAgcGF0aCxcbiAgICAgIGRpYWxlY3Q6IHsgaGVhZGVyUm93czogWzIsIDNdLCBoZWFkZXJKb2luOiBcIl9cIiB9LFxuICAgIH0pXG5cbiAgICBjb25zdCByZWNvcmRzID0gKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKClcbiAgICBleHBlY3QocmVjb3JkcykudG9FcXVhbChbXG4gICAgICB7IGlkX2ludDogMSwgbmFtZV9zdHI6IFwiYWxpY2VcIiB9LFxuICAgICAgeyBpZF9pbnQ6IDIsIG5hbWVfc3RyOiBcImJvYlwiIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBzdXBwb3J0IGNvbW1lbnRSb3dzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4xLGFsaWNlXFxuY29tbWVudFxcbjIsYm9iXCIpXG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBjb21tZW50Um93czogWzNdIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IHJlY29yZHMgPSAoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKVxuICAgIGV4cGVjdChyZWNvcmRzKS50b0VxdWFsKFtcbiAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiYWxpY2VcIiB9LFxuICAgICAgeyBpZDogMiwgbmFtZTogXCJib2JcIiB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc3VwcG9ydCBoZWFkZXJSb3dzIGFuZCBjb21tZW50Um93c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXG4gICAgICBcIiNjb21tZW50XFxuaWQsbmFtZVxcbjEsYWxpY2VcXG4jY29tbWVudFxcbjIsYm9iXCIsXG4gICAgKVxuXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkQ3N2VGFibGUoe1xuICAgICAgcGF0aCxcbiAgICAgIGRpYWxlY3Q6IHsgaGVhZGVyUm93czogWzJdLCBjb21tZW50Um93czogWzRdIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IHJlY29yZHMgPSAoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKVxuICAgIGV4cGVjdChyZWNvcmRzKS50b0VxdWFsKFtcbiAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiYWxpY2VcIiB9LFxuICAgICAgeyBpZDogMiwgbmFtZTogXCJib2JcIiB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc3VwcG9ydCBoZWFkZXJKb2luIGFuZCBjb21tZW50Um93c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXG4gICAgICBcIiNjb21tZW50XFxuaWQsbmFtZVxcbmludCxzdHJcXG4xLGFsaWNlXFxuI2NvbW1lbnRcXG4yLGJvYlwiLFxuICAgIClcblxuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZENzdlRhYmxlKHtcbiAgICAgIHBhdGgsXG4gICAgICBkaWFsZWN0OiB7IGhlYWRlclJvd3M6IFsyLCAzXSwgaGVhZGVySm9pbjogXCJfXCIsIGNvbW1lbnRSb3dzOiBbNV0gfSxcbiAgICB9KVxuXG4gICAgY29uc3QgcmVjb3JkcyA9IChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpXG4gICAgZXhwZWN0KHJlY29yZHMpLnRvRXF1YWwoW1xuICAgICAgeyBpZF9pbnQ6IDEsIG5hbWVfc3RyOiBcImFsaWNlXCIgfSxcbiAgICAgIHsgaWRfaW50OiAyLCBuYW1lX3N0cjogXCJib2JcIiB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIG51bGwgc2VxdWVuY2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFxuICAgICAgXCJpZCxuYW1lLGFnZVxcbjEsYWxpY2UsMjVcXG4yLE4vQSwzMFxcbjMsYm9iLE4vQVwiLFxuICAgIClcbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBudWxsU2VxdWVuY2U6IFwiTi9BXCIgfSxcbiAgICB9KVxuXG4gICAgZXhwZWN0KChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiYWxpY2VcIiwgYWdlOiAyNSB9LFxuICAgICAgeyBpZDogMiwgbmFtZTogbnVsbCwgYWdlOiAzMCB9LFxuICAgICAgeyBpZDogMywgbmFtZTogXCJib2JcIiwgYWdlOiBudWxsIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgc2tpcCBpbml0aWFsIHNwYWNlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcbiAgICAgIFwiaWQsbmFtZSxjYXRlZ29yeVxcbjEsIGFsaWNlLCBmcnVpdHNcXG4yLCAgYm9iLCAgdmVnZXRhYmxlc1xcbjMsY2hhcmxpZSxncmFpbnNcIixcbiAgICApXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkQ3N2VGFibGUoe1xuICAgICAgcGF0aCxcbiAgICAgIGRpYWxlY3Q6IHsgc2tpcEluaXRpYWxTcGFjZTogdHJ1ZSB9LFxuICAgIH0pXG5cbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogXCJhbGljZVwiLCBjYXRlZ29yeTogXCJmcnVpdHNcIiB9LFxuICAgICAgeyBpZDogMiwgbmFtZTogXCJib2JcIiwgY2F0ZWdvcnk6IFwidmVnZXRhYmxlc1wiIH0sXG4gICAgICB7IGlkOiAzLCBuYW1lOiBcImNoYXJsaWVcIiwgY2F0ZWdvcnk6IFwiZ3JhaW5zXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBtdWx0aXBsZSBkaWFsZWN0IG9wdGlvbnMgdG9nZXRoZXJcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFxuICAgICAgXCIjY29tbWVudFxcbmlkfCdmdWxsIG5hbWUnfGFnZVxcbjF8J2FsaWNlIHNtaXRoJ3wyNVxcbjJ8J2JvYiBqb25lcyd8MzBcIixcbiAgICApXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkQ3N2VGFibGUoe1xuICAgICAgcGF0aCxcbiAgICAgIGRpYWxlY3Q6IHtcbiAgICAgICAgZGVsaW1pdGVyOiBcInxcIixcbiAgICAgICAgcXVvdGVDaGFyOiBcIidcIixcbiAgICAgICAgY29tbWVudENoYXI6IFwiI1wiLFxuICAgICAgICBoZWFkZXI6IHRydWUsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgXCJmdWxsIG5hbWVcIjogXCJhbGljZSBzbWl0aFwiLCBhZ2U6IDI1IH0sXG4gICAgICB7IGlkOiAyLCBcImZ1bGwgbmFtZVwiOiBcImJvYiBqb25lc1wiLCBhZ2U6IDMwIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgdXRmOCBlbmNvZGluZ1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXG4gICAgICBCdWZmZXIuZnJvbShcImlkLG5hbWVcXG4xLGNhZsOpXFxuMixuYcOvdmVcIiwgXCJ1dGY4XCIpLFxuICAgIClcblxuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZENzdlRhYmxlKHtcbiAgICAgIHBhdGgsXG4gICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgfSlcblxuICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICB7IGlkOiAxLCBuYW1lOiBcImNhZsOpXCIgfSxcbiAgICAgIHsgaWQ6IDIsIG5hbWU6IFwibmHDr3ZlXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIC8vIFRPRE86IGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIGJ5IG5vZGVqcy1wb2xhcnNcbiAgaXQuc2tpcChcInNob3VsZCBoYW5kbGUgdXRmMTYgZW5jb2RpbmdcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFxuICAgICAgQnVmZmVyLmZyb20oXCJpZCxuYW1lXFxuMSxjYWbDqVxcbjIsbmHDr3ZlXCIsIFwidXRmMTZsZVwiKSxcbiAgICApXG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZW5jb2Rpbmc6IFwidXRmMTZcIixcbiAgICB9KVxuXG4gICAgZXhwZWN0KChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiY2Fmw6lcIiB9LFxuICAgICAgeyBpZDogMiwgbmFtZTogXCJuYcOvdmVcIiB9LFxuICAgIF0pXG4gIH0pXG5cbiAgLy8gVE9ETzogY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgYnkgbm9kZWpzLXBvbGFyc1xuICBpdC5za2lwKFwic2hvdWxkIGhhbmRsZSBsYXRpbjEgZW5jb2RpbmdcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFxuICAgICAgQnVmZmVyLmZyb20oXCJpZCxuYW1lXFxuMSxjYWbDqVxcbjIscsOpc3Vtw6lcIiwgXCJsYXRpbjFcIiksXG4gICAgKVxuXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkQ3N2VGFibGUoe1xuICAgICAgcGF0aCxcbiAgICAgIGVuY29kaW5nOiBcImxhdGluMVwiLFxuICAgIH0pXG5cbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogXCJjYWbDqVwiIH0sXG4gICAgICB7IGlkOiAyLCBuYW1lOiBcInLDqXN1bcOpXCIgfSxcbiAgICBdKVxuICB9KVxufSlcblxuZGVzY3JpYmUoXCJsb2FkQ3N2VGFibGUgKGZvcm1hdD10c3YpXCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgbG9hZCBsb2NhbCBmaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkXFx0bmFtZVxcbjFcXHRlbmdsaXNoXFxuMlxcdOS4reaWh1wiKVxuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZENzdlRhYmxlKHsgcGF0aCwgZm9ybWF0OiBcInRzdlwiIH0pXG5cbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICBdKVxuICB9KVxufSlcbiJdfQ==
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { assertLocalPathVacant } from "@frictionless-ts/dataset";
|
|
2
|
+
import { inferSchemaFromTable } from "../../../schema/index.js";
|
|
3
|
+
import { denormalizeTable } from "../../../table/index.js";
|
|
4
|
+
export async function saveCsvTable(table, options) {
|
|
5
|
+
const { path, format, overwrite } = options;
|
|
6
|
+
const isTabs = format === "tsv";
|
|
7
|
+
if (!overwrite) {
|
|
8
|
+
await assertLocalPathVacant(path);
|
|
9
|
+
}
|
|
10
|
+
const schema = options.schema ??
|
|
11
|
+
(await inferSchemaFromTable(table, {
|
|
12
|
+
...options,
|
|
13
|
+
keepStrings: true,
|
|
14
|
+
}));
|
|
15
|
+
table = await denormalizeTable(table, schema, {
|
|
16
|
+
nativeTypes: ["string"],
|
|
17
|
+
});
|
|
18
|
+
await table
|
|
19
|
+
.sinkCSV(path, {
|
|
20
|
+
maintainOrder: true,
|
|
21
|
+
includeHeader: options.dialect?.header ?? true,
|
|
22
|
+
separator: options.dialect?.delimiter ?? (isTabs ? "\t" : ","),
|
|
23
|
+
//lineTerminator: options.dialect?.lineTerminator ?? "\r\n",
|
|
24
|
+
quoteChar: options.dialect?.quoteChar ?? '"',
|
|
25
|
+
})
|
|
26
|
+
.collect();
|
|
27
|
+
return path;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BsdWdpbnMvY3N2L3RhYmxlL3NhdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFFaEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDL0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFHMUQsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBQ2hDLEtBQVksRUFDWixPQUFzRDtJQUV0RCxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxPQUFPLENBQUE7SUFDM0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxLQUFLLEtBQUssQ0FBQTtJQUUvQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixNQUFNLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ25DLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FDVixPQUFPLENBQUMsTUFBTTtRQUNkLENBQUMsTUFBTSxvQkFBb0IsQ0FBQyxLQUFLLEVBQUU7WUFDakMsR0FBRyxPQUFPO1lBQ1YsV0FBVyxFQUFFLElBQUk7U0FDbEIsQ0FBQyxDQUFDLENBQUE7SUFFTCxLQUFLLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFO1FBQzVDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQztLQUN4QixDQUFDLENBQUE7SUFFRixNQUFNLEtBQUs7U0FDUixPQUFPLENBQUMsSUFBSSxFQUFFO1FBQ2IsYUFBYSxFQUFFLElBQUk7UUFDbkIsYUFBYSxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxJQUFJLElBQUk7UUFDOUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUM5RCw0REFBNEQ7UUFDNUQsU0FBUyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsU0FBUyxJQUFJLEdBQUc7S0FDN0MsQ0FBQztTQUNELE9BQU8sRUFBRSxDQUFBO0lBRVosT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXNzZXJ0TG9jYWxQYXRoVmFjYW50IH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvZGF0YXNldFwiXG5pbXBvcnQgdHlwZSB7IFNhdmVUYWJsZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vcGx1Z2luLnRzXCJcbmltcG9ydCB7IGluZmVyU2NoZW1hRnJvbVRhYmxlIH0gZnJvbSBcIi4uLy4uLy4uL3NjaGVtYS9pbmRleC50c1wiXG5pbXBvcnQgeyBkZW5vcm1hbGl6ZVRhYmxlIH0gZnJvbSBcIi4uLy4uLy4uL3RhYmxlL2luZGV4LnRzXCJcbmltcG9ydCB0eXBlIHsgVGFibGUgfSBmcm9tIFwiLi4vLi4vLi4vdGFibGUvaW5kZXgudHNcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZUNzdlRhYmxlKFxuICB0YWJsZTogVGFibGUsXG4gIG9wdGlvbnM6IFNhdmVUYWJsZU9wdGlvbnMgJiB7IGZvcm1hdD86IFwiY3N2XCIgfCBcInRzdlwiIH0sXG4pIHtcbiAgY29uc3QgeyBwYXRoLCBmb3JtYXQsIG92ZXJ3cml0ZSB9ID0gb3B0aW9uc1xuICBjb25zdCBpc1RhYnMgPSBmb3JtYXQgPT09IFwidHN2XCJcblxuICBpZiAoIW92ZXJ3cml0ZSkge1xuICAgIGF3YWl0IGFzc2VydExvY2FsUGF0aFZhY2FudChwYXRoKVxuICB9XG5cbiAgY29uc3Qgc2NoZW1hID1cbiAgICBvcHRpb25zLnNjaGVtYSA/P1xuICAgIChhd2FpdCBpbmZlclNjaGVtYUZyb21UYWJsZSh0YWJsZSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGtlZXBTdHJpbmdzOiB0cnVlLFxuICAgIH0pKVxuXG4gIHRhYmxlID0gYXdhaXQgZGVub3JtYWxpemVUYWJsZSh0YWJsZSwgc2NoZW1hLCB7XG4gICAgbmF0aXZlVHlwZXM6IFtcInN0cmluZ1wiXSxcbiAgfSlcblxuICBhd2FpdCB0YWJsZVxuICAgIC5zaW5rQ1NWKHBhdGgsIHtcbiAgICAgIG1haW50YWluT3JkZXI6IHRydWUsXG4gICAgICBpbmNsdWRlSGVhZGVyOiBvcHRpb25zLmRpYWxlY3Q/LmhlYWRlciA/PyB0cnVlLFxuICAgICAgc2VwYXJhdG9yOiBvcHRpb25zLmRpYWxlY3Q/LmRlbGltaXRlciA/PyAoaXNUYWJzID8gXCJcXHRcIiA6IFwiLFwiKSxcbiAgICAgIC8vbGluZVRlcm1pbmF0b3I6IG9wdGlvbnMuZGlhbGVjdD8ubGluZVRlcm1pbmF0b3IgPz8gXCJcXHJcXG5cIixcbiAgICAgIHF1b3RlQ2hhcjogb3B0aW9ucy5kaWFsZWN0Py5xdW90ZUNoYXIgPz8gJ1wiJyxcbiAgICB9KVxuICAgIC5jb2xsZWN0KClcblxuICByZXR1cm4gcGF0aFxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,137 @@
|
|
|
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 { loadCsvTable } from "./load.js";
|
|
6
|
+
import { saveCsvTable } from "./save.js";
|
|
7
|
+
describe("saveCsvTable", () => {
|
|
8
|
+
it("should save table to file", async () => {
|
|
9
|
+
const path = getTempFilePath();
|
|
10
|
+
const table = pl
|
|
11
|
+
.DataFrame({
|
|
12
|
+
id: [1.0, 2.0, 3.0],
|
|
13
|
+
name: ["Alice", "Bob", "Charlie"],
|
|
14
|
+
})
|
|
15
|
+
.lazy();
|
|
16
|
+
await saveCsvTable(table, { path });
|
|
17
|
+
const content = await readFile(path, "utf-8");
|
|
18
|
+
expect(content).toEqual("id,name\n1.0,Alice\n2.0,Bob\n3.0,Charlie\n");
|
|
19
|
+
});
|
|
20
|
+
it("should save with custom delimiter", async () => {
|
|
21
|
+
const path = getTempFilePath();
|
|
22
|
+
const table = pl
|
|
23
|
+
.DataFrame({
|
|
24
|
+
id: [1.0, 2.0, 3.0],
|
|
25
|
+
name: ["Alice", "Bob", "Charlie"],
|
|
26
|
+
})
|
|
27
|
+
.lazy();
|
|
28
|
+
await saveCsvTable(table, {
|
|
29
|
+
path,
|
|
30
|
+
dialect: { delimiter: ";" },
|
|
31
|
+
});
|
|
32
|
+
const content = await readFile(path, "utf-8");
|
|
33
|
+
expect(content).toEqual("id;name\n1.0;Alice\n2.0;Bob\n3.0;Charlie\n");
|
|
34
|
+
});
|
|
35
|
+
it("should save without header", async () => {
|
|
36
|
+
const path = getTempFilePath();
|
|
37
|
+
const table = pl
|
|
38
|
+
.DataFrame({
|
|
39
|
+
id: [1.0, 2.0, 3.0],
|
|
40
|
+
name: ["Alice", "Bob", "Charlie"],
|
|
41
|
+
})
|
|
42
|
+
.lazy();
|
|
43
|
+
await saveCsvTable(table, {
|
|
44
|
+
path,
|
|
45
|
+
dialect: { header: false },
|
|
46
|
+
});
|
|
47
|
+
const content = await readFile(path, "utf-8");
|
|
48
|
+
expect(content).toEqual("1.0,Alice\n2.0,Bob\n3.0,Charlie\n");
|
|
49
|
+
});
|
|
50
|
+
it("should save with custom quote char", async () => {
|
|
51
|
+
const path = getTempFilePath();
|
|
52
|
+
const table = pl
|
|
53
|
+
.DataFrame({
|
|
54
|
+
id: [1.0, 2.0, 3.0],
|
|
55
|
+
name: ["Alice,Smith", "Bob,Jones", "Charlie,Brown"],
|
|
56
|
+
})
|
|
57
|
+
.lazy();
|
|
58
|
+
await saveCsvTable(table, {
|
|
59
|
+
path,
|
|
60
|
+
dialect: { quoteChar: "'" },
|
|
61
|
+
});
|
|
62
|
+
const content = await readFile(path, "utf-8");
|
|
63
|
+
expect(content).toEqual("id,name\n1.0,'Alice,Smith'\n2.0,'Bob,Jones'\n3.0,'Charlie,Brown'\n");
|
|
64
|
+
});
|
|
65
|
+
it("should save and load various data types", async () => {
|
|
66
|
+
const path = getTempFilePath();
|
|
67
|
+
const source = pl
|
|
68
|
+
.DataFrame([
|
|
69
|
+
pl.Series("array", ["[1, 2, 3]"], pl.String),
|
|
70
|
+
pl.Series("boolean", [true], pl.Bool),
|
|
71
|
+
pl.Series("date", [new Date(Date.UTC(2025, 0, 1))], pl.Date),
|
|
72
|
+
pl.Series("datetime", [new Date(Date.UTC(2025, 0, 1))], pl.Datetime),
|
|
73
|
+
pl.Series("duration", ["P23DT23H"], pl.String),
|
|
74
|
+
pl.Series("geojson", ['{"value": 1}'], pl.String),
|
|
75
|
+
pl.Series("geopoint", [[40.0, 50.0]], pl.List(pl.Float32)),
|
|
76
|
+
pl.Series("integer", [1], pl.Int32),
|
|
77
|
+
pl.Series("list", [[1.0, 2.0, 3.0]], pl.List(pl.Float32)),
|
|
78
|
+
pl.Series("number", [1.1], pl.Float64),
|
|
79
|
+
pl.Series("object", ['{"value": 1}']),
|
|
80
|
+
pl.Series("string", ["string"], pl.String),
|
|
81
|
+
pl.Series("time", [new Date(Date.UTC(2025, 0, 1))], pl.Time),
|
|
82
|
+
pl.Series("year", [2025], pl.Int32),
|
|
83
|
+
pl.Series("yearmonth", [[2025, 1]], pl.List(pl.Int16)),
|
|
84
|
+
])
|
|
85
|
+
.lazy();
|
|
86
|
+
await saveCsvTable(source, {
|
|
87
|
+
path,
|
|
88
|
+
fieldTypes: {
|
|
89
|
+
array: "array",
|
|
90
|
+
geojson: "geojson",
|
|
91
|
+
geopoint: "geopoint",
|
|
92
|
+
list: "list",
|
|
93
|
+
object: "object",
|
|
94
|
+
// TODO: Remove time after:
|
|
95
|
+
// https://github.com/pola-rs/nodejs-polars/issues/364
|
|
96
|
+
time: "time",
|
|
97
|
+
year: "year",
|
|
98
|
+
yearmonth: "yearmonth",
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
const target = await loadCsvTable({ path }, { denormalized: true });
|
|
102
|
+
expect((await target.collect()).toRecords()).toEqual([
|
|
103
|
+
{
|
|
104
|
+
array: "[1, 2, 3]",
|
|
105
|
+
boolean: "true",
|
|
106
|
+
date: "2025-01-01",
|
|
107
|
+
datetime: "2025-01-01T00:00:00",
|
|
108
|
+
duration: "P23DT23H",
|
|
109
|
+
geojson: '{"value": 1}',
|
|
110
|
+
geopoint: "40.0,50.0",
|
|
111
|
+
integer: "1",
|
|
112
|
+
list: "1.0,2.0,3.0",
|
|
113
|
+
number: "1.1",
|
|
114
|
+
object: '{"value": 1}',
|
|
115
|
+
string: "string",
|
|
116
|
+
time: "00:00:00",
|
|
117
|
+
year: "2025",
|
|
118
|
+
yearmonth: "2025-01",
|
|
119
|
+
},
|
|
120
|
+
]);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
describe("saveCsvTable (format=tsv)", () => {
|
|
124
|
+
it("should save table to file", async () => {
|
|
125
|
+
const path = getTempFilePath();
|
|
126
|
+
const table = pl
|
|
127
|
+
.DataFrame({
|
|
128
|
+
id: [1.0, 2.0, 3.0],
|
|
129
|
+
name: ["Alice", "Bob", "Charlie"],
|
|
130
|
+
})
|
|
131
|
+
.lazy();
|
|
132
|
+
await saveCsvTable(table, { path, format: "tsv" });
|
|
133
|
+
const content = await readFile(path, "utf-8");
|
|
134
|
+
expect(content).toEqual("id\tname\n1.0\tAlice\n2.0\tBob\n3.0\tCharlie\n");
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGx1Z2lucy9jc3YvdGFibGUvc2F2ZS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDMUQsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUV4QyxRQUFRLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtJQUM1QixFQUFFLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDekMsTUFBTSxJQUFJLEdBQUcsZUFBZSxFQUFFLENBQUE7UUFDOUIsTUFBTSxLQUFLLEdBQUcsRUFBRTthQUNiLFNBQVMsQ0FBQztZQUNULEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1lBQ25CLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDO1NBQ2xDLENBQUM7YUFDRCxJQUFJLEVBQUUsQ0FBQTtRQUVULE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7UUFFbkMsTUFBTSxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQzdDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsNENBQTRDLENBQUMsQ0FBQTtJQUN2RSxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxtQ0FBbUMs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LEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDNUQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQzlDLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNqRCxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25DLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDekQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ3RDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDckMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQzFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQzVELEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQyxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdkQsQ0FBQzthQUNELElBQUksRUFBRSxDQUFBO1FBRVQsTUFBTSxZQUFZLENBQUMsTUFBTSxFQUFFO1lBQ3pCLElBQUk7WUFDSixVQUFVLEVBQUU7Z0JBQ1YsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsT0FBTyxFQUFFLFNBQVM7Z0JBQ2xCLFFBQVEsRUFBRSxVQUFVO2dCQUNwQixJQUFJLEVBQUUsTUFBTTtnQkFDWixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsMkJBQTJCO2dCQUMzQixzREFBc0Q7Z0JBQ3RELElBQUksRUFBRSxNQUFNO2dCQUNaLElBQUksRUFBRSxNQUFNO2dCQUNaLFNBQVMsRUFBRSxXQUFXO2FBQ3ZCO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ25FLE1BQU0sQ0FBQyxDQUFDLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDbkQ7Z0JBQ0UsS0FBSyxFQUFFLFdBQVc7Z0JBQ2xCLE9BQU8sRUFBRSxNQUFNO2dCQUNmLElBQUksRUFBRSxZQUFZO2dCQUNsQixRQUFRLEVBQUUscUJBQXFCO2dCQUMvQixRQUFRLEVBQUUsVUFBVTtnQkFDcEIsT0FBTyxFQUFFLGNBQWM7Z0JBQ3ZCLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixPQUFPLEVBQUUsR0FBRztnQkFDWixJQUFJLEVBQUUsYUFBYTtnQkFDbkIsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsTUFBTSxFQUFFLGNBQWM7Z0JBQ3RCLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixJQUFJLEVBQUUsVUFBVTtnQkFDaEIsSUFBSSxFQUFFLE1BQU07Z0JBQ1osU0FBUyxFQUFFLFNBQVM7YUFDckI7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBO0FBRUYsUUFBUSxDQUFDLDJCQUEyQixFQUFFLEdBQUcsRUFBRTtJQUN6QyxFQUFFLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDekMsTUFBTSxJQUFJLEdBQUcsZUFBZSxFQUFFLENBQUE7UUFDOUIsTUFBTSxLQUFLLEdBQUcsRUFBRTthQUNiLFNBQVMsQ0FBQztZQUNULEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1lBQ25CLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDO1NBQ2xDLENBQUM7YUFDRCxJQUFJLEVBQUUsQ0FBQTtRQUVULE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUVsRCxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDN0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnREFBZ0QsQ0FBQyxDQUFBO0lBQzNFLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7IGdldFRlbXBGaWxlUGF0aCB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL2RhdGFzZXRcIlxuaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGxvYWRDc3ZUYWJsZSB9IGZyb20gXCIuL2xvYWQudHNcIlxuaW1wb3J0IHsgc2F2ZUNzdlRhYmxlIH0gZnJvbSBcIi4vc2F2ZS50c1wiXG5cbmRlc2NyaWJlKFwic2F2ZUNzdlRhYmxlXCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgc2F2ZSB0YWJsZSB0byBmaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gZ2V0VGVtcEZpbGVQYXRoKClcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgaWQ6IFsxLjAsIDIuMCwgMy4wXSxcbiAgICAgICAgbmFtZTogW1wiQWxpY2VcIiwgXCJCb2JcIiwgXCJDaGFybGllXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGF3YWl0IHNhdmVDc3ZUYWJsZSh0YWJsZSwgeyBwYXRoIH0pXG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKVxuICAgIGV4cGVjdChjb250ZW50KS50b0VxdWFsKFwiaWQsbmFtZVxcbjEuMCxBbGljZVxcbjIuMCxCb2JcXG4zLjAsQ2hhcmxpZVxcblwiKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHNhdmUgd2l0aCBjdXN0b20gZGVsaW1pdGVyXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gZ2V0VGVtcEZpbGVQYXRoKClcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgaWQ6IFsxLjAsIDIuMCwgMy4wXSxcbiAgICAgICAgbmFtZTogW1wiQWxpY2VcIiwgXCJCb2JcIiwgXCJDaGFybGllXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGF3YWl0IHNhdmVDc3ZUYWJsZSh0YWJsZSwge1xuICAgICAgcGF0aCxcbiAgICAgIGRpYWxlY3Q6IHsgZGVsaW1pdGVyOiBcIjtcIiB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKVxuICAgIGV4cGVjdChjb250ZW50KS50b0VxdWFsKFwiaWQ7bmFtZVxcbjEuMDtBbGljZVxcbjIuMDtCb2JcXG4zLjA7Q2hhcmxpZVxcblwiKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHNhdmUgd2l0aG91dCBoZWFkZXJcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBnZXRUZW1wRmlsZVBhdGgoKVxuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBpZDogWzEuMCwgMi4wLCAzLjBdLFxuICAgICAgICBuYW1lOiBbXCJBbGljZVwiLCBcIkJvYlwiLCBcIkNoYXJsaWVcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgYXdhaXQgc2F2ZUNzdlRhYmxlKHRhYmxlLCB7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBoZWFkZXI6IGZhbHNlIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShwYXRoLCBcInV0Zi04XCIpXG4gICAgZXhwZWN0KGNvbnRlbnQpLnRvRXF1YWwoXCIxLjAsQWxpY2VcXG4yLjAsQm9iXFxuMy4wLENoYXJsaWVcXG5cIilcbiAgfSlcblxuICBpdChcInNob3VsZCBzYXZlIHdpdGggY3VzdG9tIHF1b3RlIGNoYXJcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBnZXRUZW1wRmlsZVBhdGgoKVxuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBpZDogWzEuMCwgMi4wLCAzLjBdLFxuICAgICAgICBuYW1lOiBbXCJBbGljZSxTbWl0aFwiLCBcIkJvYixKb25lc1wiLCBcIkNoYXJsaWUsQnJvd25cIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgYXdhaXQgc2F2ZUNzdlRhYmxlKHRhYmxlLCB7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBxdW90ZUNoYXI6IFwiJ1wiIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShwYXRoLCBcInV0Zi04XCIpXG4gICAgZXhwZWN0KGNvbnRlbnQpLnRvRXF1YWwoXG4gICAgICBcImlkLG5hbWVcXG4xLjAsJ0FsaWNlLFNtaXRoJ1xcbjIuMCwnQm9iLEpvbmVzJ1xcbjMuMCwnQ2hhcmxpZSxCcm93bidcXG5cIixcbiAgICApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc2F2ZSBhbmQgbG9hZCB2YXJpb3VzIGRhdGEgdHlwZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBnZXRUZW1wRmlsZVBhdGgoKVxuXG4gICAgY29uc3Qgc291cmNlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoW1xuICAgICAgICBwbC5TZXJpZXMoXCJhcnJheVwiLCBbXCJbMSwgMiwgM11cIl0sIHBsLlN0cmluZyksXG4gICAgICAgIHBsLlNlcmllcyhcImJvb2xlYW5cIiwgW3RydWVdLCBwbC5Cb29sKSxcbiAgICAgICAgcGwuU2VyaWVzKFwiZGF0ZVwiLCBbbmV3IERhdGUoRGF0ZS5VVEMoMjAyNSwgMCwgMSkpXSwgcGwuRGF0ZSksXG4gICAgICAgIHBsLlNlcmllcyhcImRhdGV0aW1lXCIsIFtuZXcgRGF0ZShEYXRlLlVUQygyMDI1LCAwLCAxKSldLCBwbC5EYXRldGltZSksXG4gICAgICAgIHBsLlNlcmllcyhcImR1cmF0aW9uXCIsIFtcIlAyM0RUMjNIXCJdLCBwbC5TdHJpbmcpLFxuICAgICAgICBwbC5TZXJpZXMoXCJnZW9qc29uXCIsIFsne1widmFsdWVcIjogMX0nXSwgcGwuU3RyaW5nKSxcbiAgICAgICAgcGwuU2VyaWVzKFwiZ2VvcG9pbnRcIiwgW1s0MC4wLCA1MC4wXV0sIHBsLkxpc3QocGwuRmxvYXQzMikpLFxuICAgICAgICBwbC5TZXJpZXMoXCJpbnRlZ2VyXCIsIFsxXSwgcGwuSW50MzIpLFxuICAgICAgICBwbC5TZXJpZXMoXCJsaXN0XCIsIFtbMS4wLCAyLjAsIDMuMF1dLCBwbC5MaXN0KHBsLkZsb2F0MzIpKSxcbiAgICAgICAgcGwuU2VyaWVzKFwibnVtYmVyXCIsIFsxLjFdLCBwbC5GbG9hdDY0KSxcbiAgICAgICAgcGwuU2VyaWVzKFwib2JqZWN0XCIsIFsne1widmFsdWVcIjogMX0nXSksXG4gICAgICAgIHBsLlNlcmllcyhcInN0cmluZ1wiLCBbXCJzdHJpbmdcIl0sIHBsLlN0cmluZyksXG4gICAgICAgIHBsLlNlcmllcyhcInRpbWVcIiwgW25ldyBEYXRlKERhdGUuVVRDKDIwMjUsIDAsIDEpKV0sIHBsLlRpbWUpLFxuICAgICAgICBwbC5TZXJpZXMoXCJ5ZWFyXCIsIFsyMDI1XSwgcGwuSW50MzIpLFxuICAgICAgICBwbC5TZXJpZXMoXCJ5ZWFybW9udGhcIiwgW1syMDI1LCAxXV0sIHBsLkxpc3QocGwuSW50MTYpKSxcbiAgICAgIF0pXG4gICAgICAubGF6eSgpXG5cbiAgICBhd2FpdCBzYXZlQ3N2VGFibGUoc291cmNlLCB7XG4gICAgICBwYXRoLFxuICAgICAgZmllbGRUeXBlczoge1xuICAgICAgICBhcnJheTogXCJhcnJheVwiLFxuICAgICAgICBnZW9qc29uOiBcImdlb2pzb25cIixcbiAgICAgICAgZ2VvcG9pbnQ6IFwiZ2VvcG9pbnRcIixcbiAgICAgICAgbGlzdDogXCJsaXN0XCIsXG4gICAgICAgIG9iamVjdDogXCJvYmplY3RcIixcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRpbWUgYWZ0ZXI6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb2xhLXJzL25vZGVqcy1wb2xhcnMvaXNzdWVzLzM2NFxuICAgICAgICB0aW1lOiBcInRpbWVcIixcbiAgICAgICAgeWVhcjogXCJ5ZWFyXCIsXG4gICAgICAgIHllYXJtb250aDogXCJ5ZWFybW9udGhcIixcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7IHBhdGggfSwgeyBkZW5vcm1hbGl6ZWQ6IHRydWUgfSlcbiAgICBleHBlY3QoKGF3YWl0IHRhcmdldC5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgYXJyYXk6IFwiWzEsIDIsIDNdXCIsXG4gICAgICAgIGJvb2xlYW46IFwidHJ1ZVwiLFxuICAgICAgICBkYXRlOiBcIjIwMjUtMDEtMDFcIixcbiAgICAgICAgZGF0ZXRpbWU6IFwiMjAyNS0wMS0wMVQwMDowMDowMFwiLFxuICAgICAgICBkdXJhdGlvbjogXCJQMjNEVDIzSFwiLFxuICAgICAgICBnZW9qc29uOiAne1widmFsdWVcIjogMX0nLFxuICAgICAgICBnZW9wb2ludDogXCI0MC4wLDUwLjBcIixcbiAgICAgICAgaW50ZWdlcjogXCIxXCIsXG4gICAgICAgIGxpc3Q6IFwiMS4wLDIuMCwzLjBcIixcbiAgICAgICAgbnVtYmVyOiBcIjEuMVwiLFxuICAgICAgICBvYmplY3Q6ICd7XCJ2YWx1ZVwiOiAxfScsXG4gICAgICAgIHN0cmluZzogXCJzdHJpbmdcIixcbiAgICAgICAgdGltZTogXCIwMDowMDowMFwiLFxuICAgICAgICB5ZWFyOiBcIjIwMjVcIixcbiAgICAgICAgeWVhcm1vbnRoOiBcIjIwMjUtMDFcIixcbiAgICAgIH0sXG4gICAgXSlcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKFwic2F2ZUNzdlRhYmxlIChmb3JtYXQ9dHN2KVwiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIHNhdmUgdGFibGUgdG8gZmlsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGdldFRlbXBGaWxlUGF0aCgpXG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGlkOiBbMS4wLCAyLjAsIDMuMF0sXG4gICAgICAgIG5hbWU6IFtcIkFsaWNlXCIsIFwiQm9iXCIsIFwiQ2hhcmxpZVwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBhd2FpdCBzYXZlQ3N2VGFibGUodGFibGUsIHsgcGF0aCwgZm9ybWF0OiBcInRzdlwiIH0pXG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKVxuICAgIGV4cGVjdChjb250ZW50KS50b0VxdWFsKFwiaWRcXHRuYW1lXFxuMS4wXFx0QWxpY2VcXG4yLjBcXHRCb2JcXG4zLjBcXHRDaGFybGllXFxuXCIpXG4gIH0pXG59KVxuIl19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from "./table/index.js";
|
|
2
|
+
export * from "./plugin.js";
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW5zL2lubGluZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFBO0FBQ2hDLGNBQWMsYUFBYSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vdGFibGUvaW5kZXgudHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vcGx1Z2luLnRzXCJcbiJdfQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Resource } from "@frictionless-ts/metadata";
|
|
2
|
+
import type { LoadTableOptions, TablePlugin } from "../../plugin.ts";
|
|
3
|
+
export declare class InlinePlugin implements TablePlugin {
|
|
4
|
+
loadTable(resource: Resource, options?: LoadTableOptions): Promise<import("nodejs-polars").LazyDataFrame<{
|
|
5
|
+
[x: string]: any;
|
|
6
|
+
}> | undefined>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { loadInlineTable } from "./table/index.js";
|
|
2
|
+
export class InlinePlugin {
|
|
3
|
+
async loadTable(resource, options) {
|
|
4
|
+
const isInline = getIsInline(resource);
|
|
5
|
+
if (!isInline)
|
|
6
|
+
return undefined;
|
|
7
|
+
return await loadInlineTable(resource, options);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function getIsInline(resource) {
|
|
11
|
+
const isTable = resource.type === "table" || !!resource.schema;
|
|
12
|
+
return isTable && !!resource.data;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2lucy9pbmxpbmUvcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUVsRCxNQUFNLE9BQU8sWUFBWTtJQUN2QixLQUFLLENBQUMsU0FBUyxDQUFDLFFBQWtCLEVBQUUsT0FBMEI7UUFDNUQsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3RDLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxTQUFTLENBQUE7UUFFL0IsT0FBTyxNQUFNLGVBQWUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDakQsQ0FBQztDQUNGO0FBRUQsU0FBUyxXQUFXLENBQUMsUUFBa0I7SUFDckMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUE7SUFDOUQsT0FBTyxPQUFPLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUE7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVzb3VyY2UgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IExvYWRUYWJsZU9wdGlvbnMsIFRhYmxlUGx1Z2luIH0gZnJvbSBcIi4uLy4uL3BsdWdpbi50c1wiXG5pbXBvcnQgeyBsb2FkSW5saW5lVGFibGUgfSBmcm9tIFwiLi90YWJsZS9pbmRleC50c1wiXG5cbmV4cG9ydCBjbGFzcyBJbmxpbmVQbHVnaW4gaW1wbGVtZW50cyBUYWJsZVBsdWdpbiB7XG4gIGFzeW5jIGxvYWRUYWJsZShyZXNvdXJjZTogUmVzb3VyY2UsIG9wdGlvbnM/OiBMb2FkVGFibGVPcHRpb25zKSB7XG4gICAgY29uc3QgaXNJbmxpbmUgPSBnZXRJc0lubGluZShyZXNvdXJjZSlcbiAgICBpZiAoIWlzSW5saW5lKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICByZXR1cm4gYXdhaXQgbG9hZElubGluZVRhYmxlKHJlc291cmNlLCBvcHRpb25zKVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldElzSW5saW5lKHJlc291cmNlOiBSZXNvdXJjZSkge1xuICBjb25zdCBpc1RhYmxlID0gcmVzb3VyY2UudHlwZSA9PT0gXCJ0YWJsZVwiIHx8ICEhcmVzb3VyY2Uuc2NoZW1hXG4gIHJldHVybiBpc1RhYmxlICYmICEhcmVzb3VyY2UuZGF0YVxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { loadInlineTable } from "./load.ts";
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { loadInlineTable } from "./load.js";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wbHVnaW5zL2lubGluZS90YWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgbG9hZElubGluZVRhYmxlIH0gZnJvbSBcIi4vbG9hZC50c1wiXG4iXX0=
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Resource } from "@frictionless-ts/metadata";
|
|
2
|
+
import type { LoadTableOptions } from "../../../plugin.ts";
|
|
3
|
+
import * as pl from "nodejs-polars";
|
|
4
|
+
export declare function loadInlineTable(resource: Partial<Resource>, options?: LoadTableOptions): Promise<pl.LazyDataFrame<{
|
|
5
|
+
[x: string]: any;
|
|
6
|
+
}>>;
|