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,136 @@
|
|
|
1
|
+
import { writeTempFile } from "@frictionless-ts/dataset";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { inferSchema } from "./infer.js";
|
|
4
|
+
describe("inferSchema", () => {
|
|
5
|
+
it("should infer schema from CSV file", async () => {
|
|
6
|
+
const csvPath = await writeTempFile("id,name,age\n1,alice,25\n2,bob,30");
|
|
7
|
+
const resource = { path: csvPath, format: "csv" };
|
|
8
|
+
const schema = await inferSchema(resource);
|
|
9
|
+
expect(schema).toBeDefined();
|
|
10
|
+
expect(schema?.fields).toBeDefined();
|
|
11
|
+
expect(schema?.fields?.length).toBe(3);
|
|
12
|
+
expect(schema?.fields?.[0]?.name).toBe("id");
|
|
13
|
+
expect(schema?.fields?.[1]?.name).toBe("name");
|
|
14
|
+
expect(schema?.fields?.[2]?.name).toBe("age");
|
|
15
|
+
});
|
|
16
|
+
it("should infer field types correctly", async () => {
|
|
17
|
+
const csvPath = await writeTempFile("id,name,score\n1,alice,95.5\n2,bob,87.3");
|
|
18
|
+
const resource = { path: csvPath, format: "csv" };
|
|
19
|
+
const schema = await inferSchema(resource);
|
|
20
|
+
expect(schema?.fields?.[0]?.type).toBe("integer");
|
|
21
|
+
expect(schema?.fields?.[1]?.type).toBe("string");
|
|
22
|
+
expect(schema?.fields?.[2]?.type).toBe("number");
|
|
23
|
+
});
|
|
24
|
+
it("should infer schema from inline data", async () => {
|
|
25
|
+
const resource = {
|
|
26
|
+
name: "test-resource",
|
|
27
|
+
type: "table",
|
|
28
|
+
data: [
|
|
29
|
+
{ id: 1, name: "alice" },
|
|
30
|
+
{ id: 2, name: "bob" },
|
|
31
|
+
],
|
|
32
|
+
};
|
|
33
|
+
const schema = await inferSchema(resource);
|
|
34
|
+
expect(schema).toBeDefined();
|
|
35
|
+
expect(schema?.fields).toBeDefined();
|
|
36
|
+
expect(schema?.fields?.length).toBe(2);
|
|
37
|
+
expect(schema?.fields?.[0]?.name).toBe("id");
|
|
38
|
+
expect(schema?.fields?.[1]?.name).toBe("name");
|
|
39
|
+
});
|
|
40
|
+
it("should infer schema with custom delimiter", async () => {
|
|
41
|
+
const csvPath = await writeTempFile("id|name|value\n1|alice|100\n2|bob|200");
|
|
42
|
+
const resource = {
|
|
43
|
+
path: csvPath,
|
|
44
|
+
format: "csv",
|
|
45
|
+
dialect: { delimiter: "|" },
|
|
46
|
+
};
|
|
47
|
+
const schema = await inferSchema(resource);
|
|
48
|
+
expect(schema).toBeDefined();
|
|
49
|
+
expect(schema?.fields).toBeDefined();
|
|
50
|
+
expect(schema?.fields?.length).toBe(3);
|
|
51
|
+
expect(schema?.fields?.[0]?.name).toBe("id");
|
|
52
|
+
expect(schema?.fields?.[1]?.name).toBe("name");
|
|
53
|
+
expect(schema?.fields?.[2]?.name).toBe("value");
|
|
54
|
+
});
|
|
55
|
+
it("should handle boolean fields", async () => {
|
|
56
|
+
const csvPath = await writeTempFile("id,active\n1,true\n2,false");
|
|
57
|
+
const resource = { path: csvPath, format: "csv" };
|
|
58
|
+
const schema = await inferSchema(resource);
|
|
59
|
+
expect(schema?.fields?.[1]?.type).toBe("boolean");
|
|
60
|
+
});
|
|
61
|
+
it("should handle date fields", async () => {
|
|
62
|
+
const csvPath = await writeTempFile("id,created\n1,2024-01-01\n2,2024-01-02");
|
|
63
|
+
const resource = { path: csvPath, format: "csv" };
|
|
64
|
+
const schema = await inferSchema(resource);
|
|
65
|
+
expect(schema?.fields?.[1]?.type).toBe("date");
|
|
66
|
+
});
|
|
67
|
+
it("should handle mixed numeric types", async () => {
|
|
68
|
+
const csvPath = await writeTempFile("id,value\n1,100\n2,200.5");
|
|
69
|
+
const resource = { path: csvPath, format: "csv" };
|
|
70
|
+
const schema = await inferSchema(resource);
|
|
71
|
+
expect(schema?.fields?.[1]?.type).toBe("string");
|
|
72
|
+
});
|
|
73
|
+
it("should infer schema from single row", async () => {
|
|
74
|
+
const csvPath = await writeTempFile("id,name\n1,alice");
|
|
75
|
+
const resource = { path: csvPath, format: "csv" };
|
|
76
|
+
const schema = await inferSchema(resource);
|
|
77
|
+
expect(schema).toBeDefined();
|
|
78
|
+
expect(schema?.fields).toBeDefined();
|
|
79
|
+
expect(schema?.fields?.length).toBe(2);
|
|
80
|
+
});
|
|
81
|
+
it("should handle empty string values", async () => {
|
|
82
|
+
const csvPath = await writeTempFile("id,name,email\n1,alice,\n2,bob,bob@example.com");
|
|
83
|
+
const resource = { path: csvPath, format: "csv" };
|
|
84
|
+
const schema = await inferSchema(resource);
|
|
85
|
+
expect(schema).toBeDefined();
|
|
86
|
+
expect(schema?.fields?.length).toBe(3);
|
|
87
|
+
expect(schema?.fields?.[2]?.name).toBe("email");
|
|
88
|
+
});
|
|
89
|
+
it("should infer schema with sampleRows option", async () => {
|
|
90
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob\n3,charlie\n4,david\n5,eve");
|
|
91
|
+
const resource = { path: csvPath, format: "csv" };
|
|
92
|
+
const schema = await inferSchema(resource, { sampleRows: 2 });
|
|
93
|
+
expect(schema).toBeDefined();
|
|
94
|
+
expect(schema?.fields).toBeDefined();
|
|
95
|
+
expect(schema?.fields?.length).toBe(2);
|
|
96
|
+
});
|
|
97
|
+
it("should handle resources with headers only", async () => {
|
|
98
|
+
const csvPath = await writeTempFile("id,name,age");
|
|
99
|
+
const resource = { path: csvPath, format: "csv" };
|
|
100
|
+
const schema = await inferSchema(resource);
|
|
101
|
+
expect(schema).toBeDefined();
|
|
102
|
+
expect(schema?.fields).toBeDefined();
|
|
103
|
+
expect(schema?.fields?.length).toBe(3);
|
|
104
|
+
});
|
|
105
|
+
it("should infer schema from complex inline data", async () => {
|
|
106
|
+
const resource = {
|
|
107
|
+
name: "test-resource",
|
|
108
|
+
type: "table",
|
|
109
|
+
data: [
|
|
110
|
+
{
|
|
111
|
+
id: 1,
|
|
112
|
+
name: "alice",
|
|
113
|
+
score: 95.5,
|
|
114
|
+
active: true,
|
|
115
|
+
created: "2024-01-01",
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
id: 2,
|
|
119
|
+
name: "bob",
|
|
120
|
+
score: 87.3,
|
|
121
|
+
active: false,
|
|
122
|
+
created: "2024-01-02",
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
};
|
|
126
|
+
const schema = await inferSchema(resource);
|
|
127
|
+
expect(schema).toBeDefined();
|
|
128
|
+
expect(schema?.fields?.length).toBe(5);
|
|
129
|
+
expect(schema?.fields?.find(f => f.name === "id")?.type).toBe("integer");
|
|
130
|
+
expect(schema?.fields?.find(f => f.name === "name")?.type).toBe("string");
|
|
131
|
+
expect(schema?.fields?.find(f => f.name === "score")?.type).toBe("number");
|
|
132
|
+
expect(schema?.fields?.find(f => f.name === "active")?.type).toBe("boolean");
|
|
133
|
+
expect(schema?.fields?.find(f => f.name === "created")?.type).toBe("date");
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mZXIuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NjaGVtYS9pbmZlci5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUV4QyxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtJQUMzQixFQUFFLENBQUMsbUNBQW1DLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDakQsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUMsbUNBQW1DLENBQUMsQ0FBQTtRQUN4RSxNQUFNLFFBQVEsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQWMsRUFBRSxDQUFBO1FBRTFELE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRTFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUM1QixNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQ3BDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN0QyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM1QyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM5QyxNQUFNLENBQUMs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LENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3hFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3pFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQzVFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzVFLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB3cml0ZVRlbXBGaWxlIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvZGF0YXNldFwiXG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHsgaW5mZXJTY2hlbWEgfSBmcm9tIFwiLi9pbmZlci50c1wiXG5cbmRlc2NyaWJlKFwiaW5mZXJTY2hlbWFcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBpbmZlciBzY2hlbWEgZnJvbSBDU1YgZmlsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJpZCxuYW1lLGFnZVxcbjEsYWxpY2UsMjVcXG4yLGJvYiwzMFwiKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuXG4gICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgaW5mZXJTY2hlbWEocmVzb3VyY2UpXG5cbiAgICBleHBlY3Qoc2NoZW1hKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHNjaGVtYT8uZmllbGRzKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHNjaGVtYT8uZmllbGRzPy5sZW5ndGgpLnRvQmUoMylcbiAgICBleHBlY3Qoc2NoZW1hPy5maWVsZHM/LlswXT8ubmFtZSkudG9CZShcImlkXCIpXG4gICAgZXhwZWN0KHNjaGVtYT8uZmllbGRzPy5bMV0/Lm5hbWUpLnRvQmUoXCJuYW1lXCIpXG4gICAgZXhwZWN0KHNjaGVtYT8uZmllbGRzPy5bMl0/Lm5hbWUpLnRvQmUoXCJhZ2VcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciBmaWVsZCB0eXBlcyBjb3JyZWN0bHlcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFxuICAgICAgXCJpZCxuYW1lLHNjb3JlXFxuMSxhbGljZSw5NS41XFxuMixib2IsODcuM1wiLFxuICAgIClcbiAgICBjb25zdCByZXNvdXJjZSA9IHsgcGF0aDogY3N2UGF0aCwgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0IH1cblxuICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IGluZmVyU2NoZW1hKHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHNjaGVtYT8uZmllbGRzPy5bMF0/LnR5cGUpLnRvQmUoXCJpbnRlZ2VyXCIpXG4gICAgZXhwZWN0KHNjaGVtYT8uZmllbGRzPy5bMV0/LnR5cGUpLnRvQmUoXCJzdHJpbmdcIilcbiAgICBleHBlY3Qoc2NoZW1hPy5maWVsZHM/LlsyXT8udHlwZSkudG9CZShcIm51bWJlclwiKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIHNjaGVtYSBmcm9tIGlubGluZSBkYXRhXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHtcbiAgICAgIG5hbWU6IFwidGVzdC1yZXNvdXJjZVwiLFxuICAgICAgdHlwZTogXCJ0YWJsZVwiIGFzIGNvbnN0LFxuICAgICAgZGF0YTogW1xuICAgICAgICB7IGlkOiAxLCBuYW1lOiBcImFsaWNlXCIgfSxcbiAgICAgICAgeyBpZDogMiwgbmFtZTogXCJib2JcIiB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCBpbmZlclNjaGVtYShyZXNvdXJjZSlcblxuICAgIGV4cGVjdChzY2hlbWEpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3Qoc2NoZW1hPy5maWVsZHMpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3Qoc2NoZW1hPy5maWVsZHM/Lmxlbmd0aCkudG9CZSgyKVxuICAgIGV4cGVjdChzY2hlbWE/LmZpZWxkcz8uWzBdPy5uYW1lKS50b0JlKFwiaWRcIilcbiAgICBleHBlY3Qoc2NoZW1hPy5maWVsZHM/LlsxXT8ubmFtZSkudG9CZShcIm5hbWVcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciBzY2hlbWEgd2l0aCBjdXN0b20gZGVsaW1pdGVyXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkfG5hbWV8dmFsdWVcXG4xfGFsaWNlfDEwMFxcbjJ8Ym9ifDIwMFwiKVxuICAgIGNvbnN0IHJlc291cmNlID0ge1xuICAgICAgcGF0aDogY3N2UGF0aCxcbiAgICAgIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCxcbiAgICAgIGRpYWxlY3Q6IHsgZGVsaW1pdGVyOiBcInxcIiB9LFxuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IGluZmVyU2NoZW1hKHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHNjaGVtYSkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChzY2hlbWE/LmZpZWxkcykudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChzY2hlbWE/LmZpZWxkcz8ubGVuZ3RoKS50b0JlKDMpXG4gICAgZXhwZWN0KHNjaGVtYT8uZmllbGRzPy5bMF0/Lm5hbWUpLnRvQmUoXCJpZFwiKVxuICAgIGV4cGVjdChzY2hlbWE/LmZpZWxkcz8uWzFdPy5uYW1lKS50b0JlKFwibmFtZVwiKVxuICAgIGV4cGVjdChzY2hlbWE/LmZpZWxkcz8uWzJdPy5uYW1lKS50b0JlKFwidmFsdWVcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgYm9vbGVhbiBmaWVsZHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsYWN0aXZlXFxuMSx0cnVlXFxuMixmYWxzZVwiKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuXG4gICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgaW5mZXJTY2hlbWEocmVzb3VyY2UpXG5cbiAgICBleHBlY3Qoc2NoZW1hPy5maWVsZHM/LlsxXT8udHlwZSkudG9CZShcImJvb2xlYW5cIilcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgZGF0ZSBmaWVsZHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFxuICAgICAgXCJpZCxjcmVhdGVkXFxuMSwyMDI0LTAxLTAxXFxuMiwyMDI0LTAxLTAyXCIsXG4gICAgKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuXG4gICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgaW5mZXJTY2hlbWEocmVzb3VyY2UpXG5cbiAgICBleHBlY3Qoc2NoZW1hPy5maWVsZHM/LlsxXT8udHlwZSkudG9CZShcImRhdGVcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgbWl4ZWQgbnVtZXJpYyB0eXBlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJpZCx2YWx1ZVxcbjEsMTAwXFxuMiwyMDAuNVwiKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuXG4gICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgaW5mZXJTY2hlbWEocmVzb3VyY2UpXG5cbiAgICBleHBlY3Qoc2NoZW1hPy5maWVsZHM/LlsxXT8udHlwZSkudG9CZShcInN0cmluZ1wiKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIHNjaGVtYSBmcm9tIHNpbmdsZSByb3dcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZVxcbjEsYWxpY2VcIilcbiAgICBjb25zdCByZXNvdXJjZSA9IHsgcGF0aDogY3N2UGF0aCwgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0IH1cblxuICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IGluZmVyU2NoZW1hKHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHNjaGVtYSkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChzY2hlbWE/LmZpZWxkcykudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChzY2hlbWE/LmZpZWxkcz8ubGVuZ3RoKS50b0JlKDIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIGVtcHR5IHN0cmluZyB2YWx1ZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFxuICAgICAgXCJpZCxuYW1lLGVtYWlsXFxuMSxhbGljZSxcXG4yLGJvYixib2JAZXhhbXBsZS5jb21cIixcbiAgICApXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XG5cbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCBpbmZlclNjaGVtYShyZXNvdXJjZSlcblxuICAgIGV4cGVjdChzY2hlbWEpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3Qoc2NoZW1hPy5maWVsZHM/Lmxlbmd0aCkudG9CZSgzKVxuICAgIGV4cGVjdChzY2hlbWE/LmZpZWxkcz8uWzJdPy5uYW1lKS50b0JlKFwiZW1haWxcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciBzY2hlbWEgd2l0aCBzYW1wbGVSb3dzIG9wdGlvblwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXG4gICAgICBcImlkLG5hbWVcXG4xLGFsaWNlXFxuMixib2JcXG4zLGNoYXJsaWVcXG40LGRhdmlkXFxuNSxldmVcIixcbiAgICApXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XG5cbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCBpbmZlclNjaGVtYShyZXNvdXJjZSwgeyBzYW1wbGVSb3dzOiAyIH0pXG5cbiAgICBleHBlY3Qoc2NoZW1hKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHNjaGVtYT8uZmllbGRzKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHNjaGVtYT8uZmllbGRzPy5sZW5ndGgpLnRvQmUoMilcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgcmVzb3VyY2VzIHdpdGggaGVhZGVycyBvbmx5XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWUsYWdlXCIpXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XG5cbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCBpbmZlclNjaGVtYShyZXNvdXJjZSlcblxuICAgIGV4cGVjdChzY2hlbWEpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3Qoc2NoZW1hPy5maWVsZHMpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3Qoc2NoZW1hPy5maWVsZHM/Lmxlbmd0aCkudG9CZSgzKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIHNjaGVtYSBmcm9tIGNvbXBsZXggaW5saW5lIGRhdGFcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LXJlc291cmNlXCIsXG4gICAgICB0eXBlOiBcInRhYmxlXCIgYXMgY29uc3QsXG4gICAgICBkYXRhOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgICBuYW1lOiBcImFsaWNlXCIsXG4gICAgICAgICAgc2NvcmU6IDk1LjUsXG4gICAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICAgIGNyZWF0ZWQ6IFwiMjAyNC0wMS0wMVwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IDIsXG4gICAgICAgICAgbmFtZTogXCJib2JcIixcbiAgICAgICAgICBzY29yZTogODcuMyxcbiAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICAgIGNyZWF0ZWQ6IFwiMjAyNC0wMS0wMlwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCBpbmZlclNjaGVtYShyZXNvdXJjZSlcblxuICAgIGV4cGVjdChzY2hlbWEpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3Qoc2NoZW1hPy5maWVsZHM/Lmxlbmd0aCkudG9CZSg1KVxuICAgIGV4cGVjdChzY2hlbWE/LmZpZWxkcz8uZmluZChmID0+IGYubmFtZSA9PT0gXCJpZFwiKT8udHlwZSkudG9CZShcImludGVnZXJcIilcbiAgICBleHBlY3Qoc2NoZW1hPy5maWVsZHM/LmZpbmQoZiA9PiBmLm5hbWUgPT09IFwibmFtZVwiKT8udHlwZSkudG9CZShcInN0cmluZ1wiKVxuICAgIGV4cGVjdChzY2hlbWE/LmZpZWxkcz8uZmluZChmID0+IGYubmFtZSA9PT0gXCJzY29yZVwiKT8udHlwZSkudG9CZShcIm51bWJlclwiKVxuICAgIGV4cGVjdChzY2hlbWE/LmZpZWxkcz8uZmluZChmID0+IGYubmFtZSA9PT0gXCJhY3RpdmVcIik/LnR5cGUpLnRvQmUoXCJib29sZWFuXCIpXG4gICAgZXhwZWN0KHNjaGVtYT8uZmllbGRzPy5maW5kKGYgPT4gZi5uYW1lID09PSBcImNyZWF0ZWRcIik/LnR5cGUpLnRvQmUoXCJkYXRlXCIpXG4gIH0pXG59KVxuIl19
|
package/build/system.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { DatabasePlugin } from "@frictionless-ts/database";
|
|
2
|
+
import { CkanPlugin } from "@frictionless-ts/dataset";
|
|
3
|
+
import { DatahubPlugin } from "@frictionless-ts/dataset";
|
|
4
|
+
import { DescriptorPlugin } from "@frictionless-ts/dataset";
|
|
5
|
+
import { FolderPlugin } from "@frictionless-ts/dataset";
|
|
6
|
+
import { GithubPlugin } from "@frictionless-ts/dataset";
|
|
7
|
+
import { ZenodoPlugin } from "@frictionless-ts/dataset";
|
|
8
|
+
import { ZipPlugin } from "@frictionless-ts/dataset";
|
|
9
|
+
import { CsvPlugin } from "@frictionless-ts/table";
|
|
10
|
+
import { ArrowPlugin } from "@frictionless-ts/table";
|
|
11
|
+
import { InlinePlugin } from "@frictionless-ts/table";
|
|
12
|
+
import { JsonPlugin } from "@frictionless-ts/table";
|
|
13
|
+
import { OdsPlugin } from "@frictionless-ts/table";
|
|
14
|
+
import { ParquetPlugin } from "@frictionless-ts/table";
|
|
15
|
+
import { XlsxPlugin } from "@frictionless-ts/table";
|
|
16
|
+
export class System {
|
|
17
|
+
plugins = [];
|
|
18
|
+
register(PluginClass) {
|
|
19
|
+
this.plugins.unshift(new PluginClass());
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export const system = new System();
|
|
23
|
+
// Dataset
|
|
24
|
+
system.register(CkanPlugin);
|
|
25
|
+
system.register(DatahubPlugin);
|
|
26
|
+
system.register(DescriptorPlugin);
|
|
27
|
+
system.register(GithubPlugin);
|
|
28
|
+
system.register(ZenodoPlugin);
|
|
29
|
+
system.register(FolderPlugin);
|
|
30
|
+
system.register(ZipPlugin);
|
|
31
|
+
// Table
|
|
32
|
+
system.register(ArrowPlugin);
|
|
33
|
+
system.register(CsvPlugin);
|
|
34
|
+
system.register(InlinePlugin);
|
|
35
|
+
system.register(JsonPlugin);
|
|
36
|
+
system.register(OdsPlugin);
|
|
37
|
+
system.register(ParquetPlugin);
|
|
38
|
+
system.register(XlsxPlugin);
|
|
39
|
+
// Mixed
|
|
40
|
+
system.register(DatabasePlugin);
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3lzdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ3hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUN0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFHbkQsTUFBTSxPQUFPLE1BQU07SUFDakIsT0FBTyxHQUFhLEVBQUUsQ0FBQTtJQUV0QixRQUFRLENBQUMsV0FBNkI7UUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxDQUFBO0lBQ3pDLENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFBO0FBRWxDLFVBQVU7QUFFVixNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0FBQzNCLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUE7QUFDOUIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0FBQ2pDLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUE7QUFDN0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQTtBQUM3QixNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFBO0FBQzdCLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUE7QUFFMUIsUUFBUTtBQUVSLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUE7QUFDNUIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUMxQixNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFBO0FBQzdCLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUE7QUFDM0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUMxQixNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0FBQzlCLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUE7QUFFM0IsUUFBUTtBQUVSLE1BQU0sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhYmFzZVBsdWdpbiB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL2RhdGFiYXNlXCJcbmltcG9ydCB7IENrYW5QbHVnaW4gfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9kYXRhc2V0XCJcbmltcG9ydCB7IERhdGFodWJQbHVnaW4gfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9kYXRhc2V0XCJcbmltcG9ydCB7IERlc2NyaXB0b3JQbHVnaW4gfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9kYXRhc2V0XCJcbmltcG9ydCB7IEZvbGRlclBsdWdpbiB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL2RhdGFzZXRcIlxuaW1wb3J0IHsgR2l0aHViUGx1Z2luIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvZGF0YXNldFwiXG5pbXBvcnQgeyBaZW5vZG9QbHVnaW4gfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9kYXRhc2V0XCJcbmltcG9ydCB7IFppcFBsdWdpbiB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL2RhdGFzZXRcIlxuaW1wb3J0IHsgQ3N2UGx1Z2luIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvdGFibGVcIlxuaW1wb3J0IHsgQXJyb3dQbHVnaW4gfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy90YWJsZVwiXG5pbXBvcnQgeyBJbmxpbmVQbHVnaW4gfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy90YWJsZVwiXG5pbXBvcnQgeyBKc29uUGx1Z2luIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvdGFibGVcIlxuaW1wb3J0IHsgT2RzUGx1Z2luIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvdGFibGVcIlxuaW1wb3J0IHsgUGFycXVldFBsdWdpbiB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL3RhYmxlXCJcbmltcG9ydCB7IFhsc3hQbHVnaW4gfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy90YWJsZVwiXG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gXCIuL3BsdWdpbi50c1wiXG5cbmV4cG9ydCBjbGFzcyBTeXN0ZW0ge1xuICBwbHVnaW5zOiBQbHVnaW5bXSA9IFtdXG5cbiAgcmVnaXN0ZXIoUGx1Z2luQ2xhc3M6IG5ldyAoKSA9PiBQbHVnaW4pIHtcbiAgICB0aGlzLnBsdWdpbnMudW5zaGlmdChuZXcgUGx1Z2luQ2xhc3MoKSlcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc3lzdGVtID0gbmV3IFN5c3RlbSgpXG5cbi8vIERhdGFzZXRcblxuc3lzdGVtLnJlZ2lzdGVyKENrYW5QbHVnaW4pXG5zeXN0ZW0ucmVnaXN0ZXIoRGF0YWh1YlBsdWdpbilcbnN5c3RlbS5yZWdpc3RlcihEZXNjcmlwdG9yUGx1Z2luKVxuc3lzdGVtLnJlZ2lzdGVyKEdpdGh1YlBsdWdpbilcbnN5c3RlbS5yZWdpc3RlcihaZW5vZG9QbHVnaW4pXG5zeXN0ZW0ucmVnaXN0ZXIoRm9sZGVyUGx1Z2luKVxuc3lzdGVtLnJlZ2lzdGVyKFppcFBsdWdpbilcblxuLy8gVGFibGVcblxuc3lzdGVtLnJlZ2lzdGVyKEFycm93UGx1Z2luKVxuc3lzdGVtLnJlZ2lzdGVyKENzdlBsdWdpbilcbnN5c3RlbS5yZWdpc3RlcihJbmxpbmVQbHVnaW4pXG5zeXN0ZW0ucmVnaXN0ZXIoSnNvblBsdWdpbilcbnN5c3RlbS5yZWdpc3RlcihPZHNQbHVnaW4pXG5zeXN0ZW0ucmVnaXN0ZXIoUGFycXVldFBsdWdpbilcbnN5c3RlbS5yZWdpc3RlcihYbHN4UGx1Z2luKVxuXG4vLyBNaXhlZFxuXG5zeXN0ZW0ucmVnaXN0ZXIoRGF0YWJhc2VQbHVnaW4pXG4iXX0=
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { loadTable } from "./load.js";
|
|
2
|
+
export { saveTable } from "./save.js";
|
|
3
|
+
export { validateTable } from "./validate.js";
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90YWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3JDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDckMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGxvYWRUYWJsZSB9IGZyb20gXCIuL2xvYWQudHNcIlxuZXhwb3J0IHsgc2F2ZVRhYmxlIH0gZnJvbSBcIi4vc2F2ZS50c1wiXG5leHBvcnQgeyB2YWxpZGF0ZVRhYmxlIH0gZnJvbSBcIi4vdmFsaWRhdGUudHNcIlxuIl19
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Resource } from "@frictionless-ts/metadata";
|
|
2
|
+
export declare function inferTable(resource: Partial<Resource>): Promise<{
|
|
3
|
+
dialect: import("@frictionless-ts/metadata").Dialect;
|
|
4
|
+
schema: import("@frictionless-ts/metadata").Schema;
|
|
5
|
+
table: import("@frictionless-ts/table").Table;
|
|
6
|
+
} | undefined>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { resolveDialect, resolveSchema } from "@frictionless-ts/metadata";
|
|
2
|
+
import { inferSchemaFromTable } from "@frictionless-ts/table";
|
|
3
|
+
import { inferDialect } from "../dialect/index.js";
|
|
4
|
+
import { loadTable } from "./load.js";
|
|
5
|
+
export async function inferTable(resource) {
|
|
6
|
+
let dialect = await resolveDialect(resource.dialect);
|
|
7
|
+
if (!dialect) {
|
|
8
|
+
dialect = await inferDialect(resource);
|
|
9
|
+
}
|
|
10
|
+
const table = await loadTable({ ...resource, dialect }, { denormalized: true });
|
|
11
|
+
if (!table) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
let schema = await resolveSchema(resource.schema);
|
|
15
|
+
if (!schema) {
|
|
16
|
+
schema = await inferSchemaFromTable(table);
|
|
17
|
+
}
|
|
18
|
+
return { dialect, schema, table };
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90YWJsZS9pbmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ3pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBRXJDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsVUFBVSxDQUFDLFFBQTJCO0lBQzFELElBQUksT0FBTyxHQUFHLE1BQU0sY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNwRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLEdBQUcsTUFBTSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDeEMsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sU0FBUyxDQUMzQixFQUFFLEdBQUcsUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUN4QixFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FDdkIsQ0FBQTtJQUVELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFRCxJQUFJLE1BQU0sR0FBRyxNQUFNLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDakQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxHQUFHLE1BQU0sb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDNUMsQ0FBQztJQUVELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFBO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlc291cmNlIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHsgcmVzb2x2ZURpYWxlY3QsIHJlc29sdmVTY2hlbWEgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgeyBpbmZlclNjaGVtYUZyb21UYWJsZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL3RhYmxlXCJcbmltcG9ydCB7IGluZmVyRGlhbGVjdCB9IGZyb20gXCIuLi9kaWFsZWN0L2luZGV4LnRzXCJcbmltcG9ydCB7IGxvYWRUYWJsZSB9IGZyb20gXCIuL2xvYWQudHNcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5mZXJUYWJsZShyZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4pIHtcbiAgbGV0IGRpYWxlY3QgPSBhd2FpdCByZXNvbHZlRGlhbGVjdChyZXNvdXJjZS5kaWFsZWN0KVxuICBpZiAoIWRpYWxlY3QpIHtcbiAgICBkaWFsZWN0ID0gYXdhaXQgaW5mZXJEaWFsZWN0KHJlc291cmNlKVxuICB9XG5cbiAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkVGFibGUoXG4gICAgeyAuLi5yZXNvdXJjZSwgZGlhbGVjdCB9LFxuICAgIHsgZGVub3JtYWxpemVkOiB0cnVlIH0sXG4gIClcblxuICBpZiAoIXRhYmxlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgbGV0IHNjaGVtYSA9IGF3YWl0IHJlc29sdmVTY2hlbWEocmVzb3VyY2Uuc2NoZW1hKVxuICBpZiAoIXNjaGVtYSkge1xuICAgIHNjaGVtYSA9IGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlKVxuICB9XG5cbiAgcmV0dXJuIHsgZGlhbGVjdCwgc2NoZW1hLCB0YWJsZSB9XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { writeTempFile } from "@frictionless-ts/dataset";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { inferTable } from "./infer.js";
|
|
4
|
+
describe("inferTable", () => {
|
|
5
|
+
it("should infer table with dialect and schema from CSV", async () => {
|
|
6
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
7
|
+
const resource = { path: csvPath, format: "csv" };
|
|
8
|
+
const result = await inferTable(resource);
|
|
9
|
+
expect(result).toBeDefined();
|
|
10
|
+
expect(result?.dialect).toBeDefined();
|
|
11
|
+
expect(result?.schema).toBeDefined();
|
|
12
|
+
expect(result?.table).toBeDefined();
|
|
13
|
+
});
|
|
14
|
+
it("should use provided dialect when available", async () => {
|
|
15
|
+
const csvPath = await writeTempFile("id|name\n1|alice\n2|bob");
|
|
16
|
+
const resource = {
|
|
17
|
+
path: csvPath,
|
|
18
|
+
format: "csv",
|
|
19
|
+
dialect: { delimiter: "|" },
|
|
20
|
+
};
|
|
21
|
+
const result = await inferTable(resource);
|
|
22
|
+
expect(result).toBeDefined();
|
|
23
|
+
expect(result?.dialect).toBeDefined();
|
|
24
|
+
expect(result?.dialect.delimiter).toBe("|");
|
|
25
|
+
expect(result?.schema).toBeDefined();
|
|
26
|
+
expect(result?.table).toBeDefined();
|
|
27
|
+
});
|
|
28
|
+
it("should use provided schema when available", async () => {
|
|
29
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
30
|
+
const resource = {
|
|
31
|
+
path: csvPath,
|
|
32
|
+
format: "csv",
|
|
33
|
+
schema: {
|
|
34
|
+
fields: [
|
|
35
|
+
{ name: "id", type: "integer" },
|
|
36
|
+
{ name: "name", type: "string" },
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
const result = await inferTable(resource);
|
|
41
|
+
expect(result).toBeDefined();
|
|
42
|
+
expect(result?.dialect).toBeDefined();
|
|
43
|
+
expect(result?.schema).toBeDefined();
|
|
44
|
+
expect(result?.schema.fields).toHaveLength(2);
|
|
45
|
+
expect(result?.table).toBeDefined();
|
|
46
|
+
});
|
|
47
|
+
it("should infer table with custom delimiter", async () => {
|
|
48
|
+
const csvPath = await writeTempFile("id;name;age\n1;alice;25\n2;bob;30");
|
|
49
|
+
const resource = {
|
|
50
|
+
path: csvPath,
|
|
51
|
+
format: "csv",
|
|
52
|
+
dialect: { delimiter: ";" },
|
|
53
|
+
};
|
|
54
|
+
const result = await inferTable(resource);
|
|
55
|
+
expect(result).toBeDefined();
|
|
56
|
+
expect(result?.dialect).toBeDefined();
|
|
57
|
+
expect(result?.dialect.delimiter).toBe(";");
|
|
58
|
+
expect(result?.schema).toBeDefined();
|
|
59
|
+
expect(result?.table).toBeDefined();
|
|
60
|
+
});
|
|
61
|
+
it("should infer table from inline data", async () => {
|
|
62
|
+
const resource = {
|
|
63
|
+
name: "test-resource",
|
|
64
|
+
type: "table",
|
|
65
|
+
data: [
|
|
66
|
+
{ id: 1, name: "alice" },
|
|
67
|
+
{ id: 2, name: "bob" },
|
|
68
|
+
],
|
|
69
|
+
};
|
|
70
|
+
const result = await inferTable(resource);
|
|
71
|
+
expect(result).toBeDefined();
|
|
72
|
+
expect(result?.dialect).toBeDefined();
|
|
73
|
+
expect(result?.schema).toBeDefined();
|
|
74
|
+
expect(result?.table).toBeDefined();
|
|
75
|
+
});
|
|
76
|
+
it("should infer schema with various data types", async () => {
|
|
77
|
+
const csvPath = await writeTempFile("id,name,score,active\n1,alice,95.5,true\n2,bob,87.3,false");
|
|
78
|
+
const resource = { path: csvPath, format: "csv" };
|
|
79
|
+
const result = await inferTable(resource);
|
|
80
|
+
expect(result).toBeDefined();
|
|
81
|
+
expect(result?.schema).toBeDefined();
|
|
82
|
+
expect(result?.schema.fields).toBeDefined();
|
|
83
|
+
expect(result?.table).toBeDefined();
|
|
84
|
+
});
|
|
85
|
+
it("should infer table with numeric columns", async () => {
|
|
86
|
+
const csvPath = await writeTempFile("id,score\n1,95.5\n2,87.3\n3,100");
|
|
87
|
+
const resource = { path: csvPath, format: "csv" };
|
|
88
|
+
const result = await inferTable(resource);
|
|
89
|
+
expect(result).toBeDefined();
|
|
90
|
+
expect(result?.schema).toBeDefined();
|
|
91
|
+
expect(result?.schema.fields).toBeDefined();
|
|
92
|
+
expect(result?.table).toBeDefined();
|
|
93
|
+
});
|
|
94
|
+
it("should infer table with date columns", async () => {
|
|
95
|
+
const csvPath = await writeTempFile("id,created\n1,2024-01-01\n2,2024-01-02");
|
|
96
|
+
const resource = { path: csvPath, format: "csv" };
|
|
97
|
+
const result = await inferTable(resource);
|
|
98
|
+
expect(result).toBeDefined();
|
|
99
|
+
expect(result?.schema).toBeDefined();
|
|
100
|
+
expect(result?.table).toBeDefined();
|
|
101
|
+
});
|
|
102
|
+
it("should infer table with boolean columns", async () => {
|
|
103
|
+
const csvPath = await writeTempFile("id,active\n1,true\n2,false\n3,true");
|
|
104
|
+
const resource = { path: csvPath, format: "csv" };
|
|
105
|
+
const result = await inferTable(resource);
|
|
106
|
+
expect(result).toBeDefined();
|
|
107
|
+
expect(result?.schema).toBeDefined();
|
|
108
|
+
expect(result?.table).toBeDefined();
|
|
109
|
+
});
|
|
110
|
+
it("should handle table with quoted fields", async () => {
|
|
111
|
+
const csvPath = await writeTempFile('id,name,description\n1,"alice","Test, data"\n2,"bob","Normal"');
|
|
112
|
+
const resource = { path: csvPath, format: "csv" };
|
|
113
|
+
const result = await inferTable(resource);
|
|
114
|
+
expect(result).toBeDefined();
|
|
115
|
+
expect(result?.dialect).toBeDefined();
|
|
116
|
+
expect(result?.schema).toBeDefined();
|
|
117
|
+
expect(result?.table).toBeDefined();
|
|
118
|
+
});
|
|
119
|
+
it("should infer table with single row", async () => {
|
|
120
|
+
const csvPath = await writeTempFile("id,name\n1,alice");
|
|
121
|
+
const resource = { path: csvPath, format: "csv" };
|
|
122
|
+
const result = await inferTable(resource);
|
|
123
|
+
expect(result).toBeDefined();
|
|
124
|
+
expect(result?.dialect).toBeDefined();
|
|
125
|
+
expect(result?.schema).toBeDefined();
|
|
126
|
+
expect(result?.table).toBeDefined();
|
|
127
|
+
});
|
|
128
|
+
it("should infer table with empty values", async () => {
|
|
129
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,");
|
|
130
|
+
const resource = { path: csvPath, format: "csv" };
|
|
131
|
+
const result = await inferTable(resource);
|
|
132
|
+
expect(result).toBeDefined();
|
|
133
|
+
expect(result?.schema).toBeDefined();
|
|
134
|
+
expect(result?.table).toBeDefined();
|
|
135
|
+
});
|
|
136
|
+
it("should infer table with headers only", async () => {
|
|
137
|
+
const csvPath = await writeTempFile("id,name,age");
|
|
138
|
+
const resource = { path: csvPath, format: "csv" };
|
|
139
|
+
const result = await inferTable(resource);
|
|
140
|
+
expect(result).toBeDefined();
|
|
141
|
+
});
|
|
142
|
+
it("should use both provided dialect and schema", async () => {
|
|
143
|
+
const csvPath = await writeTempFile("id|name\n1|alice\n2|bob");
|
|
144
|
+
const resource = {
|
|
145
|
+
path: csvPath,
|
|
146
|
+
format: "csv",
|
|
147
|
+
dialect: { delimiter: "|" },
|
|
148
|
+
schema: {
|
|
149
|
+
fields: [
|
|
150
|
+
{ name: "id", type: "integer" },
|
|
151
|
+
{ name: "name", type: "string" },
|
|
152
|
+
],
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
const result = await inferTable(resource);
|
|
156
|
+
expect(result).toBeDefined();
|
|
157
|
+
expect(result?.dialect).toBeDefined();
|
|
158
|
+
expect(result?.dialect.delimiter).toBe("|");
|
|
159
|
+
expect(result?.schema).toBeDefined();
|
|
160
|
+
expect(result?.schema.fields).toHaveLength(2);
|
|
161
|
+
expect(result?.table).toBeDefined();
|
|
162
|
+
});
|
|
163
|
+
it("should infer table with tab delimiter", async () => {
|
|
164
|
+
const csvPath = await writeTempFile("id\tname\n1\talice\n2\tbob");
|
|
165
|
+
const resource = {
|
|
166
|
+
path: csvPath,
|
|
167
|
+
format: "csv",
|
|
168
|
+
dialect: { delimiter: "\t" },
|
|
169
|
+
};
|
|
170
|
+
const result = await inferTable(resource);
|
|
171
|
+
expect(result).toBeDefined();
|
|
172
|
+
expect(result?.dialect).toBeDefined();
|
|
173
|
+
expect(result?.schema).toBeDefined();
|
|
174
|
+
expect(result?.table).toBeDefined();
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mZXIuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RhYmxlL2luZmVyLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ3hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBRXZDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzFCLEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNuRSxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBO1FBQzlELE1BQU0sUUFBUSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBYyxFQUFFLENBQUE7UUFFMUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFekMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQzVCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7UUFDckMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUNwQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ3JDLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzFELE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFDLHlCQUF5QixDQUFDLENBQUE7UUFDOUQsTUFBTSxRQUFRLEdBQUc7WUFDZixJQUFJLEVBQUUsT0FBTztZQUNiLE1BQU0sRUFBRSxL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dUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNyRCxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO1FBQ2pFLE1BQU0sUUFBUSxHQUFHO1lBQ2YsSUFBSSxFQUFFLE9BQU87WUFDYixNQUFNLEVBQUUsS0FBYztZQUN0QixPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO1NBQzdCLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV6QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7UUFDNUIsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUNyQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQ3BDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDckMsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdyaXRlVGVtcEZpbGUgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9kYXRhc2V0XCJcbmltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyBpbmZlclRhYmxlIH0gZnJvbSBcIi4vaW5mZXIudHNcIlxuXG5kZXNjcmliZShcImluZmVyVGFibGVcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBpbmZlciB0YWJsZSB3aXRoIGRpYWxlY3QgYW5kIHNjaGVtYSBmcm9tIENTVlwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJpZCxuYW1lXFxuMSxhbGljZVxcbjIsYm9iXCIpXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbmZlclRhYmxlKHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChyZXN1bHQ/LmRpYWxlY3QpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0Py5zY2hlbWEpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0Py50YWJsZSkudG9CZURlZmluZWQoKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHVzZSBwcm92aWRlZCBkaWFsZWN0IHdoZW4gYXZhaWxhYmxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkfG5hbWVcXG4xfGFsaWNlXFxuMnxib2JcIilcbiAgICBjb25zdCByZXNvdXJjZSA9IHtcbiAgICAgIHBhdGg6IGNzdlBhdGgsXG4gICAgICBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QsXG4gICAgICBkaWFsZWN0OiB7IGRlbGltaXRlcjogXCJ8XCIgfSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbmZlclRhYmxlKHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChyZXN1bHQ/LmRpYWxlY3QpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0Py5kaWFsZWN0LmRlbGltaXRlcikudG9CZShcInxcIilcbiAgICBleHBlY3QocmVzdWx0Py5zY2hlbWEpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0Py50YWJsZSkudG9CZURlZmluZWQoKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHVzZSBwcm92aWRlZCBzY2hlbWEgd2hlbiBhdmFpbGFibGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZVxcbjEsYWxpY2VcXG4yLGJvYlwiKVxuICAgIGNvbnN0IHJlc291cmNlID0ge1xuICAgICAgcGF0aDogY3N2UGF0aCxcbiAgICAgIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCxcbiAgICAgIHNjaGVtYToge1xuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJpbnRlZ2VyXCIgYXMgY29uc3QgfSxcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIGFzIGNvbnN0IH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGluZmVyVGFibGUocmVzb3VyY2UpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdD8uZGlhbGVjdCkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChyZXN1bHQ/LnNjaGVtYSkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChyZXN1bHQ/LnNjaGVtYS5maWVsZHMpLnRvSGF2ZUxlbmd0aCgyKVxuICAgIGV4cGVjdChyZXN1bHQ/LnRhYmxlKS50b0JlRGVmaW5lZCgpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaW5mZXIgdGFibGUgd2l0aCBjdXN0b20gZGVsaW1pdGVyXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkO25hbWU7YWdlXFxuMTthbGljZTsyNVxcbjI7Ym9iOzMwXCIpXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7XG4gICAgICBwYXRoOiBjc3ZQYXRoLFxuICAgICAgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0LFxuICAgICAgZGlhbGVjdDogeyBkZWxpbWl0ZXI6IFwiO1wiIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJUYWJsZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0Py5kaWFsZWN0KS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdD8uZGlhbGVjdC5kZWxpbWl0ZXIpLnRvQmUoXCI7XCIpXG4gICAgZXhwZWN0KHJlc3VsdD8uc2NoZW1hKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdD8udGFibGUpLnRvQmVEZWZpbmVkKClcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciB0YWJsZSBmcm9tIGlubGluZSBkYXRhXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHtcbiAgICAgIG5hbWU6IFwidGVzdC1yZXNvdXJjZVwiLFxuICAgICAgdHlwZTogXCJ0YWJsZVwiIGFzIGNvbnN0LFxuICAgICAgZGF0YTogW1xuICAgICAgICB7IGlkOiAxLCBuYW1lOiBcImFsaWNlXCIgfSxcbiAgICAgICAgeyBpZDogMiwgbmFtZTogXCJib2JcIiB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbmZlclRhYmxlKHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChyZXN1bHQ/LmRpYWxlY3QpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0Py5zY2hlbWEpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0Py50YWJsZSkudG9CZURlZmluZWQoKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIHNjaGVtYSB3aXRoIHZhcmlvdXMgZGF0YSB0eXBlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXG4gICAgICBcImlkLG5hbWUsc2NvcmUsYWN0aXZlXFxuMSxhbGljZSw5NS41LHRydWVcXG4yLGJvYiw4Ny4zLGZhbHNlXCIsXG4gICAgKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJUYWJsZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0Py5zY2hlbWEpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0Py5zY2hlbWEuZmllbGRzKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdD8udGFibGUpLnRvQmVEZWZpbmVkKClcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciB0YWJsZSB3aXRoIG51bWVyaWMgY29sdW1uc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJpZCxzY29yZVxcbjEsOTUuNVxcbjIsODcuM1xcbjMsMTAwXCIpXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbmZlclRhYmxlKHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChyZXN1bHQ/LnNjaGVtYSkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChyZXN1bHQ/LnNjaGVtYS5maWVsZHMpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0Py50YWJsZSkudG9CZURlZmluZWQoKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIHRhYmxlIHdpdGggZGF0ZSBjb2x1bW5zXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcbiAgICAgIFwiaWQsY3JlYXRlZFxcbjEsMjAyNC0wMS0wMVxcbjIsMjAyNC0wMS0wMlwiLFxuICAgIClcbiAgICBjb25zdCByZXNvdXJjZSA9IHsgcGF0aDogY3N2UGF0aCwgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0IH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGluZmVyVGFibGUocmVzb3VyY2UpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdD8uc2NoZW1hKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdD8udGFibGUpLnRvQmVEZWZpbmVkKClcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciB0YWJsZSB3aXRoIGJvb2xlYW4gY29sdW1uc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJpZCxhY3RpdmVcXG4xLHRydWVcXG4yLGZhbHNlXFxuMyx0cnVlXCIpXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbmZlclRhYmxlKHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChyZXN1bHQ/LnNjaGVtYSkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChyZXN1bHQ/LnRhYmxlKS50b0JlRGVmaW5lZCgpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIHRhYmxlIHdpdGggcXVvdGVkIGZpZWxkc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXG4gICAgICAnaWQsbmFtZSxkZXNjcmlwdGlvblxcbjEsXCJhbGljZVwiLFwiVGVzdCwgZGF0YVwiXFxuMixcImJvYlwiLFwiTm9ybWFsXCInLFxuICAgIClcbiAgICBjb25zdCByZXNvdXJjZSA9IHsgcGF0aDogY3N2UGF0aCwgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0IH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGluZmVyVGFibGUocmVzb3VyY2UpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdD8uZGlhbGVjdCkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChyZXN1bHQ/LnNjaGVtYSkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChyZXN1bHQ/LnRhYmxlKS50b0JlRGVmaW5lZCgpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaW5mZXIgdGFibGUgd2l0aCBzaW5nbGUgcm93XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4xLGFsaWNlXCIpXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbmZlclRhYmxlKHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChyZXN1bHQ/LmRpYWxlY3QpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0Py5zY2hlbWEpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0Py50YWJsZSkudG9CZURlZmluZWQoKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIHRhYmxlIHdpdGggZW1wdHkgdmFsdWVzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4xLGFsaWNlXFxuMixcIilcbiAgICBjb25zdCByZXNvdXJjZSA9IHsgcGF0aDogY3N2UGF0aCwgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0IH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGluZmVyVGFibGUocmVzb3VyY2UpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdD8uc2NoZW1hKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdD8udGFibGUpLnRvQmVEZWZpbmVkKClcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciB0YWJsZSB3aXRoIGhlYWRlcnMgb25seVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJpZCxuYW1lLGFnZVwiKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJUYWJsZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmVEZWZpbmVkKClcbiAgfSlcblxuICBpdChcInNob3VsZCB1c2UgYm90aCBwcm92aWRlZCBkaWFsZWN0IGFuZCBzY2hlbWFcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWR8bmFtZVxcbjF8YWxpY2VcXG4yfGJvYlwiKVxuICAgIGNvbnN0IHJlc291cmNlID0ge1xuICAgICAgcGF0aDogY3N2UGF0aCxcbiAgICAgIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCxcbiAgICAgIGRpYWxlY3Q6IHsgZGVsaW1pdGVyOiBcInxcIiB9LFxuICAgICAgc2NoZW1hOiB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcImludGVnZXJcIiBhcyBjb25zdCB9LFxuICAgICAgICAgIHsgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwic3RyaW5nXCIgYXMgY29uc3QgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJUYWJsZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0Py5kaWFsZWN0KS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdD8uZGlhbGVjdC5kZWxpbWl0ZXIpLnRvQmUoXCJ8XCIpXG4gICAgZXhwZWN0KHJlc3VsdD8uc2NoZW1hKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdD8uc2NoZW1hLmZpZWxkcykudG9IYXZlTGVuZ3RoKDIpXG4gICAgZXhwZWN0KHJlc3VsdD8udGFibGUpLnRvQmVEZWZpbmVkKClcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciB0YWJsZSB3aXRoIHRhYiBkZWxpbWl0ZXJcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWRcXHRuYW1lXFxuMVxcdGFsaWNlXFxuMlxcdGJvYlwiKVxuICAgIGNvbnN0IHJlc291cmNlID0ge1xuICAgICAgcGF0aDogY3N2UGF0aCxcbiAgICAgIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCxcbiAgICAgIGRpYWxlY3Q6IHsgZGVsaW1pdGVyOiBcIlxcdFwiIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJUYWJsZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0Py5kaWFsZWN0KS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdD8uc2NoZW1hKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdD8udGFibGUpLnRvQmVEZWZpbmVkKClcbiAgfSlcbn0pXG4iXX0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { Resource } from "@frictionless-ts/metadata";
|
|
2
|
+
import type { LoadTableOptions } from "@frictionless-ts/table";
|
|
3
|
+
export declare function loadTable(resource: Partial<Resource>, options?: LoadTableOptions): Promise<import("@frictionless-ts/table").Table | undefined>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { system } from "../system.js";
|
|
2
|
+
export async function loadTable(resource, options) {
|
|
3
|
+
for (const plugin of system.plugins) {
|
|
4
|
+
const table = await plugin.loadTable?.(resource, options);
|
|
5
|
+
if (table) {
|
|
6
|
+
return table;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RhYmxlL2xvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUVyQyxNQUFNLENBQUMsS0FBSyxVQUFVLFNBQVMsQ0FDN0IsUUFBMkIsRUFDM0IsT0FBMEI7SUFFMUIsS0FBSyxNQUFNLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ3pELElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixPQUFPLEtBQUssQ0FBQTtRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVzb3VyY2UgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IExvYWRUYWJsZU9wdGlvbnMgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy90YWJsZVwiXG5pbXBvcnQgeyBzeXN0ZW0gfSBmcm9tIFwiLi4vc3lzdGVtLnRzXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRUYWJsZShcbiAgcmVzb3VyY2U6IFBhcnRpYWw8UmVzb3VyY2U+LFxuICBvcHRpb25zPzogTG9hZFRhYmxlT3B0aW9ucyxcbikge1xuICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBzeXN0ZW0ucGx1Z2lucykge1xuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgcGx1Z2luLmxvYWRUYWJsZT8uKHJlc291cmNlLCBvcHRpb25zKVxuICAgIGlmICh0YWJsZSkge1xuICAgICAgcmV0dXJuIHRhYmxlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|