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