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.
Files changed (69) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +3 -0
  3. package/build/dialect/index.d.ts +1 -0
  4. package/build/dialect/index.js +2 -0
  5. package/build/dialect/infer.d.ts +3 -0
  6. package/build/dialect/infer.js +13 -0
  7. package/build/dialect/infer.spec.d.ts +1 -0
  8. package/build/dialect/infer.spec.js +89 -0
  9. package/build/index.d.ts +19 -0
  10. package/build/index.js +19 -0
  11. package/build/package/index.d.ts +4 -0
  12. package/build/package/index.js +5 -0
  13. package/build/package/infer.d.ts +40 -0
  14. package/build/package/infer.js +13 -0
  15. package/build/package/infer.spec.d.ts +1 -0
  16. package/build/package/infer.spec.js +121 -0
  17. package/build/package/integrity.d.ts +8 -0
  18. package/build/package/integrity.js +69 -0
  19. package/build/package/integrity.spec.d.ts +1 -0
  20. package/build/package/integrity.spec.js +575 -0
  21. package/build/package/load.d.ts +1 -0
  22. package/build/package/load.js +10 -0
  23. package/build/package/load.spec.d.ts +1 -0
  24. package/build/package/load.spec.js +117 -0
  25. package/build/package/save.d.ts +5 -0
  26. package/build/package/save.js +13 -0
  27. package/build/package/save.spec.d.ts +1 -0
  28. package/build/package/save.spec.js +138 -0
  29. package/build/package/validate.d.ts +20 -0
  30. package/build/package/validate.js +62 -0
  31. package/build/package/validate.spec.d.ts +1 -0
  32. package/build/package/validate.spec.js +172 -0
  33. package/build/plugin.d.ts +2 -0
  34. package/build/plugin.js +2 -0
  35. package/build/resource/index.d.ts +2 -0
  36. package/build/resource/index.js +3 -0
  37. package/build/resource/infer.d.ts +22 -0
  38. package/build/resource/infer.js +49 -0
  39. package/build/resource/infer.spec.d.ts +1 -0
  40. package/build/resource/infer.spec.js +164 -0
  41. package/build/resource/validate.d.ts +12 -0
  42. package/build/resource/validate.js +35 -0
  43. package/build/resource/validate.spec.d.ts +1 -0
  44. package/build/resource/validate.spec.js +147 -0
  45. package/build/schema/index.d.ts +1 -0
  46. package/build/schema/index.js +2 -0
  47. package/build/schema/infer.d.ts +3 -0
  48. package/build/schema/infer.js +18 -0
  49. package/build/schema/infer.spec.d.ts +1 -0
  50. package/build/schema/infer.spec.js +136 -0
  51. package/build/system.d.ts +6 -0
  52. package/build/system.js +41 -0
  53. package/build/table/index.d.ts +3 -0
  54. package/build/table/index.js +4 -0
  55. package/build/table/infer.d.ts +6 -0
  56. package/build/table/infer.js +20 -0
  57. package/build/table/infer.spec.d.ts +1 -0
  58. package/build/table/infer.spec.js +177 -0
  59. package/build/table/load.d.ts +3 -0
  60. package/build/table/load.js +11 -0
  61. package/build/table/load.spec.d.ts +1 -0
  62. package/build/table/load.spec.js +121 -0
  63. package/build/table/save.d.ts +2 -0
  64. package/build/table/save.js +11 -0
  65. package/build/table/save.spec.d.ts +1 -0
  66. package/build/table/save.spec.js +189 -0
  67. package/build/table/validate.d.ts +9 -0
  68. package/build/table/validate.js +26 -0
  69. 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
@@ -0,0 +1,6 @@
1
+ import type { Plugin } from "./plugin.ts";
2
+ export declare class System {
3
+ plugins: Plugin[];
4
+ register(PluginClass: new () => Plugin): void;
5
+ }
6
+ export declare const system: System;
@@ -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,3 @@
1
+ export { loadTable } from "./load.ts";
2
+ export { saveTable } from "./save.ts";
3
+ export { validateTable } from "./validate.ts";
@@ -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 {};