frictionless-ts 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/dialect/index.d.ts +1 -0
- package/build/dialect/index.js +2 -0
- package/build/dialect/infer.d.ts +3 -0
- package/build/dialect/infer.js +13 -0
- package/build/dialect/infer.spec.d.ts +1 -0
- package/build/dialect/infer.spec.js +89 -0
- package/build/index.d.ts +19 -0
- package/build/index.js +19 -0
- package/build/package/index.d.ts +4 -0
- package/build/package/index.js +5 -0
- package/build/package/infer.d.ts +40 -0
- package/build/package/infer.js +13 -0
- package/build/package/infer.spec.d.ts +1 -0
- package/build/package/infer.spec.js +121 -0
- package/build/package/integrity.d.ts +8 -0
- package/build/package/integrity.js +69 -0
- package/build/package/integrity.spec.d.ts +1 -0
- package/build/package/integrity.spec.js +575 -0
- package/build/package/load.d.ts +1 -0
- package/build/package/load.js +10 -0
- package/build/package/load.spec.d.ts +1 -0
- package/build/package/load.spec.js +117 -0
- package/build/package/save.d.ts +5 -0
- package/build/package/save.js +13 -0
- package/build/package/save.spec.d.ts +1 -0
- package/build/package/save.spec.js +138 -0
- package/build/package/validate.d.ts +20 -0
- package/build/package/validate.js +62 -0
- package/build/package/validate.spec.d.ts +1 -0
- package/build/package/validate.spec.js +172 -0
- package/build/plugin.d.ts +2 -0
- package/build/plugin.js +2 -0
- package/build/resource/index.d.ts +2 -0
- package/build/resource/index.js +3 -0
- package/build/resource/infer.d.ts +22 -0
- package/build/resource/infer.js +49 -0
- package/build/resource/infer.spec.d.ts +1 -0
- package/build/resource/infer.spec.js +164 -0
- package/build/resource/validate.d.ts +12 -0
- package/build/resource/validate.js +35 -0
- package/build/resource/validate.spec.d.ts +1 -0
- package/build/resource/validate.spec.js +147 -0
- package/build/schema/index.d.ts +1 -0
- package/build/schema/index.js +2 -0
- package/build/schema/infer.d.ts +3 -0
- package/build/schema/infer.js +18 -0
- package/build/schema/infer.spec.d.ts +1 -0
- package/build/schema/infer.spec.js +136 -0
- package/build/system.d.ts +6 -0
- package/build/system.js +41 -0
- package/build/table/index.d.ts +3 -0
- package/build/table/index.js +4 -0
- package/build/table/infer.d.ts +6 -0
- package/build/table/infer.js +20 -0
- package/build/table/infer.spec.d.ts +1 -0
- package/build/table/infer.spec.js +177 -0
- package/build/table/load.d.ts +3 -0
- package/build/table/load.js +11 -0
- package/build/table/load.spec.d.ts +1 -0
- package/build/table/load.spec.js +121 -0
- package/build/table/save.d.ts +2 -0
- package/build/table/save.js +11 -0
- package/build/table/save.spec.d.ts +1 -0
- package/build/table/save.spec.js +189 -0
- package/build/table/validate.d.ts +9 -0
- package/build/table/validate.js +26 -0
- package/package.json +38 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { writeTempFile } from "@frictionless-ts/dataset";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { loadTable } from "./load.js";
|
|
4
|
+
describe("loadTable", () => {
|
|
5
|
+
it("should load table from CSV file", async () => {
|
|
6
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
7
|
+
const resource = { path: csvPath, format: "csv" };
|
|
8
|
+
const table = await loadTable(resource);
|
|
9
|
+
expect(table).toBeDefined();
|
|
10
|
+
expect(typeof table).toBe("object");
|
|
11
|
+
});
|
|
12
|
+
it("should load table from inline data", async () => {
|
|
13
|
+
const resource = {
|
|
14
|
+
name: "test-resource",
|
|
15
|
+
type: "table",
|
|
16
|
+
data: [
|
|
17
|
+
{ id: 1, name: "alice" },
|
|
18
|
+
{ id: 2, name: "bob" },
|
|
19
|
+
],
|
|
20
|
+
};
|
|
21
|
+
const table = await loadTable(resource);
|
|
22
|
+
expect(table).toBeDefined();
|
|
23
|
+
expect(typeof table).toBe("object");
|
|
24
|
+
});
|
|
25
|
+
it("should load table with schema", async () => {
|
|
26
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
27
|
+
const resource = {
|
|
28
|
+
path: csvPath,
|
|
29
|
+
format: "csv",
|
|
30
|
+
schema: {
|
|
31
|
+
fields: [
|
|
32
|
+
{ name: "id", type: "integer" },
|
|
33
|
+
{ name: "name", type: "string" },
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
const table = await loadTable(resource);
|
|
38
|
+
expect(table).toBeDefined();
|
|
39
|
+
expect(typeof table).toBe("object");
|
|
40
|
+
});
|
|
41
|
+
it("should load table with custom delimiter", async () => {
|
|
42
|
+
const csvPath = await writeTempFile("id|name\n1|alice\n2|bob");
|
|
43
|
+
const resource = {
|
|
44
|
+
path: csvPath,
|
|
45
|
+
format: "csv",
|
|
46
|
+
dialect: { delimiter: "|" },
|
|
47
|
+
};
|
|
48
|
+
const table = await loadTable(resource);
|
|
49
|
+
expect(table).toBeDefined();
|
|
50
|
+
expect(typeof table).toBe("object");
|
|
51
|
+
});
|
|
52
|
+
it("should load denormalized table", async () => {
|
|
53
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
54
|
+
const resource = { path: csvPath, format: "csv" };
|
|
55
|
+
const table = await loadTable(resource, { denormalized: true });
|
|
56
|
+
expect(table).toBeDefined();
|
|
57
|
+
expect(typeof table).toBe("object");
|
|
58
|
+
});
|
|
59
|
+
it("should load table with different data types", async () => {
|
|
60
|
+
const csvPath = await writeTempFile("id,name,score,active\n1,alice,95.5,true\n2,bob,87.3,false");
|
|
61
|
+
const resource = { path: csvPath, format: "csv" };
|
|
62
|
+
const table = await loadTable(resource);
|
|
63
|
+
expect(table).toBeDefined();
|
|
64
|
+
expect(typeof table).toBe("object");
|
|
65
|
+
});
|
|
66
|
+
it("should load table with empty rows", async () => {
|
|
67
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n\n2,bob");
|
|
68
|
+
const resource = { path: csvPath, format: "csv" };
|
|
69
|
+
const table = await loadTable(resource);
|
|
70
|
+
expect(table).toBeDefined();
|
|
71
|
+
});
|
|
72
|
+
it("should load table with quoted fields", async () => {
|
|
73
|
+
const csvPath = await writeTempFile('id,name,description\n1,"alice","Test, data"\n2,"bob","Normal"');
|
|
74
|
+
const resource = { path: csvPath, format: "csv" };
|
|
75
|
+
const table = await loadTable(resource);
|
|
76
|
+
expect(table).toBeDefined();
|
|
77
|
+
expect(typeof table).toBe("object");
|
|
78
|
+
});
|
|
79
|
+
it("should load single row table", async () => {
|
|
80
|
+
const csvPath = await writeTempFile("id,name\n1,alice");
|
|
81
|
+
const resource = { path: csvPath, format: "csv" };
|
|
82
|
+
const table = await loadTable(resource);
|
|
83
|
+
expect(table).toBeDefined();
|
|
84
|
+
expect(typeof table).toBe("object");
|
|
85
|
+
});
|
|
86
|
+
it("should load table with numeric values", async () => {
|
|
87
|
+
const csvPath = await writeTempFile("id,score\n1,95.5\n2,87.3\n3,100");
|
|
88
|
+
const resource = { path: csvPath, format: "csv" };
|
|
89
|
+
const table = await loadTable(resource);
|
|
90
|
+
expect(table).toBeDefined();
|
|
91
|
+
expect(typeof table).toBe("object");
|
|
92
|
+
});
|
|
93
|
+
it("should load table with date values", async () => {
|
|
94
|
+
const csvPath = await writeTempFile("id,created\n1,2024-01-01\n2,2024-01-02");
|
|
95
|
+
const resource = { path: csvPath, format: "csv" };
|
|
96
|
+
const table = await loadTable(resource);
|
|
97
|
+
expect(table).toBeDefined();
|
|
98
|
+
expect(typeof table).toBe("object");
|
|
99
|
+
});
|
|
100
|
+
it("should load table with boolean values", async () => {
|
|
101
|
+
const csvPath = await writeTempFile("id,active\n1,true\n2,false\n3,true");
|
|
102
|
+
const resource = { path: csvPath, format: "csv" };
|
|
103
|
+
const table = await loadTable(resource);
|
|
104
|
+
expect(table).toBeDefined();
|
|
105
|
+
expect(typeof table).toBe("object");
|
|
106
|
+
});
|
|
107
|
+
it("should load empty table with headers only", async () => {
|
|
108
|
+
const csvPath = await writeTempFile("id,name,age");
|
|
109
|
+
const resource = { path: csvPath, format: "csv" };
|
|
110
|
+
const table = await loadTable(resource);
|
|
111
|
+
expect(table).toBeDefined();
|
|
112
|
+
});
|
|
113
|
+
it("should load table with null values", async () => {
|
|
114
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,");
|
|
115
|
+
const resource = { path: csvPath, format: "csv" };
|
|
116
|
+
const table = await loadTable(resource);
|
|
117
|
+
expect(table).toBeDefined();
|
|
118
|
+
expect(typeof table).toBe("object");
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGFibGUvbG9hZC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUVyQyxRQUFRLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRTtJQUN6QixFQUFFLENBQUMsaUNBQWlDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0MsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUMseUJBQXlCLENBQUMsQ0FBQTtRQUM5RCxNQUFNLFFBQVEsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQWMsRUFBRSxDQUFBO1FBRTFELE1BQU0sS0FBSyxHQUFHLE1BQU0sU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXZDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUMzQixNQUFNLENBQUMsT0FBTyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDckMsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbEQsTUFBTSxRQUFRLEdBQUc7WUFDZixJQUFJLEVBQUUsZUFBZTtZQUNyQixJQUFJLEVBQUUsT0FBZ0I7WUFDdEIsSUFBSSxFQUFFO2dCQUNKLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO2dCQUN4QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTthQUN2QjtTQUNGLENBQUE7UUFFRCxNQUFNLEtBQUssR0FBRyxN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S0FBSyxHQUFHLE1BQU0sU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXZDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUMzQixNQUFNLENBQUMsT0FBTyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDckMsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsMkNBQTJDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDekQsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDbEQsTUFBTSxRQUFRLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFjLEVBQUUsQ0FBQTtRQUUxRCxNQUFNLEtBQUssR0FBRyxNQUFNLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDN0IsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtRQUMzRCxNQUFNLFFBQVEsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQWMsRUFBRSxDQUFBO1FBRTFELE1BQU0sS0FBSyxHQUFHLE1BQU0sU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXZDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUMzQixNQUFNLENBQUMsT0FBTyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDckMsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdyaXRlVGVtcEZpbGUgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9kYXRhc2V0XCJcbmltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyBsb2FkVGFibGUgfSBmcm9tIFwiLi9sb2FkLnRzXCJcblxuZGVzY3JpYmUoXCJsb2FkVGFibGVcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBsb2FkIHRhYmxlIGZyb20gQ1NWIGZpbGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZVxcbjEsYWxpY2VcXG4yLGJvYlwiKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkVGFibGUocmVzb3VyY2UpXG5cbiAgICBleHBlY3QodGFibGUpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QodHlwZW9mIHRhYmxlKS50b0JlKFwib2JqZWN0XCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbG9hZCB0YWJsZSBmcm9tIGlubGluZSBkYXRhXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHtcbiAgICAgIG5hbWU6IFwidGVzdC1yZXNvdXJjZVwiLFxuICAgICAgdHlwZTogXCJ0YWJsZVwiIGFzIGNvbnN0LFxuICAgICAgZGF0YTogW1xuICAgICAgICB7IGlkOiAxLCBuYW1lOiBcImFsaWNlXCIgfSxcbiAgICAgICAgeyBpZDogMiwgbmFtZTogXCJib2JcIiB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRUYWJsZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdCh0YWJsZSkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdCh0eXBlb2YgdGFibGUpLnRvQmUoXCJvYmplY3RcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBsb2FkIHRhYmxlIHdpdGggc2NoZW1hXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4xLGFsaWNlXFxuMixib2JcIilcbiAgICBjb25zdCByZXNvdXJjZSA9IHtcbiAgICAgIHBhdGg6IGNzdlBhdGgsXG4gICAgICBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QsXG4gICAgICBzY2hlbWE6IHtcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwiaW50ZWdlclwiIGFzIGNvbnN0IH0sXG4gICAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJzdHJpbmdcIiBhcyBjb25zdCB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRUYWJsZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdCh0YWJsZSkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdCh0eXBlb2YgdGFibGUpLnRvQmUoXCJvYmplY3RcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBsb2FkIHRhYmxlIHdpdGggY3VzdG9tIGRlbGltaXRlclwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJpZHxuYW1lXFxuMXxhbGljZVxcbjJ8Ym9iXCIpXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7XG4gICAgICBwYXRoOiBjc3ZQYXRoLFxuICAgICAgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0LFxuICAgICAgZGlhbGVjdDogeyBkZWxpbWl0ZXI6IFwifFwiIH0sXG4gICAgfVxuXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkVGFibGUocmVzb3VyY2UpXG5cbiAgICBleHBlY3QodGFibGUpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QodHlwZW9mIHRhYmxlKS50b0JlKFwib2JqZWN0XCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbG9hZCBkZW5vcm1hbGl6ZWQgdGFibGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZVxcbjEsYWxpY2VcXG4yLGJvYlwiKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkVGFibGUocmVzb3VyY2UsIHsgZGVub3JtYWxpemVkOiB0cnVlIH0pXG5cbiAgICBleHBlY3QodGFibGUpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QodHlwZW9mIHRhYmxlKS50b0JlKFwib2JqZWN0XCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbG9hZCB0YWJsZSB3aXRoIGRpZmZlcmVudCBkYXRhIHR5cGVzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcbiAgICAgIFwiaWQsbmFtZSxzY29yZSxhY3RpdmVcXG4xLGFsaWNlLDk1LjUsdHJ1ZVxcbjIsYm9iLDg3LjMsZmFsc2VcIixcbiAgICApXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRUYWJsZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdCh0YWJsZSkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdCh0eXBlb2YgdGFibGUpLnRvQmUoXCJvYmplY3RcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBsb2FkIHRhYmxlIHdpdGggZW1wdHkgcm93c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJpZCxuYW1lXFxuMSxhbGljZVxcblxcbjIsYm9iXCIpXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRUYWJsZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdCh0YWJsZSkudG9CZURlZmluZWQoKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGxvYWQgdGFibGUgd2l0aCBxdW90ZWQgZmllbGRzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcbiAgICAgICdpZCxuYW1lLGRlc2NyaXB0aW9uXFxuMSxcImFsaWNlXCIsXCJUZXN0LCBkYXRhXCJcXG4yLFwiYm9iXCIsXCJOb3JtYWxcIicsXG4gICAgKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkVGFibGUocmVzb3VyY2UpXG5cbiAgICBleHBlY3QodGFibGUpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QodHlwZW9mIHRhYmxlKS50b0JlKFwib2JqZWN0XCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbG9hZCBzaW5nbGUgcm93IHRhYmxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4xLGFsaWNlXCIpXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRUYWJsZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdCh0YWJsZSkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdCh0eXBlb2YgdGFibGUpLnRvQmUoXCJvYmplY3RcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBsb2FkIHRhYmxlIHdpdGggbnVtZXJpYyB2YWx1ZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsc2NvcmVcXG4xLDk1LjVcXG4yLDg3LjNcXG4zLDEwMFwiKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkVGFibGUocmVzb3VyY2UpXG5cbiAgICBleHBlY3QodGFibGUpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QodHlwZW9mIHRhYmxlKS50b0JlKFwib2JqZWN0XCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbG9hZCB0YWJsZSB3aXRoIGRhdGUgdmFsdWVzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcbiAgICAgIFwiaWQsY3JlYXRlZFxcbjEsMjAyNC0wMS0wMVxcbjIsMjAyNC0wMS0wMlwiLFxuICAgIClcbiAgICBjb25zdCByZXNvdXJjZSA9IHsgcGF0aDogY3N2UGF0aCwgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0IH1cblxuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZFRhYmxlKHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHRhYmxlKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHR5cGVvZiB0YWJsZSkudG9CZShcIm9iamVjdFwiKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGxvYWQgdGFibGUgd2l0aCBib29sZWFuIHZhbHVlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJpZCxhY3RpdmVcXG4xLHRydWVcXG4yLGZhbHNlXFxuMyx0cnVlXCIpXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRUYWJsZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdCh0YWJsZSkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdCh0eXBlb2YgdGFibGUpLnRvQmUoXCJvYmplY3RcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBsb2FkIGVtcHR5IHRhYmxlIHdpdGggaGVhZGVycyBvbmx5XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWUsYWdlXCIpXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRUYWJsZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdCh0YWJsZSkudG9CZURlZmluZWQoKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGxvYWQgdGFibGUgd2l0aCBudWxsIHZhbHVlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJpZCxuYW1lXFxuMSxhbGljZVxcbjIsXCIpXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRUYWJsZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdCh0YWJsZSkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdCh0eXBlb2YgdGFibGUpLnRvQmUoXCJvYmplY3RcIilcbiAgfSlcbn0pXG4iXX0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { system } from "../system.js";
|
|
2
|
+
export async function saveTable(table, options) {
|
|
3
|
+
for (const plugin of system.plugins) {
|
|
4
|
+
const path = await plugin.saveTable?.(table, options);
|
|
5
|
+
if (path) {
|
|
6
|
+
return path;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
throw new Error(`No plugin can save the table: ${options.path}`);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RhYmxlL3NhdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUVyQyxNQUFNLENBQUMsS0FBSyxVQUFVLFNBQVMsQ0FBQyxLQUFZLEVBQUUsT0FBeUI7SUFDckUsS0FBSyxNQUFNLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ3JELElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxPQUFPLElBQUksQ0FBQTtRQUNiLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7QUFDbEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2F2ZVRhYmxlT3B0aW9ucywgVGFibGUgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy90YWJsZVwiXG5pbXBvcnQgeyBzeXN0ZW0gfSBmcm9tIFwiLi4vc3lzdGVtLnRzXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVUYWJsZSh0YWJsZTogVGFibGUsIG9wdGlvbnM6IFNhdmVUYWJsZU9wdGlvbnMpIHtcbiAgZm9yIChjb25zdCBwbHVnaW4gb2Ygc3lzdGVtLnBsdWdpbnMpIHtcbiAgICBjb25zdCBwYXRoID0gYXdhaXQgcGx1Z2luLnNhdmVUYWJsZT8uKHRhYmxlLCBvcHRpb25zKVxuICAgIGlmIChwYXRoKSB7XG4gICAgICByZXR1cm4gcGF0aFxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgTm8gcGx1Z2luIGNhbiBzYXZlIHRoZSB0YWJsZTogJHtvcHRpb25zLnBhdGh9YClcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { access, unlink } from "node:fs/promises";
|
|
2
|
+
import { writeTempFile } from "@frictionless-ts/dataset";
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import { assert } from "vitest";
|
|
5
|
+
import { loadTable } from "./load.js";
|
|
6
|
+
import { saveTable } from "./save.js";
|
|
7
|
+
describe("saveTable", () => {
|
|
8
|
+
it("should save table to CSV file", async () => {
|
|
9
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
10
|
+
const resource = { path: csvPath, format: "csv" };
|
|
11
|
+
const table = await loadTable(resource);
|
|
12
|
+
const outputPath = await writeTempFile("");
|
|
13
|
+
await unlink(outputPath);
|
|
14
|
+
assert(table, "table is not defined");
|
|
15
|
+
const savedPath = await saveTable(table, {
|
|
16
|
+
path: outputPath,
|
|
17
|
+
format: "csv",
|
|
18
|
+
});
|
|
19
|
+
expect(savedPath).toBeDefined();
|
|
20
|
+
expect(typeof savedPath).toBe("string");
|
|
21
|
+
expect(await access(savedPath)
|
|
22
|
+
.then(() => true)
|
|
23
|
+
.catch(() => false)).toBe(true);
|
|
24
|
+
await unlink(savedPath);
|
|
25
|
+
});
|
|
26
|
+
it("should save table with format option", async () => {
|
|
27
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
28
|
+
const resource = { path: csvPath, format: "csv" };
|
|
29
|
+
const table = await loadTable(resource);
|
|
30
|
+
const outputPath = await writeTempFile("");
|
|
31
|
+
await unlink(outputPath);
|
|
32
|
+
assert(table, "table is not defined");
|
|
33
|
+
const savedPath = await saveTable(table, {
|
|
34
|
+
path: outputPath,
|
|
35
|
+
format: "csv",
|
|
36
|
+
});
|
|
37
|
+
expect(savedPath).toBeDefined();
|
|
38
|
+
expect(await access(savedPath)
|
|
39
|
+
.then(() => true)
|
|
40
|
+
.catch(() => false)).toBe(true);
|
|
41
|
+
await unlink(savedPath);
|
|
42
|
+
});
|
|
43
|
+
it("should save and reload table with same data", async () => {
|
|
44
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
45
|
+
const resource = { path: csvPath, format: "csv" };
|
|
46
|
+
const originalTable = await loadTable(resource);
|
|
47
|
+
const outputPath = await writeTempFile("");
|
|
48
|
+
await unlink(outputPath);
|
|
49
|
+
assert(originalTable, "table is not defined");
|
|
50
|
+
await saveTable(originalTable, {
|
|
51
|
+
path: outputPath,
|
|
52
|
+
format: "csv",
|
|
53
|
+
});
|
|
54
|
+
const reloadedTable = await loadTable({
|
|
55
|
+
path: outputPath,
|
|
56
|
+
format: "csv",
|
|
57
|
+
});
|
|
58
|
+
expect(reloadedTable).toBeDefined();
|
|
59
|
+
expect(typeof reloadedTable).toBe("object");
|
|
60
|
+
await unlink(outputPath);
|
|
61
|
+
});
|
|
62
|
+
it("should save table with different data types", async () => {
|
|
63
|
+
const csvPath = await writeTempFile("id,score,active\n1,95.5,true\n2,87.3,false");
|
|
64
|
+
const resource = { path: csvPath, format: "csv" };
|
|
65
|
+
const table = await loadTable(resource);
|
|
66
|
+
const outputPath = await writeTempFile("");
|
|
67
|
+
await unlink(outputPath);
|
|
68
|
+
assert(table, "table is not defined");
|
|
69
|
+
const savedPath = await saveTable(table, {
|
|
70
|
+
path: outputPath,
|
|
71
|
+
format: "csv",
|
|
72
|
+
});
|
|
73
|
+
expect(savedPath).toBeDefined();
|
|
74
|
+
expect(await access(savedPath)
|
|
75
|
+
.then(() => true)
|
|
76
|
+
.catch(() => false)).toBe(true);
|
|
77
|
+
await unlink(savedPath);
|
|
78
|
+
});
|
|
79
|
+
it("should save table with custom delimiter", async () => {
|
|
80
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
81
|
+
const resource = { path: csvPath, format: "csv" };
|
|
82
|
+
const table = await loadTable(resource);
|
|
83
|
+
const outputPath = await writeTempFile("");
|
|
84
|
+
await unlink(outputPath);
|
|
85
|
+
assert(table, "table is not defined");
|
|
86
|
+
const savedPath = await saveTable(table, {
|
|
87
|
+
path: outputPath,
|
|
88
|
+
format: "csv",
|
|
89
|
+
delimiter: "|",
|
|
90
|
+
});
|
|
91
|
+
expect(savedPath).toBeDefined();
|
|
92
|
+
expect(await access(savedPath)
|
|
93
|
+
.then(() => true)
|
|
94
|
+
.catch(() => false)).toBe(true);
|
|
95
|
+
await unlink(savedPath);
|
|
96
|
+
});
|
|
97
|
+
it("should save table from inline data", async () => {
|
|
98
|
+
const resource = {
|
|
99
|
+
name: "test-resource",
|
|
100
|
+
type: "table",
|
|
101
|
+
data: [
|
|
102
|
+
{ id: 1, name: "alice" },
|
|
103
|
+
{ id: 2, name: "bob" },
|
|
104
|
+
],
|
|
105
|
+
};
|
|
106
|
+
const table = await loadTable(resource);
|
|
107
|
+
const outputPath = await writeTempFile("");
|
|
108
|
+
await unlink(outputPath);
|
|
109
|
+
assert(table, "table is not defined");
|
|
110
|
+
const savedPath = await saveTable(table, {
|
|
111
|
+
path: outputPath,
|
|
112
|
+
format: "csv",
|
|
113
|
+
});
|
|
114
|
+
expect(savedPath).toBeDefined();
|
|
115
|
+
expect(await access(savedPath)
|
|
116
|
+
.then(() => true)
|
|
117
|
+
.catch(() => false)).toBe(true);
|
|
118
|
+
await unlink(savedPath);
|
|
119
|
+
});
|
|
120
|
+
it("should save table with special characters", async () => {
|
|
121
|
+
const csvPath = await writeTempFile('id,name,note\n1,"alice","Test, data"\n2,"bob","Normal"');
|
|
122
|
+
const resource = { path: csvPath, format: "csv" };
|
|
123
|
+
const table = await loadTable(resource);
|
|
124
|
+
const outputPath = await writeTempFile("");
|
|
125
|
+
await unlink(outputPath);
|
|
126
|
+
assert(table, "table is not defined");
|
|
127
|
+
const savedPath = await saveTable(table, {
|
|
128
|
+
path: outputPath,
|
|
129
|
+
format: "csv",
|
|
130
|
+
});
|
|
131
|
+
expect(savedPath).toBeDefined();
|
|
132
|
+
expect(await access(savedPath)
|
|
133
|
+
.then(() => true)
|
|
134
|
+
.catch(() => false)).toBe(true);
|
|
135
|
+
await unlink(savedPath);
|
|
136
|
+
});
|
|
137
|
+
it("should save table with numeric values", async () => {
|
|
138
|
+
const csvPath = await writeTempFile("id,value\n1,100\n2,200.5\n3,300");
|
|
139
|
+
const resource = { path: csvPath, format: "csv" };
|
|
140
|
+
const table = await loadTable(resource);
|
|
141
|
+
const outputPath = await writeTempFile("");
|
|
142
|
+
await unlink(outputPath);
|
|
143
|
+
assert(table, "table is not defined");
|
|
144
|
+
const savedPath = await saveTable(table, {
|
|
145
|
+
path: outputPath,
|
|
146
|
+
format: "csv",
|
|
147
|
+
});
|
|
148
|
+
expect(savedPath).toBeDefined();
|
|
149
|
+
expect(await access(savedPath)
|
|
150
|
+
.then(() => true)
|
|
151
|
+
.catch(() => false)).toBe(true);
|
|
152
|
+
await unlink(savedPath);
|
|
153
|
+
});
|
|
154
|
+
it("should save table with boolean values", async () => {
|
|
155
|
+
const csvPath = await writeTempFile("id,active\n1,true\n2,false\n3,true");
|
|
156
|
+
const resource = { path: csvPath, format: "csv" };
|
|
157
|
+
const table = await loadTable(resource);
|
|
158
|
+
const outputPath = await writeTempFile("");
|
|
159
|
+
await unlink(outputPath);
|
|
160
|
+
assert(table, "table is not defined");
|
|
161
|
+
const savedPath = await saveTable(table, {
|
|
162
|
+
path: outputPath,
|
|
163
|
+
format: "csv",
|
|
164
|
+
});
|
|
165
|
+
expect(savedPath).toBeDefined();
|
|
166
|
+
expect(await access(savedPath)
|
|
167
|
+
.then(() => true)
|
|
168
|
+
.catch(() => false)).toBe(true);
|
|
169
|
+
await unlink(savedPath);
|
|
170
|
+
});
|
|
171
|
+
it("should save table with date values", async () => {
|
|
172
|
+
const csvPath = await writeTempFile("id,created\n1,2024-01-01\n2,2024-01-02");
|
|
173
|
+
const resource = { path: csvPath, format: "csv" };
|
|
174
|
+
const table = await loadTable(resource);
|
|
175
|
+
const outputPath = await writeTempFile("");
|
|
176
|
+
await unlink(outputPath);
|
|
177
|
+
assert(table, "table is not defined");
|
|
178
|
+
const savedPath = await saveTable(table, {
|
|
179
|
+
path: outputPath,
|
|
180
|
+
format: "csv",
|
|
181
|
+
});
|
|
182
|
+
expect(savedPath).toBeDefined();
|
|
183
|
+
expect(await access(savedPath)
|
|
184
|
+
.then(() => true)
|
|
185
|
+
.catch(() => false)).toBe(true);
|
|
186
|
+
await unlink(savedPath);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGFibGUvc2F2ZS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ3hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDckMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUVyQyxRQUFRLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRTtJQUN6QixFQUFFLENBQUMsK0JBQStCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDN0MsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUMseUJBQXlCLENBQUMsQ0FBQTtRQUM5RCxNQUFNLFFBQVEsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQWMsRUFBRSxDQUFBO1FBQzFELE1BQU0sS0FBSyxHQUFHLE1BQU0sU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3ZDLE1BQU0sVUFBVSxHQUFHLE1BQU0sYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzFDLE1BQU0sTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRXhCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsc0JBQXNCLENBQUMsQ0FBQTtRQUNyQyxNQUFNLFNBQVMsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUU7WUFDdkMsSUFBSSxFQUFFLFVBQVU7WUFDaEIsTUFBTSxFQUFFLEtBQWM7U0FDdkIsQ0FBQyxDQUFBO1FBRUYsTUFBTSxDQUFDLFNBQVMs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QUFHLE1BQU0sYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzFDLE1BQU0sTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRXhCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsc0JBQXNCLENBQUMsQ0FBQTtRQUNyQyxNQUFNLFNBQVMsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUU7WUFDdkMsSUFBSSxFQUFFLFVBQVU7WUFDaEIsTUFBTSxFQUFFLEtBQWM7U0FDdkIsQ0FBQyxDQUFBO1FBRUYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQy9CLE1BQU0sQ0FDSixNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUM7YUFDcEIsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQzthQUNoQixLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQ3RCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ1osTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDekIsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFjY2VzcywgdW5saW5rIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHsgd3JpdGVUZW1wRmlsZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL2RhdGFzZXRcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHsgbG9hZFRhYmxlIH0gZnJvbSBcIi4vbG9hZC50c1wiXG5pbXBvcnQgeyBzYXZlVGFibGUgfSBmcm9tIFwiLi9zYXZlLnRzXCJcblxuZGVzY3JpYmUoXCJzYXZlVGFibGVcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBzYXZlIHRhYmxlIHRvIENTViBmaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4xLGFsaWNlXFxuMixib2JcIilcbiAgICBjb25zdCByZXNvdXJjZSA9IHsgcGF0aDogY3N2UGF0aCwgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0IH1cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRUYWJsZShyZXNvdXJjZSlcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcIlwiKVxuICAgIGF3YWl0IHVubGluayhvdXRwdXRQYXRoKVxuXG4gICAgYXNzZXJ0KHRhYmxlLCBcInRhYmxlIGlzIG5vdCBkZWZpbmVkXCIpXG4gICAgY29uc3Qgc2F2ZWRQYXRoID0gYXdhaXQgc2F2ZVRhYmxlKHRhYmxlLCB7XG4gICAgICBwYXRoOiBvdXRwdXRQYXRoLFxuICAgICAgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0LFxuICAgIH0pXG5cbiAgICBleHBlY3Qoc2F2ZWRQYXRoKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHR5cGVvZiBzYXZlZFBhdGgpLnRvQmUoXCJzdHJpbmdcIilcbiAgICBleHBlY3QoXG4gICAgICBhd2FpdCBhY2Nlc3Moc2F2ZWRQYXRoKVxuICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAuY2F0Y2goKCkgPT4gZmFsc2UpLFxuICAgICkudG9CZSh0cnVlKVxuICAgIGF3YWl0IHVubGluayhzYXZlZFBhdGgpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc2F2ZSB0YWJsZSB3aXRoIGZvcm1hdCBvcHRpb25cIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZVxcbjEsYWxpY2VcXG4yLGJvYlwiKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZFRhYmxlKHJlc291cmNlKVxuICAgIGNvbnN0IG91dHB1dFBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiXCIpXG4gICAgYXdhaXQgdW5saW5rKG91dHB1dFBhdGgpXG5cbiAgICBhc3NlcnQodGFibGUsIFwidGFibGUgaXMgbm90IGRlZmluZWRcIilcbiAgICBjb25zdCBzYXZlZFBhdGggPSBhd2FpdCBzYXZlVGFibGUodGFibGUsIHtcbiAgICAgIHBhdGg6IG91dHB1dFBhdGgsXG4gICAgICBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QsXG4gICAgfSlcblxuICAgIGV4cGVjdChzYXZlZFBhdGgpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QoXG4gICAgICBhd2FpdCBhY2Nlc3Moc2F2ZWRQYXRoKVxuICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAuY2F0Y2goKCkgPT4gZmFsc2UpLFxuICAgICkudG9CZSh0cnVlKVxuICAgIGF3YWl0IHVubGluayhzYXZlZFBhdGgpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc2F2ZSBhbmQgcmVsb2FkIHRhYmxlIHdpdGggc2FtZSBkYXRhXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4xLGFsaWNlXFxuMixib2JcIilcbiAgICBjb25zdCByZXNvdXJjZSA9IHsgcGF0aDogY3N2UGF0aCwgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0IH1cbiAgICBjb25zdCBvcmlnaW5hbFRhYmxlID0gYXdhaXQgbG9hZFRhYmxlKHJlc291cmNlKVxuICAgIGNvbnN0IG91dHB1dFBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiXCIpXG4gICAgYXdhaXQgdW5saW5rKG91dHB1dFBhdGgpXG5cbiAgICBhc3NlcnQob3JpZ2luYWxUYWJsZSwgXCJ0YWJsZSBpcyBub3QgZGVmaW5lZFwiKVxuICAgIGF3YWl0IHNhdmVUYWJsZShvcmlnaW5hbFRhYmxlLCB7XG4gICAgICBwYXRoOiBvdXRwdXRQYXRoLFxuICAgICAgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0LFxuICAgIH0pXG4gICAgY29uc3QgcmVsb2FkZWRUYWJsZSA9IGF3YWl0IGxvYWRUYWJsZSh7XG4gICAgICBwYXRoOiBvdXRwdXRQYXRoLFxuICAgICAgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0LFxuICAgIH0pXG5cbiAgICBleHBlY3QocmVsb2FkZWRUYWJsZSkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdCh0eXBlb2YgcmVsb2FkZWRUYWJsZSkudG9CZShcIm9iamVjdFwiKVxuICAgIGF3YWl0IHVubGluayhvdXRwdXRQYXRoKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHNhdmUgdGFibGUgd2l0aCBkaWZmZXJlbnQgZGF0YSB0eXBlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXG4gICAgICBcImlkLHNjb3JlLGFjdGl2ZVxcbjEsOTUuNSx0cnVlXFxuMiw4Ny4zLGZhbHNlXCIsXG4gICAgKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZFRhYmxlKHJlc291cmNlKVxuICAgIGNvbnN0IG91dHB1dFBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiXCIpXG4gICAgYXdhaXQgdW5saW5rKG91dHB1dFBhdGgpXG5cbiAgICBhc3NlcnQodGFibGUsIFwidGFibGUgaXMgbm90IGRlZmluZWRcIilcbiAgICBjb25zdCBzYXZlZFBhdGggPSBhd2FpdCBzYXZlVGFibGUodGFibGUsIHtcbiAgICAgIHBhdGg6IG91dHB1dFBhdGgsXG4gICAgICBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QsXG4gICAgfSlcblxuICAgIGV4cGVjdChzYXZlZFBhdGgpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QoXG4gICAgICBhd2FpdCBhY2Nlc3Moc2F2ZWRQYXRoKVxuICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAuY2F0Y2goKCkgPT4gZmFsc2UpLFxuICAgICkudG9CZSh0cnVlKVxuICAgIGF3YWl0IHVubGluayhzYXZlZFBhdGgpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc2F2ZSB0YWJsZSB3aXRoIGN1c3RvbSBkZWxpbWl0ZXJcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZVxcbjEsYWxpY2VcXG4yLGJvYlwiKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZFRhYmxlKHJlc291cmNlKVxuICAgIGNvbnN0IG91dHB1dFBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiXCIpXG4gICAgYXdhaXQgdW5saW5rKG91dHB1dFBhdGgpXG5cbiAgICBhc3NlcnQodGFibGUsIFwidGFibGUgaXMgbm90IGRlZmluZWRcIilcbiAgICBjb25zdCBzYXZlZFBhdGggPSBhd2FpdCBzYXZlVGFibGUodGFibGUsIHtcbiAgICAgIHBhdGg6IG91dHB1dFBhdGgsXG4gICAgICBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QsXG4gICAgICBkZWxpbWl0ZXI6IFwifFwiLFxuICAgIH0pXG5cbiAgICBleHBlY3Qoc2F2ZWRQYXRoKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KFxuICAgICAgYXdhaXQgYWNjZXNzKHNhdmVkUGF0aClcbiAgICAgICAgLnRoZW4oKCkgPT4gdHJ1ZSlcbiAgICAgICAgLmNhdGNoKCgpID0+IGZhbHNlKSxcbiAgICApLnRvQmUodHJ1ZSlcbiAgICBhd2FpdCB1bmxpbmsoc2F2ZWRQYXRoKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHNhdmUgdGFibGUgZnJvbSBpbmxpbmUgZGF0YVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB7XG4gICAgICBuYW1lOiBcInRlc3QtcmVzb3VyY2VcIixcbiAgICAgIHR5cGU6IFwidGFibGVcIiBhcyBjb25zdCxcbiAgICAgIGRhdGE6IFtcbiAgICAgICAgeyBpZDogMSwgbmFtZTogXCJhbGljZVwiIH0sXG4gICAgICAgIHsgaWQ6IDIsIG5hbWU6IFwiYm9iXCIgfSxcbiAgICAgIF0sXG4gICAgfVxuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZFRhYmxlKHJlc291cmNlKVxuICAgIGNvbnN0IG91dHB1dFBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiXCIpXG4gICAgYXdhaXQgdW5saW5rKG91dHB1dFBhdGgpXG5cbiAgICBhc3NlcnQodGFibGUsIFwidGFibGUgaXMgbm90IGRlZmluZWRcIilcbiAgICBjb25zdCBzYXZlZFBhdGggPSBhd2FpdCBzYXZlVGFibGUodGFibGUsIHtcbiAgICAgIHBhdGg6IG91dHB1dFBhdGgsXG4gICAgICBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QsXG4gICAgfSlcblxuICAgIGV4cGVjdChzYXZlZFBhdGgpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QoXG4gICAgICBhd2FpdCBhY2Nlc3Moc2F2ZWRQYXRoKVxuICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAuY2F0Y2goKCkgPT4gZmFsc2UpLFxuICAgICkudG9CZSh0cnVlKVxuICAgIGF3YWl0IHVubGluayhzYXZlZFBhdGgpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc2F2ZSB0YWJsZSB3aXRoIHNwZWNpYWwgY2hhcmFjdGVyc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXG4gICAgICAnaWQsbmFtZSxub3RlXFxuMSxcImFsaWNlXCIsXCJUZXN0LCBkYXRhXCJcXG4yLFwiYm9iXCIsXCJOb3JtYWxcIicsXG4gICAgKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZFRhYmxlKHJlc291cmNlKVxuICAgIGNvbnN0IG91dHB1dFBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiXCIpXG4gICAgYXdhaXQgdW5saW5rKG91dHB1dFBhdGgpXG5cbiAgICBhc3NlcnQodGFibGUsIFwidGFibGUgaXMgbm90IGRlZmluZWRcIilcbiAgICBjb25zdCBzYXZlZFBhdGggPSBhd2FpdCBzYXZlVGFibGUodGFibGUsIHtcbiAgICAgIHBhdGg6IG91dHB1dFBhdGgsXG4gICAgICBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QsXG4gICAgfSlcblxuICAgIGV4cGVjdChzYXZlZFBhdGgpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QoXG4gICAgICBhd2FpdCBhY2Nlc3Moc2F2ZWRQYXRoKVxuICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAuY2F0Y2goKCkgPT4gZmFsc2UpLFxuICAgICkudG9CZSh0cnVlKVxuICAgIGF3YWl0IHVubGluayhzYXZlZFBhdGgpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc2F2ZSB0YWJsZSB3aXRoIG51bWVyaWMgdmFsdWVzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLHZhbHVlXFxuMSwxMDBcXG4yLDIwMC41XFxuMywzMDBcIilcbiAgICBjb25zdCByZXNvdXJjZSA9IHsgcGF0aDogY3N2UGF0aCwgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0IH1cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRUYWJsZShyZXNvdXJjZSlcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcIlwiKVxuICAgIGF3YWl0IHVubGluayhvdXRwdXRQYXRoKVxuXG4gICAgYXNzZXJ0KHRhYmxlLCBcInRhYmxlIGlzIG5vdCBkZWZpbmVkXCIpXG4gICAgY29uc3Qgc2F2ZWRQYXRoID0gYXdhaXQgc2F2ZVRhYmxlKHRhYmxlLCB7XG4gICAgICBwYXRoOiBvdXRwdXRQYXRoLFxuICAgICAgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0LFxuICAgIH0pXG5cbiAgICBleHBlY3Qoc2F2ZWRQYXRoKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KFxuICAgICAgYXdhaXQgYWNjZXNzKHNhdmVkUGF0aClcbiAgICAgICAgLnRoZW4oKCkgPT4gdHJ1ZSlcbiAgICAgICAgLmNhdGNoKCgpID0+IGZhbHNlKSxcbiAgICApLnRvQmUodHJ1ZSlcbiAgICBhd2FpdCB1bmxpbmsoc2F2ZWRQYXRoKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHNhdmUgdGFibGUgd2l0aCBib29sZWFuIHZhbHVlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJpZCxhY3RpdmVcXG4xLHRydWVcXG4yLGZhbHNlXFxuMyx0cnVlXCIpXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkVGFibGUocmVzb3VyY2UpXG4gICAgY29uc3Qgb3V0cHV0UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJcIilcbiAgICBhd2FpdCB1bmxpbmsob3V0cHV0UGF0aClcblxuICAgIGFzc2VydCh0YWJsZSwgXCJ0YWJsZSBpcyBub3QgZGVmaW5lZFwiKVxuICAgIGNvbnN0IHNhdmVkUGF0aCA9IGF3YWl0IHNhdmVUYWJsZSh0YWJsZSwge1xuICAgICAgcGF0aDogb3V0cHV0UGF0aCxcbiAgICAgIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCxcbiAgICB9KVxuXG4gICAgZXhwZWN0KHNhdmVkUGF0aCkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChcbiAgICAgIGF3YWl0IGFjY2VzcyhzYXZlZFBhdGgpXG4gICAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAgIC5jYXRjaCgoKSA9PiBmYWxzZSksXG4gICAgKS50b0JlKHRydWUpXG4gICAgYXdhaXQgdW5saW5rKHNhdmVkUGF0aClcbiAgfSlcblxuICBpdChcInNob3VsZCBzYXZlIHRhYmxlIHdpdGggZGF0ZSB2YWx1ZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFxuICAgICAgXCJpZCxjcmVhdGVkXFxuMSwyMDI0LTAxLTAxXFxuMiwyMDI0LTAxLTAyXCIsXG4gICAgKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZFRhYmxlKHJlc291cmNlKVxuICAgIGNvbnN0IG91dHB1dFBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiXCIpXG4gICAgYXdhaXQgdW5saW5rKG91dHB1dFBhdGgpXG5cbiAgICBhc3NlcnQodGFibGUsIFwidGFibGUgaXMgbm90IGRlZmluZWRcIilcbiAgICBjb25zdCBzYXZlZFBhdGggPSBhd2FpdCBzYXZlVGFibGUodGFibGUsIHtcbiAgICAgIHBhdGg6IG91dHB1dFBhdGgsXG4gICAgICBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QsXG4gICAgfSlcblxuICAgIGV4cGVjdChzYXZlZFBhdGgpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QoXG4gICAgICBhd2FpdCBhY2Nlc3Moc2F2ZWRQYXRoKVxuICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAuY2F0Y2goKCkgPT4gZmFsc2UpLFxuICAgICkudG9CZSh0cnVlKVxuICAgIGF3YWl0IHVubGluayhzYXZlZFBhdGgpXG4gIH0pXG59KVxuIl19
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Resource } from "@frictionless-ts/metadata";
|
|
2
|
+
import type { UnboundError } from "@frictionless-ts/metadata";
|
|
3
|
+
import type { LoadTableOptions } from "@frictionless-ts/table";
|
|
4
|
+
export declare function validateTable(resource: Partial<Resource>, options?: LoadTableOptions & {
|
|
5
|
+
maxErrors?: number;
|
|
6
|
+
}): Promise<{
|
|
7
|
+
errors: UnboundError[];
|
|
8
|
+
valid: boolean;
|
|
9
|
+
}>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { resolveSchema } from "@frictionless-ts/metadata";
|
|
2
|
+
import { createReport } from "@frictionless-ts/metadata";
|
|
3
|
+
import { inspectTable } from "@frictionless-ts/table";
|
|
4
|
+
import { inferSchema } from "../schema/index.js";
|
|
5
|
+
import { loadTable } from "./load.js";
|
|
6
|
+
export async function validateTable(resource, options) {
|
|
7
|
+
const { maxErrors } = options ?? {};
|
|
8
|
+
const errors = [];
|
|
9
|
+
const table = await loadTable(resource, { denormalized: true });
|
|
10
|
+
if (table) {
|
|
11
|
+
let schema = await resolveSchema(resource.schema);
|
|
12
|
+
if (!schema)
|
|
13
|
+
schema = await inferSchema(resource, options);
|
|
14
|
+
const tableErrors = await inspectTable(table, { schema, maxErrors });
|
|
15
|
+
errors.push(...tableErrors);
|
|
16
|
+
}
|
|
17
|
+
// TODO: review
|
|
18
|
+
if (!table && resource.schema) {
|
|
19
|
+
errors.push({
|
|
20
|
+
type: "data",
|
|
21
|
+
message: `missing ${resource.name} table`,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return createReport(errors, { maxErrors });
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90YWJsZS92YWxpZGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUVyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUVyQyxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FDakMsUUFBMkIsRUFDM0IsT0FBbUQ7SUFFbkQsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUE7SUFFbkMsTUFBTSxNQUFNLEdBQW1CLEVBQUUsQ0FBQTtJQUNqQyxNQUFNLEtBQUssR0FBRyxNQUFNLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUUvRCxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsSUFBSSxNQUFNLEdBQUcsTUFBTSxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2pELElBQUksQ0FBQyxNQUFNO1lBQUUsTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMxRCxNQUFNLFdBQVcsR0FBRyxNQUFNLFlBQVksQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUNwRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUE7SUFDN0IsQ0FBQztJQUVELGVBQWU7SUFDZixJQUFJLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM5QixNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ1YsSUFBSSxFQUFFLE1BQU07WUFDWixPQUFPLEVBQUUsV0FBVyxRQUFRLENBQUMsSUFBSSxRQUFRO1NBQzFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxPQUFPLFlBQVksQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFBO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlc291cmNlIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHR5cGUgeyBVbmJvdW5kRXJyb3IgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgeyByZXNvbHZlU2NoZW1hIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHsgY3JlYXRlUmVwb3J0IH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHsgaW5zcGVjdFRhYmxlIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvdGFibGVcIlxuaW1wb3J0IHR5cGUgeyBMb2FkVGFibGVPcHRpb25zIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvdGFibGVcIlxuaW1wb3J0IHsgaW5mZXJTY2hlbWEgfSBmcm9tIFwiLi4vc2NoZW1hL2luZGV4LnRzXCJcbmltcG9ydCB7IGxvYWRUYWJsZSB9IGZyb20gXCIuL2xvYWQudHNcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVUYWJsZShcbiAgcmVzb3VyY2U6IFBhcnRpYWw8UmVzb3VyY2U+LFxuICBvcHRpb25zPzogTG9hZFRhYmxlT3B0aW9ucyAmIHsgbWF4RXJyb3JzPzogbnVtYmVyIH0sXG4pIHtcbiAgY29uc3QgeyBtYXhFcnJvcnMgfSA9IG9wdGlvbnMgPz8ge31cblxuICBjb25zdCBlcnJvcnM6IFVuYm91bmRFcnJvcltdID0gW11cbiAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkVGFibGUocmVzb3VyY2UsIHsgZGVub3JtYWxpemVkOiB0cnVlIH0pXG5cbiAgaWYgKHRhYmxlKSB7XG4gICAgbGV0IHNjaGVtYSA9IGF3YWl0IHJlc29sdmVTY2hlbWEocmVzb3VyY2Uuc2NoZW1hKVxuICAgIGlmICghc2NoZW1hKSBzY2hlbWEgPSBhd2FpdCBpbmZlclNjaGVtYShyZXNvdXJjZSwgb3B0aW9ucylcbiAgICBjb25zdCB0YWJsZUVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEsIG1heEVycm9ycyB9KVxuICAgIGVycm9ycy5wdXNoKC4uLnRhYmxlRXJyb3JzKVxuICB9XG5cbiAgLy8gVE9ETzogcmV2aWV3XG4gIGlmICghdGFibGUgJiYgcmVzb3VyY2Uuc2NoZW1hKSB7XG4gICAgZXJyb3JzLnB1c2goe1xuICAgICAgdHlwZTogXCJkYXRhXCIsXG4gICAgICBtZXNzYWdlOiBgbWlzc2luZyAke3Jlc291cmNlLm5hbWV9IHRhYmxlYCxcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVJlcG9ydChlcnJvcnMsIHsgbWF4RXJyb3JzIH0pXG59XG4iXX0=
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "frictionless-ts",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "1.0.1",
|
|
5
|
+
"exports": "./build/index.js",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"files": [
|
|
8
|
+
"build"
|
|
9
|
+
],
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"author": "Evgeny Karev",
|
|
12
|
+
"repository": "https://github.com/frictionlessdata/frictionless-ts",
|
|
13
|
+
"description": "Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames",
|
|
14
|
+
"keywords": [
|
|
15
|
+
"frictionless",
|
|
16
|
+
"data",
|
|
17
|
+
"polars",
|
|
18
|
+
"dataframe",
|
|
19
|
+
"datapackage",
|
|
20
|
+
"tableschema",
|
|
21
|
+
"typescript",
|
|
22
|
+
"validation",
|
|
23
|
+
"quality",
|
|
24
|
+
"fair",
|
|
25
|
+
"lib"
|
|
26
|
+
],
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"p-all": "^5.0.1",
|
|
29
|
+
"@frictionless-ts/dataset": "1.0.1",
|
|
30
|
+
"@frictionless-ts/database": "1.0.1",
|
|
31
|
+
"@frictionless-ts/document": "1.0.1",
|
|
32
|
+
"@frictionless-ts/table": "1.0.1",
|
|
33
|
+
"@frictionless-ts/metadata": "1.0.1"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsc"
|
|
37
|
+
}
|
|
38
|
+
}
|