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,10 @@
1
+ import { system } from "../system.js";
2
+ export async function loadPackage(source) {
3
+ for (const plugin of system.plugins) {
4
+ const result = await plugin.loadPackage?.(source);
5
+ if (result)
6
+ return result;
7
+ }
8
+ throw new Error(`No plugin can load the package: ${source}`);
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3BhY2thZ2UvbG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRXJDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUFDLE1BQWM7SUFDOUMsS0FBSyxNQUFNLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDakQsSUFBSSxNQUFNO1lBQUUsT0FBTyxNQUFNLENBQUE7SUFDM0IsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLE1BQU0sRUFBRSxDQUFDLENBQUE7QUFDOUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHN5c3RlbSB9IGZyb20gXCIuLi9zeXN0ZW0udHNcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFBhY2thZ2Uoc291cmNlOiBzdHJpbmcpIHtcbiAgZm9yIChjb25zdCBwbHVnaW4gb2Ygc3lzdGVtLnBsdWdpbnMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwbHVnaW4ubG9hZFBhY2thZ2U/Lihzb3VyY2UpXG4gICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBObyBwbHVnaW4gY2FuIGxvYWQgdGhlIHBhY2thZ2U6ICR7c291cmNlfWApXG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,117 @@
1
+ import { basename } from "node:path";
2
+ import { writeTempFile } from "@frictionless-ts/dataset";
3
+ import { describe, expect, it } from "vitest";
4
+ import { loadPackage } from "./load.js";
5
+ describe("loadPackage", () => {
6
+ it("should load package from JSON file", async () => {
7
+ const packageContent = JSON.stringify({
8
+ name: "test-package",
9
+ resources: [
10
+ {
11
+ name: "test-resource",
12
+ data: [{ id: 1, name: "alice" }],
13
+ },
14
+ ],
15
+ });
16
+ const packagePath = await writeTempFile(packageContent, {
17
+ filename: "datapackage.json",
18
+ });
19
+ const dataPackage = await loadPackage(packagePath);
20
+ expect(dataPackage).toBeDefined();
21
+ expect(dataPackage.name).toBe("test-package");
22
+ expect(dataPackage.resources).toBeDefined();
23
+ expect(dataPackage.resources.length).toBe(1);
24
+ });
25
+ it("should load package with multiple resources", async () => {
26
+ const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
27
+ const packageContent = JSON.stringify({
28
+ name: "test-package",
29
+ resources: [
30
+ {
31
+ name: "resource-1",
32
+ path: basename(csvPath),
33
+ format: "csv",
34
+ },
35
+ {
36
+ name: "resource-2",
37
+ data: [{ id: 1, value: 100 }],
38
+ },
39
+ ],
40
+ });
41
+ const packagePath = await writeTempFile(packageContent, {
42
+ filename: "datapackage.json",
43
+ });
44
+ const dataPackage = await loadPackage(packagePath);
45
+ expect(dataPackage).toBeDefined();
46
+ expect(dataPackage.name).toBe("test-package");
47
+ expect(dataPackage.resources.length).toBe(2);
48
+ });
49
+ it("should load package with metadata", async () => {
50
+ const packageContent = JSON.stringify({
51
+ name: "test-package",
52
+ title: "Test Package",
53
+ description: "A test data package",
54
+ version: "1.0.0",
55
+ resources: [
56
+ {
57
+ name: "test-resource",
58
+ data: [{ id: 1 }],
59
+ },
60
+ ],
61
+ });
62
+ const packagePath = await writeTempFile(packageContent, {
63
+ filename: "datapackage.json",
64
+ });
65
+ const dataPackage = await loadPackage(packagePath);
66
+ expect(dataPackage.name).toBe("test-package");
67
+ expect(dataPackage.title).toBe("Test Package");
68
+ expect(dataPackage.description).toBe("A test data package");
69
+ expect(dataPackage.version).toBe("1.0.0");
70
+ });
71
+ it("should load package with inline data resources", async () => {
72
+ const packageContent = JSON.stringify({
73
+ name: "test-package",
74
+ resources: [
75
+ {
76
+ name: "test-resource",
77
+ data: [
78
+ { id: 1, name: "alice" },
79
+ { id: 2, name: "bob" },
80
+ ],
81
+ },
82
+ ],
83
+ });
84
+ const packagePath = await writeTempFile(packageContent, {
85
+ filename: "datapackage.json",
86
+ });
87
+ const dataPackage = await loadPackage(packagePath);
88
+ expect(dataPackage).toBeDefined();
89
+ expect(dataPackage.resources?.[0]?.data).toBeDefined();
90
+ });
91
+ it("should load package with schema", async () => {
92
+ const packageContent = JSON.stringify({
93
+ name: "test-package",
94
+ resources: [
95
+ {
96
+ name: "test-resource",
97
+ data: [{ id: 1, name: "alice" }],
98
+ schema: {
99
+ fields: [
100
+ { name: "id", type: "integer" },
101
+ { name: "name", type: "string" },
102
+ ],
103
+ },
104
+ },
105
+ ],
106
+ });
107
+ const packagePath = await writeTempFile(packageContent, {
108
+ filename: "datapackage.json",
109
+ });
110
+ const dataPackage = await loadPackage(packagePath);
111
+ expect(dataPackage.resources?.[0]?.schema).toBeDefined();
112
+ expect(typeof dataPackage.resources?.[0]?.schema === "object" &&
113
+ "fields" in dataPackage.resources[0].schema &&
114
+ dataPackage.resources[0].schema.fields?.length).toBe(2);
115
+ });
116
+ });
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vcGFja2FnZS9sb2FkLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFdkMsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7SUFDM0IsRUFBRSxDQUFDLG9DQUFvQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2xELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDcEMsSUFBSSxFQUFFLGNBQWM7WUFDcEIsU0FBUyxFQUFFO2dCQUNUO29CQUNFLElBQUksRUFBRSxlQUFlO29CQUNyQixJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO2lCQUNqQzthQUNGO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsTUFBTSxXQUFXLEdBQUcsTUFBTSxhQUFhLENBQUMsY0FBYyxFQUFFO1lBQ3RELFFBQVEsRUFBRSxrQkFBa0I7U0FDN0IsQ0FBQyxDQUFBO1FBRUYsTUFBTSxXQUFXLEdBQUcsTUFBTSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFbEQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQ2pDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQzdDLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7UUFDM0MsTUFBTSxDQUFD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QUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUN4RCxNQUFNLENBQ0osT0FBTyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxLQUFLLFFBQVE7WUFDcEQsUUFBUSxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtZQUMzQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUNqRCxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNYLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBiYXNlbmFtZSB9IGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgd3JpdGVUZW1wRmlsZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL2RhdGFzZXRcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGxvYWRQYWNrYWdlIH0gZnJvbSBcIi4vbG9hZC50c1wiXG5cbmRlc2NyaWJlKFwibG9hZFBhY2thZ2VcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBsb2FkIHBhY2thZ2UgZnJvbSBKU09OIGZpbGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhY2thZ2VDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0ZXN0LXJlc291cmNlXCIsXG4gICAgICAgICAgZGF0YTogW3sgaWQ6IDEsIG5hbWU6IFwiYWxpY2VcIiB9XSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSlcblxuICAgIGNvbnN0IHBhY2thZ2VQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShwYWNrYWdlQ29udGVudCwge1xuICAgICAgZmlsZW5hbWU6IFwiZGF0YXBhY2thZ2UuanNvblwiLFxuICAgIH0pXG5cbiAgICBjb25zdCBkYXRhUGFja2FnZSA9IGF3YWl0IGxvYWRQYWNrYWdlKHBhY2thZ2VQYXRoKVxuXG4gICAgZXhwZWN0KGRhdGFQYWNrYWdlKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KGRhdGFQYWNrYWdlLm5hbWUpLnRvQmUoXCJ0ZXN0LXBhY2thZ2VcIilcbiAgICBleHBlY3QoZGF0YVBhY2thZ2UucmVzb3VyY2VzKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KGRhdGFQYWNrYWdlLnJlc291cmNlcy5sZW5ndGgpLnRvQmUoMSlcbiAgfSlcblxuICBpdChcInNob3VsZCBsb2FkIHBhY2thZ2Ugd2l0aCBtdWx0aXBsZSByZXNvdXJjZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZVxcbjEsYWxpY2VcXG4yLGJvYlwiKVxuICAgIGNvbnN0IHBhY2thZ2VDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJyZXNvdXJjZS0xXCIsXG4gICAgICAgICAgcGF0aDogYmFzZW5hbWUoY3N2UGF0aCksXG4gICAgICAgICAgZm9ybWF0OiBcImNzdlwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJyZXNvdXJjZS0yXCIsXG4gICAgICAgICAgZGF0YTogW3sgaWQ6IDEsIHZhbHVlOiAxMDAgfV0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pXG5cbiAgICBjb25zdCBwYWNrYWdlUGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUocGFja2FnZUNvbnRlbnQsIHtcbiAgICAgIGZpbGVuYW1lOiBcImRhdGFwYWNrYWdlLmpzb25cIixcbiAgICB9KVxuXG4gICAgY29uc3QgZGF0YVBhY2thZ2UgPSBhd2FpdCBsb2FkUGFja2FnZShwYWNrYWdlUGF0aClcblxuICAgIGV4cGVjdChkYXRhUGFja2FnZSkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChkYXRhUGFja2FnZS5uYW1lKS50b0JlKFwidGVzdC1wYWNrYWdlXCIpXG4gICAgZXhwZWN0KGRhdGFQYWNrYWdlLnJlc291cmNlcy5sZW5ndGgpLnRvQmUoMilcbiAgfSlcblxuICBpdChcInNob3VsZCBsb2FkIHBhY2thZ2Ugd2l0aCBtZXRhZGF0YVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGFja2FnZUNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgdGl0bGU6IFwiVGVzdCBQYWNrYWdlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJBIHRlc3QgZGF0YSBwYWNrYWdlXCIsXG4gICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwidGVzdC1yZXNvdXJjZVwiLFxuICAgICAgICAgIGRhdGE6IFt7IGlkOiAxIH1dLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KVxuXG4gICAgY29uc3QgcGFja2FnZVBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKHBhY2thZ2VDb250ZW50LCB7XG4gICAgICBmaWxlbmFtZTogXCJkYXRhcGFja2FnZS5qc29uXCIsXG4gICAgfSlcblxuICAgIGNvbnN0IGRhdGFQYWNrYWdlID0gYXdhaXQgbG9hZFBhY2thZ2UocGFja2FnZVBhdGgpXG5cbiAgICBleHBlY3QoZGF0YVBhY2thZ2UubmFtZSkudG9CZShcInRlc3QtcGFja2FnZVwiKVxuICAgIGV4cGVjdChkYXRhUGFja2FnZS50aXRsZSkudG9CZShcIlRlc3QgUGFja2FnZVwiKVxuICAgIGV4cGVjdChkYXRhUGFja2FnZS5kZXNjcmlwdGlvbikudG9CZShcIkEgdGVzdCBkYXRhIHBhY2thZ2VcIilcbiAgICBleHBlY3QoZGF0YVBhY2thZ2UudmVyc2lvbikudG9CZShcIjEuMC4wXCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbG9hZCBwYWNrYWdlIHdpdGggaW5saW5lIGRhdGEgcmVzb3VyY2VzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYWNrYWdlQ29udGVudCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIG5hbWU6IFwidGVzdC1wYWNrYWdlXCIsXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwidGVzdC1yZXNvdXJjZVwiLFxuICAgICAgICAgIGRhdGE6IFtcbiAgICAgICAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiYWxpY2VcIiB9LFxuICAgICAgICAgICAgeyBpZDogMiwgbmFtZTogXCJib2JcIiB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pXG5cbiAgICBjb25zdCBwYWNrYWdlUGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUocGFja2FnZUNvbnRlbnQsIHtcbiAgICAgIGZpbGVuYW1lOiBcImRhdGFwYWNrYWdlLmpzb25cIixcbiAgICB9KVxuXG4gICAgY29uc3QgZGF0YVBhY2thZ2UgPSBhd2FpdCBsb2FkUGFja2FnZShwYWNrYWdlUGF0aClcblxuICAgIGV4cGVjdChkYXRhUGFja2FnZSkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChkYXRhUGFja2FnZS5yZXNvdXJjZXM/LlswXT8uZGF0YSkudG9CZURlZmluZWQoKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGxvYWQgcGFja2FnZSB3aXRoIHNjaGVtYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGFja2FnZUNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInRlc3QtcmVzb3VyY2VcIixcbiAgICAgICAgICBkYXRhOiBbeyBpZDogMSwgbmFtZTogXCJhbGljZVwiIH1dLFxuICAgICAgICAgIHNjaGVtYToge1xuICAgICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcImludGVnZXJcIiB9LFxuICAgICAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pXG5cbiAgICBjb25zdCBwYWNrYWdlUGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUocGFja2FnZUNvbnRlbnQsIHtcbiAgICAgIGZpbGVuYW1lOiBcImRhdGFwYWNrYWdlLmpzb25cIixcbiAgICB9KVxuXG4gICAgY29uc3QgZGF0YVBhY2thZ2UgPSBhd2FpdCBsb2FkUGFja2FnZShwYWNrYWdlUGF0aClcblxuICAgIGV4cGVjdChkYXRhUGFja2FnZS5yZXNvdXJjZXM/LlswXT8uc2NoZW1hKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KFxuICAgICAgdHlwZW9mIGRhdGFQYWNrYWdlLnJlc291cmNlcz8uWzBdPy5zY2hlbWEgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgXCJmaWVsZHNcIiBpbiBkYXRhUGFja2FnZS5yZXNvdXJjZXNbMF0uc2NoZW1hICYmXG4gICAgICAgIGRhdGFQYWNrYWdlLnJlc291cmNlc1swXS5zY2hlbWEuZmllbGRzPy5sZW5ndGgsXG4gICAgKS50b0JlKDIpXG4gIH0pXG59KVxuIl19
@@ -0,0 +1,5 @@
1
+ import type { SavePackageOptions } from "@frictionless-ts/dataset";
2
+ import type { Package } from "@frictionless-ts/metadata";
3
+ export declare function savePackage(dataPackage: Package, options: SavePackageOptions): Promise<{
4
+ path?: string;
5
+ }>;
@@ -0,0 +1,13 @@
1
+ import { system } from "../system.js";
2
+ export async function savePackage(dataPackage, options) {
3
+ for (const plugin of system.plugins) {
4
+ const result = await plugin.savePackage?.(dataPackage, {
5
+ plugins: system.plugins,
6
+ ...options,
7
+ });
8
+ if (result)
9
+ return result;
10
+ }
11
+ throw new Error(`No plugin can save the package: ${options.target}`);
12
+ }
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3BhY2thZ2Uvc2F2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRXJDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUMvQixXQUFvQixFQUNwQixPQUEyQjtJQUUzQixLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDckQsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLEdBQUcsT0FBTztTQUNYLENBQUMsQ0FBQTtRQUVGLElBQUksTUFBTTtZQUFFLE9BQU8sTUFBTSxDQUFBO0lBQzNCLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtBQUN0RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTYXZlUGFja2FnZU9wdGlvbnMgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9kYXRhc2V0XCJcbmltcG9ydCB0eXBlIHsgUGFja2FnZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB7IHN5c3RlbSB9IGZyb20gXCIuLi9zeXN0ZW0udHNcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZVBhY2thZ2UoXG4gIGRhdGFQYWNrYWdlOiBQYWNrYWdlLFxuICBvcHRpb25zOiBTYXZlUGFja2FnZU9wdGlvbnMsXG4pIHtcbiAgZm9yIChjb25zdCBwbHVnaW4gb2Ygc3lzdGVtLnBsdWdpbnMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwbHVnaW4uc2F2ZVBhY2thZ2U/LihkYXRhUGFja2FnZSwge1xuICAgICAgcGx1Z2luczogc3lzdGVtLnBsdWdpbnMsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pXG5cbiAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBsdWdpbiBjYW4gc2F2ZSB0aGUgcGFja2FnZTogJHtvcHRpb25zLnRhcmdldH1gKVxufVxuIl19
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,138 @@
1
+ import { access } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { writeTempFile } from "@frictionless-ts/dataset";
4
+ import { getTempFolderPath } from "@frictionless-ts/dataset";
5
+ import { describe, expect, it } from "vitest";
6
+ import { loadPackage } from "./load.js";
7
+ import { savePackage } from "./save.js";
8
+ describe("savePackage", () => {
9
+ it("should save package to datapackage.json file", async () => {
10
+ const packageContent = JSON.stringify({
11
+ name: "test-package",
12
+ resources: [
13
+ {
14
+ name: "test-resource",
15
+ data: [{ id: 1, name: "alice" }],
16
+ },
17
+ ],
18
+ });
19
+ const packagePath = await writeTempFile(packageContent, {
20
+ filename: "datapackage.json",
21
+ });
22
+ const dataPackage = await loadPackage(packagePath);
23
+ const tempDir = getTempFolderPath();
24
+ const targetPath = join(tempDir, "datapackage.json");
25
+ await savePackage(dataPackage, {
26
+ target: targetPath,
27
+ });
28
+ expect(await access(targetPath)
29
+ .then(() => true)
30
+ .catch(() => false)).toBe(true);
31
+ });
32
+ it("should save package with multiple resources", async () => {
33
+ const packageContent = JSON.stringify({
34
+ name: "test-package",
35
+ resources: [
36
+ {
37
+ name: "resource-1",
38
+ data: [{ id: 1, name: "alice" }],
39
+ },
40
+ {
41
+ name: "resource-2",
42
+ data: [{ id: 2, value: 100 }],
43
+ },
44
+ ],
45
+ });
46
+ const packagePath = await writeTempFile(packageContent, {
47
+ filename: "datapackage.json",
48
+ });
49
+ const dataPackage = await loadPackage(packagePath);
50
+ const tempDir = getTempFolderPath();
51
+ const targetPath = join(tempDir, "datapackage.json");
52
+ await savePackage(dataPackage, {
53
+ target: targetPath,
54
+ });
55
+ expect(await access(targetPath)
56
+ .then(() => true)
57
+ .catch(() => false)).toBe(true);
58
+ });
59
+ it("should save and reload package with same structure", async () => {
60
+ const packageContent = JSON.stringify({
61
+ name: "test-package",
62
+ title: "Test Package",
63
+ resources: [
64
+ {
65
+ name: "test-resource",
66
+ data: [{ id: 1, name: "alice" }],
67
+ },
68
+ ],
69
+ });
70
+ const packagePath = await writeTempFile(packageContent, {
71
+ filename: "datapackage.json",
72
+ });
73
+ const originalPackage = await loadPackage(packagePath);
74
+ const tempDir = getTempFolderPath();
75
+ const targetPath = join(tempDir, "datapackage.json");
76
+ await savePackage(originalPackage, { target: targetPath });
77
+ const reloadedPackage = await loadPackage(targetPath);
78
+ expect(reloadedPackage).toBeDefined();
79
+ expect(reloadedPackage.name).toBe("test-package");
80
+ expect(reloadedPackage.title).toBe("Test Package");
81
+ });
82
+ it("should save package with metadata", async () => {
83
+ const packageContent = JSON.stringify({
84
+ name: "test-package",
85
+ title: "Test Package",
86
+ description: "A test package",
87
+ version: "1.0.0",
88
+ resources: [
89
+ {
90
+ name: "test-resource",
91
+ data: [{ id: 1 }],
92
+ },
93
+ ],
94
+ });
95
+ const packagePath = await writeTempFile(packageContent, {
96
+ filename: "datapackage.json",
97
+ });
98
+ const dataPackage = await loadPackage(packagePath);
99
+ const tempDir = getTempFolderPath();
100
+ const targetPath = join(tempDir, "datapackage.json");
101
+ await savePackage(dataPackage, {
102
+ target: targetPath,
103
+ });
104
+ expect(await access(targetPath)
105
+ .then(() => true)
106
+ .catch(() => false)).toBe(true);
107
+ });
108
+ it("should save package with schema", async () => {
109
+ const packageContent = JSON.stringify({
110
+ name: "test-package",
111
+ resources: [
112
+ {
113
+ name: "test-resource",
114
+ data: [{ id: 1, name: "alice" }],
115
+ schema: {
116
+ fields: [
117
+ { name: "id", type: "integer" },
118
+ { name: "name", type: "string" },
119
+ ],
120
+ },
121
+ },
122
+ ],
123
+ });
124
+ const packagePath = await writeTempFile(packageContent, {
125
+ filename: "datapackage.json",
126
+ });
127
+ const dataPackage = await loadPackage(packagePath);
128
+ const tempDir = getTempFolderPath();
129
+ const targetPath = join(tempDir, "datapackage.json");
130
+ await savePackage(dataPackage, {
131
+ target: targetPath,
132
+ });
133
+ expect(await access(targetPath)
134
+ .then(() => true)
135
+ .catch(() => false)).toBe(true);
136
+ });
137
+ });
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vcGFja2FnZS9zYXZlLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDaEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ3hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3ZDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFdkMsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7SUFDM0IsRUFBRSxDQUFDLDhDQUE4QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDcEMsSUFBSSxFQUFFLGNBQWM7WUFDcEIsU0FBUyxFQUFFO2dCQUNUO29CQUNFLElBQUksRUFBRSxlQUFlO29CQUNyQixJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO2lCQUNqQzthQUNGO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsTUFBTSxXQUFXLEdBQUcsTUFBTSxhQUFhLENBQUMsY0FBYyxFQUFFO1lBQ3RELFFBQVEsRUFBRSxrQkFBa0I7U0FDN0IsQ0FBQyxDQUFBO1FBRUYsTUFBTSxXQUFXLEdBQUcsTUFBTSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDbEQsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQTtRQUNuQyxNQUFNLFVBQVUs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bnQiOlsiaW1wb3J0IHsgYWNjZXNzIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgd3JpdGVUZW1wRmlsZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL2RhdGFzZXRcIlxuaW1wb3J0IHsgZ2V0VGVtcEZvbGRlclBhdGggfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9kYXRhc2V0XCJcbmltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyBsb2FkUGFja2FnZSB9IGZyb20gXCIuL2xvYWQudHNcIlxuaW1wb3J0IHsgc2F2ZVBhY2thZ2UgfSBmcm9tIFwiLi9zYXZlLnRzXCJcblxuZGVzY3JpYmUoXCJzYXZlUGFja2FnZVwiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIHNhdmUgcGFja2FnZSB0byBkYXRhcGFja2FnZS5qc29uIGZpbGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhY2thZ2VDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0ZXN0LXJlc291cmNlXCIsXG4gICAgICAgICAgZGF0YTogW3sgaWQ6IDEsIG5hbWU6IFwiYWxpY2VcIiB9XSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSlcblxuICAgIGNvbnN0IHBhY2thZ2VQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShwYWNrYWdlQ29udGVudCwge1xuICAgICAgZmlsZW5hbWU6IFwiZGF0YXBhY2thZ2UuanNvblwiLFxuICAgIH0pXG5cbiAgICBjb25zdCBkYXRhUGFja2FnZSA9IGF3YWl0IGxvYWRQYWNrYWdlKHBhY2thZ2VQYXRoKVxuICAgIGNvbnN0IHRlbXBEaXIgPSBnZXRUZW1wRm9sZGVyUGF0aCgpXG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IGpvaW4odGVtcERpciwgXCJkYXRhcGFja2FnZS5qc29uXCIpXG5cbiAgICBhd2FpdCBzYXZlUGFja2FnZShkYXRhUGFja2FnZSwge1xuICAgICAgdGFyZ2V0OiB0YXJnZXRQYXRoLFxuICAgIH0pXG5cbiAgICBleHBlY3QoXG4gICAgICBhd2FpdCBhY2Nlc3ModGFyZ2V0UGF0aClcbiAgICAgICAgLnRoZW4oKCkgPT4gdHJ1ZSlcbiAgICAgICAgLmNhdGNoKCgpID0+IGZhbHNlKSxcbiAgICApLnRvQmUodHJ1ZSlcbiAgfSlcblxuICBpdChcInNob3VsZCBzYXZlIHBhY2thZ2Ugd2l0aCBtdWx0aXBsZSByZXNvdXJjZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhY2thZ2VDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJyZXNvdXJjZS0xXCIsXG4gICAgICAgICAgZGF0YTogW3sgaWQ6IDEsIG5hbWU6IFwiYWxpY2VcIiB9XSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwicmVzb3VyY2UtMlwiLFxuICAgICAgICAgIGRhdGE6IFt7IGlkOiAyLCB2YWx1ZTogMTAwIH1dLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KVxuXG4gICAgY29uc3QgcGFja2FnZVBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKHBhY2thZ2VDb250ZW50LCB7XG4gICAgICBmaWxlbmFtZTogXCJkYXRhcGFja2FnZS5qc29uXCIsXG4gICAgfSlcblxuICAgIGNvbnN0IGRhdGFQYWNrYWdlID0gYXdhaXQgbG9hZFBhY2thZ2UocGFja2FnZVBhdGgpXG4gICAgY29uc3QgdGVtcERpciA9IGdldFRlbXBGb2xkZXJQYXRoKClcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gam9pbih0ZW1wRGlyLCBcImRhdGFwYWNrYWdlLmpzb25cIilcblxuICAgIGF3YWl0IHNhdmVQYWNrYWdlKGRhdGFQYWNrYWdlLCB7XG4gICAgICB0YXJnZXQ6IHRhcmdldFBhdGgsXG4gICAgfSlcblxuICAgIGV4cGVjdChcbiAgICAgIGF3YWl0IGFjY2Vzcyh0YXJnZXRQYXRoKVxuICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAuY2F0Y2goKCkgPT4gZmFsc2UpLFxuICAgICkudG9CZSh0cnVlKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHNhdmUgYW5kIHJlbG9hZCBwYWNrYWdlIHdpdGggc2FtZSBzdHJ1Y3R1cmVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhY2thZ2VDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgIHRpdGxlOiBcIlRlc3QgUGFja2FnZVwiLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInRlc3QtcmVzb3VyY2VcIixcbiAgICAgICAgICBkYXRhOiBbeyBpZDogMSwgbmFtZTogXCJhbGljZVwiIH1dLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KVxuXG4gICAgY29uc3QgcGFja2FnZVBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKHBhY2thZ2VDb250ZW50LCB7XG4gICAgICBmaWxlbmFtZTogXCJkYXRhcGFja2FnZS5qc29uXCIsXG4gICAgfSlcblxuICAgIGNvbnN0IG9yaWdpbmFsUGFja2FnZSA9IGF3YWl0IGxvYWRQYWNrYWdlKHBhY2thZ2VQYXRoKVxuICAgIGNvbnN0IHRlbXBEaXIgPSBnZXRUZW1wRm9sZGVyUGF0aCgpXG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IGpvaW4odGVtcERpciwgXCJkYXRhcGFja2FnZS5qc29uXCIpXG5cbiAgICBhd2FpdCBzYXZlUGFja2FnZShvcmlnaW5hbFBhY2thZ2UsIHsgdGFyZ2V0OiB0YXJnZXRQYXRoIH0pXG4gICAgY29uc3QgcmVsb2FkZWRQYWNrYWdlID0gYXdhaXQgbG9hZFBhY2thZ2UodGFyZ2V0UGF0aClcblxuICAgIGV4cGVjdChyZWxvYWRlZFBhY2thZ2UpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QocmVsb2FkZWRQYWNrYWdlLm5hbWUpLnRvQmUoXCJ0ZXN0LXBhY2thZ2VcIilcbiAgICBleHBlY3QocmVsb2FkZWRQYWNrYWdlLnRpdGxlKS50b0JlKFwiVGVzdCBQYWNrYWdlXCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc2F2ZSBwYWNrYWdlIHdpdGggbWV0YWRhdGFcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhY2thZ2VDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgIHRpdGxlOiBcIlRlc3QgUGFja2FnZVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiQSB0ZXN0IHBhY2thZ2VcIixcbiAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0ZXN0LXJlc291cmNlXCIsXG4gICAgICAgICAgZGF0YTogW3sgaWQ6IDEgfV0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pXG5cbiAgICBjb25zdCBwYWNrYWdlUGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUocGFja2FnZUNvbnRlbnQsIHtcbiAgICAgIGZpbGVuYW1lOiBcImRhdGFwYWNrYWdlLmpzb25cIixcbiAgICB9KVxuXG4gICAgY29uc3QgZGF0YVBhY2thZ2UgPSBhd2FpdCBsb2FkUGFja2FnZShwYWNrYWdlUGF0aClcbiAgICBjb25zdCB0ZW1wRGlyID0gZ2V0VGVtcEZvbGRlclBhdGgoKVxuICAgIGNvbnN0IHRhcmdldFBhdGggPSBqb2luKHRlbXBEaXIsIFwiZGF0YXBhY2thZ2UuanNvblwiKVxuXG4gICAgYXdhaXQgc2F2ZVBhY2thZ2UoZGF0YVBhY2thZ2UsIHtcbiAgICAgIHRhcmdldDogdGFyZ2V0UGF0aCxcbiAgICB9KVxuXG4gICAgZXhwZWN0KFxuICAgICAgYXdhaXQgYWNjZXNzKHRhcmdldFBhdGgpXG4gICAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAgIC5jYXRjaCgoKSA9PiBmYWxzZSksXG4gICAgKS50b0JlKHRydWUpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc2F2ZSBwYWNrYWdlIHdpdGggc2NoZW1hXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYWNrYWdlQ29udGVudCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIG5hbWU6IFwidGVzdC1wYWNrYWdlXCIsXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwidGVzdC1yZXNvdXJjZVwiLFxuICAgICAgICAgIGRhdGE6IFt7IGlkOiAxLCBuYW1lOiBcImFsaWNlXCIgfV0sXG4gICAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwiaW50ZWdlclwiIH0sXG4gICAgICAgICAgICAgIHsgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSlcblxuICAgIGNvbnN0IHBhY2thZ2VQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShwYWNrYWdlQ29udGVudCwge1xuICAgICAgZmlsZW5hbWU6IFwiZGF0YXBhY2thZ2UuanNvblwiLFxuICAgIH0pXG5cbiAgICBjb25zdCBkYXRhUGFja2FnZSA9IGF3YWl0IGxvYWRQYWNrYWdlKHBhY2thZ2VQYXRoKVxuICAgIGNvbnN0IHRlbXBEaXIgPSBnZXRUZW1wRm9sZGVyUGF0aCgpXG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IGpvaW4odGVtcERpciwgXCJkYXRhcGFja2FnZS5qc29uXCIpXG5cbiAgICBhd2FpdCBzYXZlUGFja2FnZShkYXRhUGFja2FnZSwge1xuICAgICAgdGFyZ2V0OiB0YXJnZXRQYXRoLFxuICAgIH0pXG5cbiAgICBleHBlY3QoXG4gICAgICBhd2FpdCBhY2Nlc3ModGFyZ2V0UGF0aClcbiAgICAgICAgLnRoZW4oKCkgPT4gdHJ1ZSlcbiAgICAgICAgLmNhdGNoKCgpID0+IGZhbHNlKSxcbiAgICApLnRvQmUodHJ1ZSlcbiAgfSlcbn0pXG4iXX0=
@@ -0,0 +1,20 @@
1
+ import type { BoundError } from "@frictionless-ts/metadata";
2
+ import type { Descriptor, Package } from "@frictionless-ts/metadata";
3
+ export declare function validatePackage(source: string | Descriptor | Partial<Package>, options?: {
4
+ basepath?: string;
5
+ }): Promise<{
6
+ errors: BoundError[];
7
+ valid: boolean;
8
+ } | {
9
+ valid: boolean;
10
+ errors: {
11
+ resource: undefined;
12
+ type: "metadata";
13
+ pointer: string;
14
+ message: string;
15
+ }[];
16
+ }>;
17
+ export declare function validatePackageData(dataPackage: Package): Promise<{
18
+ errors: BoundError[];
19
+ valid: boolean;
20
+ }>;
@@ -0,0 +1,62 @@
1
+ import os from "node:os";
2
+ import { createReport } from "@frictionless-ts/metadata";
3
+ import { loadDescriptor, validatePackageMetadata, } from "@frictionless-ts/metadata";
4
+ import { resolveBasepath } from "@frictionless-ts/metadata";
5
+ import pAll from "p-all";
6
+ import { validateResourceData } from "../resource/index.js";
7
+ import { system } from "../system.js";
8
+ import { validatePackageIntegrity } from "./integrity.js";
9
+ export async function validatePackage(source, options) {
10
+ let descriptor;
11
+ let basepath = options?.basepath;
12
+ if (typeof source !== "string") {
13
+ descriptor = source;
14
+ }
15
+ else {
16
+ for (const plugin of system.plugins) {
17
+ const result = await plugin.loadPackage?.(source);
18
+ if (result) {
19
+ descriptor = result;
20
+ break;
21
+ }
22
+ }
23
+ if (!descriptor) {
24
+ basepath = await resolveBasepath(source);
25
+ descriptor = await loadDescriptor(source);
26
+ }
27
+ }
28
+ const metadataReport = await validatePackageMetadata(descriptor, {
29
+ basepath,
30
+ });
31
+ if (!metadataReport.dataPackage) {
32
+ return {
33
+ valid: metadataReport.valid,
34
+ errors: metadataReport.errors.map(error => ({
35
+ ...error,
36
+ resource: undefined,
37
+ })),
38
+ };
39
+ }
40
+ const dataReport = await validatePackageData(metadataReport.dataPackage);
41
+ const integrityReport = await validatePackageIntegrity(metadataReport.dataPackage);
42
+ const errors = [...dataReport.errors, ...integrityReport.errors];
43
+ return createReport(errors);
44
+ }
45
+ export async function validatePackageData(dataPackage) {
46
+ const concurrency = os.cpus().length;
47
+ const errors = (await pAll(dataPackage.resources.map(resource => async () => {
48
+ try {
49
+ const report = await validateResourceData(resource);
50
+ return report.errors.map(error => ({
51
+ ...error,
52
+ resource: resource.name,
53
+ }));
54
+ }
55
+ catch (error) {
56
+ const message = error instanceof Error ? error.message : String(error);
57
+ throw new Error(`[${resource.name}] ${message}`);
58
+ }
59
+ }), { concurrency })).flat();
60
+ return createReport(errors);
61
+ }
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9wYWNrYWdlL3ZhbGlkYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUV4QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFFeEQsT0FBTyxFQUNMLGNBQWMsRUFDZCx1QkFBdUIsR0FDeEIsTUFBTSwyQkFBMkIsQ0FBQTtBQUNsQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFDM0QsT0FBTyxJQUFJLE1BQU0sT0FBTyxDQUFBO0FBQ3hCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQzNELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDckMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFekQsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQ25DLE1BQThDLEVBQzlDLE9BQStCO0lBRS9CLElBQUksVUFBa0MsQ0FBQTtJQUN0QyxJQUFJLFFBQVEsR0FBRyxPQUFPLEVBQUUsUUFBUSxDQUFBO0lBRWhDLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDL0IsVUFBVSxHQUFHLE1BQU0sQ0FBQTtJQUNyQixDQUFDO1NBQU0sQ0FBQztRQUNOLEtBQUssTUFBTSxNQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BDLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ2pELElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsVUFBVSxHQUFHLE1BQStCLENBQUE7Z0JBQzVDLE1BQUs7WUFDUCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDeEMsVUFBVSxHQUFHLE1BQU0sY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzNDLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQyxVQUFVLEVBQUU7UUFDL0QsUUFBUTtLQUNULENBQUMsQ0FBQTtJQUVGLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsT0FBTztZQUNMLEtBQUssRUFBRSxjQUFjLENBQUMsS0FBSztZQUMzQixNQUFNLEVBQUUsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUMxQyxHQUFHLEtBQUs7Z0JBQ1IsUUFBUSxFQUFFLFNBQVM7YUFDcEIsQ0FBQyxDQUFDO1NBQ0osQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxNQUFNLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUN4RSxNQUFNLGVBQWUsR0FBRyxNQUFNLHdCQUF3QixDQUNwRCxjQUFjLENBQUMsV0FBVyxDQUMzQixDQUFBO0lBRUQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDaEUsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDN0IsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CLENBQUMsV0FBb0I7SUFDNUQsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQTtJQUVwQyxNQUFNLE1BQU0sR0FBaUIsQ0FDM0IsTUFBTSxJQUFJLENBQ1IsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUMvQyxJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ25ELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNqQyxHQUFHLEtBQUs7Z0JBQ1IsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2FBQ3hCLENBQUMsQ0FBQyxDQUFBO1FBQ0wsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLE9BQU8sR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDdEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUNsRCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLEVBQ0YsRUFBRSxXQUFXLEVBQUUsQ0FDaEIsQ0FDRixDQUFDLElBQUksRUFBRSxDQUFBO0lBRVIsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBvcyBmcm9tIFwibm9kZTpvc1wiXG5pbXBvcnQgdHlwZSB7IEJvdW5kRXJyb3IgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgeyBjcmVhdGVSZXBvcnQgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IERlc2NyaXB0b3IsIFBhY2thZ2UgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQge1xuICBsb2FkRGVzY3JpcHRvcixcbiAgdmFsaWRhdGVQYWNrYWdlTWV0YWRhdGEsXG59IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB7IHJlc29sdmVCYXNlcGF0aCB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCBwQWxsIGZyb20gXCJwLWFsbFwiXG5pbXBvcnQgeyB2YWxpZGF0ZVJlc291cmNlRGF0YSB9IGZyb20gXCIuLi9yZXNvdXJjZS9pbmRleC50c1wiXG5pbXBvcnQgeyBzeXN0ZW0gfSBmcm9tIFwiLi4vc3lzdGVtLnRzXCJcbmltcG9ydCB7IHZhbGlkYXRlUGFja2FnZUludGVncml0eSB9IGZyb20gXCIuL2ludGVncml0eS50c1wiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZVBhY2thZ2UoXG4gIHNvdXJjZTogc3RyaW5nIHwgRGVzY3JpcHRvciB8IFBhcnRpYWw8UGFja2FnZT4sXG4gIG9wdGlvbnM/OiB7IGJhc2VwYXRoPzogc3RyaW5nIH0sXG4pIHtcbiAgbGV0IGRlc2NyaXB0b3I6IERlc2NyaXB0b3IgfCB1bmRlZmluZWRcbiAgbGV0IGJhc2VwYXRoID0gb3B0aW9ucz8uYmFzZXBhdGhcblxuICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIGRlc2NyaXB0b3IgPSBzb3VyY2VcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBzeXN0ZW0ucGx1Z2lucykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGx1Z2luLmxvYWRQYWNrYWdlPy4oc291cmNlKVxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBkZXNjcmlwdG9yID0gcmVzdWx0IGFzIHVua25vd24gYXMgRGVzY3JpcHRvclxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghZGVzY3JpcHRvcikge1xuICAgICAgYmFzZXBhdGggPSBhd2FpdCByZXNvbHZlQmFzZXBhdGgoc291cmNlKVxuICAgICAgZGVzY3JpcHRvciA9IGF3YWl0IGxvYWREZXNjcmlwdG9yKHNvdXJjZSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBtZXRhZGF0YVJlcG9ydCA9IGF3YWl0IHZhbGlkYXRlUGFja2FnZU1ldGFkYXRhKGRlc2NyaXB0b3IsIHtcbiAgICBiYXNlcGF0aCxcbiAgfSlcblxuICBpZiAoIW1ldGFkYXRhUmVwb3J0LmRhdGFQYWNrYWdlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkOiBtZXRhZGF0YVJlcG9ydC52YWxpZCxcbiAgICAgIGVycm9yczogbWV0YWRhdGFSZXBvcnQuZXJyb3JzLm1hcChlcnJvciA9PiAoe1xuICAgICAgICAuLi5lcnJvcixcbiAgICAgICAgcmVzb3VyY2U6IHVuZGVmaW5lZCxcbiAgICAgIH0pKSxcbiAgICB9XG4gIH1cblxuICBjb25zdCBkYXRhUmVwb3J0ID0gYXdhaXQgdmFsaWRhdGVQYWNrYWdlRGF0YShtZXRhZGF0YVJlcG9ydC5kYXRhUGFja2FnZSlcbiAgY29uc3QgaW50ZWdyaXR5UmVwb3J0ID0gYXdhaXQgdmFsaWRhdGVQYWNrYWdlSW50ZWdyaXR5KFxuICAgIG1ldGFkYXRhUmVwb3J0LmRhdGFQYWNrYWdlLFxuICApXG5cbiAgY29uc3QgZXJyb3JzID0gWy4uLmRhdGFSZXBvcnQuZXJyb3JzLCAuLi5pbnRlZ3JpdHlSZXBvcnQuZXJyb3JzXVxuICByZXR1cm4gY3JlYXRlUmVwb3J0KGVycm9ycylcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlUGFja2FnZURhdGEoZGF0YVBhY2thZ2U6IFBhY2thZ2UpIHtcbiAgY29uc3QgY29uY3VycmVuY3kgPSBvcy5jcHVzKCkubGVuZ3RoXG5cbiAgY29uc3QgZXJyb3JzOiBCb3VuZEVycm9yW10gPSAoXG4gICAgYXdhaXQgcEFsbChcbiAgICAgIGRhdGFQYWNrYWdlLnJlc291cmNlcy5tYXAocmVzb3VyY2UgPT4gYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlcG9ydCA9IGF3YWl0IHZhbGlkYXRlUmVzb3VyY2VEYXRhKHJlc291cmNlKVxuICAgICAgICAgIHJldHVybiByZXBvcnQuZXJyb3JzLm1hcChlcnJvciA9PiAoe1xuICAgICAgICAgICAgLi4uZXJyb3IsXG4gICAgICAgICAgICByZXNvdXJjZTogcmVzb3VyY2UubmFtZSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbJHtyZXNvdXJjZS5uYW1lfV0gJHttZXNzYWdlfWApXG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgeyBjb25jdXJyZW5jeSB9LFxuICAgIClcbiAgKS5mbGF0KClcblxuICByZXR1cm4gY3JlYXRlUmVwb3J0KGVycm9ycylcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,172 @@
1
+ import { join } from "node:path";
2
+ import { describe, expect, it } from "vitest";
3
+ import { validatePackage } from "./validate.js";
4
+ describe("validatePackage", () => {
5
+ it("should validate a valid package with inline data", async () => {
6
+ const dataPackage = {
7
+ name: "test-package",
8
+ resources: [
9
+ {
10
+ name: "test-resource",
11
+ type: "table",
12
+ data: [
13
+ { id: 1, name: "Alice" },
14
+ { id: 2, name: "Bob" },
15
+ ],
16
+ schema: {
17
+ fields: [
18
+ { name: "id", type: "number" },
19
+ { name: "name", type: "string" },
20
+ ],
21
+ },
22
+ },
23
+ ],
24
+ };
25
+ const report = await validatePackage(dataPackage);
26
+ expect(report.valid).toBe(true);
27
+ expect(report.errors).toEqual([]);
28
+ });
29
+ it("should detect invalid resource data", async () => {
30
+ const dataPackage = {
31
+ name: "test-package",
32
+ resources: [
33
+ {
34
+ name: "test-resource",
35
+ type: "table",
36
+ data: [
37
+ { id: 1, name: "Alice" },
38
+ { id: "not-a-number", name: "Bob" },
39
+ ],
40
+ schema: {
41
+ fields: [
42
+ { name: "id", type: "number" },
43
+ { name: "name", type: "string" },
44
+ ],
45
+ },
46
+ },
47
+ ],
48
+ };
49
+ const report = await validatePackage(dataPackage);
50
+ expect(report.valid).toBe(false);
51
+ expect(report.errors.length).toBeGreaterThan(0);
52
+ expect(report.errors?.[0]?.resource).toBe("test-resource");
53
+ });
54
+ it("should validate multiple resources", async () => {
55
+ const dataPackage = {
56
+ name: "test-package",
57
+ resources: [
58
+ {
59
+ name: "resource-1",
60
+ type: "table",
61
+ data: [{ id: 1, name: "Alice" }],
62
+ schema: {
63
+ fields: [
64
+ { name: "id", type: "number" },
65
+ { name: "name", type: "string" },
66
+ ],
67
+ },
68
+ },
69
+ {
70
+ name: "resource-2",
71
+ type: "table",
72
+ data: [{ id: 2, value: 100 }],
73
+ schema: {
74
+ fields: [
75
+ { name: "id", type: "number" },
76
+ { name: "value", type: "number" },
77
+ ],
78
+ },
79
+ },
80
+ ],
81
+ };
82
+ const report = await validatePackage(dataPackage);
83
+ expect(report.valid).toBe(true);
84
+ expect(report.errors).toEqual([]);
85
+ });
86
+ it("should detect errors in multiple resources", async () => {
87
+ const dataPackage = {
88
+ name: "test-package",
89
+ resources: [
90
+ {
91
+ name: "resource-1",
92
+ type: "table",
93
+ data: [{ id: "invalid", name: "Alice" }],
94
+ schema: {
95
+ fields: [
96
+ { name: "id", type: "number" },
97
+ { name: "name", type: "string" },
98
+ ],
99
+ },
100
+ },
101
+ {
102
+ name: "resource-2",
103
+ type: "table",
104
+ data: [{ id: 2, value: "invalid" }],
105
+ schema: {
106
+ fields: [
107
+ { name: "id", type: "number" },
108
+ { name: "value", type: "number" },
109
+ ],
110
+ },
111
+ },
112
+ ],
113
+ };
114
+ const report = await validatePackage(dataPackage);
115
+ expect(report.valid).toBe(false);
116
+ expect(report.errors.length).toBeGreaterThan(1);
117
+ expect(report.errors.some(e => e.resource === "resource-1")).toBe(true);
118
+ expect(report.errors.some(e => e.resource === "resource-2")).toBe(true);
119
+ });
120
+ it("should reject package with no resources", async () => {
121
+ const dataPackage = {
122
+ name: "test-package",
123
+ resources: [],
124
+ };
125
+ const report = await validatePackage(dataPackage);
126
+ expect(report.valid).toBe(false);
127
+ expect(report.errors.length).toBeGreaterThan(0);
128
+ const firstError = report.errors?.[0];
129
+ if (firstError && "message" in firstError) {
130
+ expect(firstError.message).toContain("must NOT have fewer than 1 items");
131
+ }
132
+ });
133
+ it("should tag errors with resource name", async () => {
134
+ const dataPackage = {
135
+ name: "test-package",
136
+ resources: [
137
+ {
138
+ name: "error-resource",
139
+ type: "table",
140
+ data: [{ id: "invalid", name: 123 }],
141
+ schema: {
142
+ fields: [
143
+ { name: "id", type: "number" },
144
+ { name: "name", type: "string" },
145
+ ],
146
+ },
147
+ },
148
+ ],
149
+ };
150
+ const report = await validatePackage(dataPackage);
151
+ expect(report.valid).toBe(false);
152
+ report.errors.forEach(error => {
153
+ expect(error.resource).toBe("error-resource");
154
+ });
155
+ });
156
+ it("should detect bad cell type (issue-153)", async () => {
157
+ const dataPackage = join(import.meta.dirname, "fixtures/issue-153/datapackage.json");
158
+ const report = await validatePackage(dataPackage);
159
+ expect(report.valid).toBe(false);
160
+ expect(report.errors).toEqual([
161
+ {
162
+ rowNumber: 3,
163
+ type: "cell/type",
164
+ fieldName: "longitude",
165
+ fieldType: "number",
166
+ cell: "bad",
167
+ resource: "deployments",
168
+ },
169
+ ]);
170
+ });
171
+ });
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3BhY2thZ2UvdmFsaWRhdGUuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRS9DLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7SUFDL0IsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2hFLE1BQU0sV0FBVyxHQUFHO1lBQ2xCLElBQUksRUFBRSxjQUFjO1lBQ3BCLFNBQVMsRUFBRTtnQkFDVDtvQkFDRSxJQUFJLEVBQUUsZUFBZTtvQkFDckIsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixJQUFJLEVBQUU7d0JBQ0osRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7d0JBQ3hCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO3FCQUN2QjtvQkFDRCxNQUFNLEVBQUU7d0JBQ04sTUFBTSxFQUFFOzRCQUNOLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBaUIsRUFBRTs0QkFDdkMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFpQixFQUFFO3lCQUMxQztxQkFDRjtpQkFDRjthQUNGO1NBQ0YsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRWpELE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQy9CLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxD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QyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IHZhbGlkYXRlUGFja2FnZSB9IGZyb20gXCIuL3ZhbGlkYXRlLnRzXCJcblxuZGVzY3JpYmUoXCJ2YWxpZGF0ZVBhY2thZ2VcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCB2YWxpZGF0ZSBhIHZhbGlkIHBhY2thZ2Ugd2l0aCBpbmxpbmUgZGF0YVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGF0YVBhY2thZ2UgPSB7XG4gICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInRlc3QtcmVzb3VyY2VcIixcbiAgICAgICAgICB0eXBlOiBcInRhYmxlXCIgYXMgY29uc3QsXG4gICAgICAgICAgZGF0YTogW1xuICAgICAgICAgICAgeyBpZDogMSwgbmFtZTogXCJBbGljZVwiIH0sXG4gICAgICAgICAgICB7IGlkOiAyLCBuYW1lOiBcIkJvYlwiIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJudW1iZXJcIiBhcyBjb25zdCB9LFxuICAgICAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIGFzIGNvbnN0IH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlcG9ydCA9IGF3YWl0IHZhbGlkYXRlUGFja2FnZShkYXRhUGFja2FnZSlcblxuICAgIGV4cGVjdChyZXBvcnQudmFsaWQpLnRvQmUodHJ1ZSlcbiAgICBleHBlY3QocmVwb3J0LmVycm9ycykudG9FcXVhbChbXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBkZXRlY3QgaW52YWxpZCByZXNvdXJjZSBkYXRhXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkYXRhUGFja2FnZSA9IHtcbiAgICAgIG5hbWU6IFwidGVzdC1wYWNrYWdlXCIsXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwidGVzdC1yZXNvdXJjZVwiLFxuICAgICAgICAgIHR5cGU6IFwidGFibGVcIiBhcyBjb25zdCxcbiAgICAgICAgICBkYXRhOiBbXG4gICAgICAgICAgICB7IGlkOiAxLCBuYW1lOiBcIkFsaWNlXCIgfSxcbiAgICAgICAgICAgIHsgaWQ6IFwibm90LWEtbnVtYmVyXCIsIG5hbWU6IFwiQm9iXCIgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHNjaGVtYToge1xuICAgICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIm51bWJlclwiIGFzIGNvbnN0IH0sXG4gICAgICAgICAgICAgIHsgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwic3RyaW5nXCIgYXMgY29uc3QgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3J0ID0gYXdhaXQgdmFsaWRhdGVQYWNrYWdlKGRhdGFQYWNrYWdlKVxuXG4gICAgZXhwZWN0KHJlcG9ydC52YWxpZCkudG9CZShmYWxzZSlcbiAgICBleHBlY3QocmVwb3J0LmVycm9ycy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKVxuICAgIGV4cGVjdChyZXBvcnQuZXJyb3JzPy5bMF0/LnJlc291cmNlKS50b0JlKFwidGVzdC1yZXNvdXJjZVwiKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHZhbGlkYXRlIG11bHRpcGxlIHJlc291cmNlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGF0YVBhY2thZ2UgPSB7XG4gICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInJlc291cmNlLTFcIixcbiAgICAgICAgICB0eXBlOiBcInRhYmxlXCIgYXMgY29uc3QsXG4gICAgICAgICAgZGF0YTogW3sgaWQ6IDEsIG5hbWU6IFwiQWxpY2VcIiB9XSxcbiAgICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJudW1iZXJcIiBhcyBjb25zdCB9LFxuICAgICAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIGFzIGNvbnN0IH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInJlc291cmNlLTJcIixcbiAgICAgICAgICB0eXBlOiBcInRhYmxlXCIgYXMgY29uc3QsXG4gICAgICAgICAgZGF0YTogW3sgaWQ6IDIsIHZhbHVlOiAxMDAgfV0sXG4gICAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgYXMgY29uc3QgfSxcbiAgICAgICAgICAgICAgeyBuYW1lOiBcInZhbHVlXCIsIHR5cGU6IFwibnVtYmVyXCIgYXMgY29uc3QgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3J0ID0gYXdhaXQgdmFsaWRhdGVQYWNrYWdlKGRhdGFQYWNrYWdlKVxuXG4gICAgZXhwZWN0KHJlcG9ydC52YWxpZCkudG9CZSh0cnVlKVxuICAgIGV4cGVjdChyZXBvcnQuZXJyb3JzKS50b0VxdWFsKFtdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGRldGVjdCBlcnJvcnMgaW4gbXVsdGlwbGUgcmVzb3VyY2VzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkYXRhUGFja2FnZSA9IHtcbiAgICAgIG5hbWU6IFwidGVzdC1wYWNrYWdlXCIsXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwicmVzb3VyY2UtMVwiLFxuICAgICAgICAgIHR5cGU6IFwidGFibGVcIiBhcyBjb25zdCxcbiAgICAgICAgICBkYXRhOiBbeyBpZDogXCJpbnZhbGlkXCIsIG5hbWU6IFwiQWxpY2VcIiB9XSxcbiAgICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJudW1iZXJcIiBhcyBjb25zdCB9LFxuICAgICAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIGFzIGNvbnN0IH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInJlc291cmNlLTJcIixcbiAgICAgICAgICB0eXBlOiBcInRhYmxlXCIgYXMgY29uc3QsXG4gICAgICAgICAgZGF0YTogW3sgaWQ6IDIsIHZhbHVlOiBcImludmFsaWRcIiB9XSxcbiAgICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJudW1iZXJcIiBhcyBjb25zdCB9LFxuICAgICAgICAgICAgICB7IG5hbWU6IFwidmFsdWVcIiwgdHlwZTogXCJudW1iZXJcIiBhcyBjb25zdCB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnQgPSBhd2FpdCB2YWxpZGF0ZVBhY2thZ2UoZGF0YVBhY2thZ2UpXG5cbiAgICBleHBlY3QocmVwb3J0LnZhbGlkKS50b0JlKGZhbHNlKVxuICAgIGV4cGVjdChyZXBvcnQuZXJyb3JzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDEpXG4gICAgZXhwZWN0KHJlcG9ydC5lcnJvcnMuc29tZShlID0+IGUucmVzb3VyY2UgPT09IFwicmVzb3VyY2UtMVwiKSkudG9CZSh0cnVlKVxuICAgIGV4cGVjdChyZXBvcnQuZXJyb3JzLnNvbWUoZSA9PiBlLnJlc291cmNlID09PSBcInJlc291cmNlLTJcIikpLnRvQmUodHJ1ZSlcbiAgfSlcblxuICBpdChcInNob3VsZCByZWplY3QgcGFja2FnZSB3aXRoIG5vIHJlc291cmNlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGF0YVBhY2thZ2UgPSB7XG4gICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgcmVzb3VyY2VzOiBbXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnQgPSBhd2FpdCB2YWxpZGF0ZVBhY2thZ2UoZGF0YVBhY2thZ2UpXG5cbiAgICBleHBlY3QocmVwb3J0LnZhbGlkKS50b0JlKGZhbHNlKVxuICAgIGV4cGVjdChyZXBvcnQuZXJyb3JzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApXG4gICAgY29uc3QgZmlyc3RFcnJvciA9IHJlcG9ydC5lcnJvcnM/LlswXVxuICAgIGlmIChmaXJzdEVycm9yICYmIFwibWVzc2FnZVwiIGluIGZpcnN0RXJyb3IpIHtcbiAgICAgIGV4cGVjdChmaXJzdEVycm9yLm1lc3NhZ2UpLnRvQ29udGFpbihcIm11c3QgTk9UIGhhdmUgZmV3ZXIgdGhhbiAxIGl0ZW1zXCIpXG4gICAgfVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHRhZyBlcnJvcnMgd2l0aCByZXNvdXJjZSBuYW1lXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkYXRhUGFja2FnZSA9IHtcbiAgICAgIG5hbWU6IFwidGVzdC1wYWNrYWdlXCIsXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiZXJyb3ItcmVzb3VyY2VcIixcbiAgICAgICAgICB0eXBlOiBcInRhYmxlXCIgYXMgY29uc3QsXG4gICAgICAgICAgZGF0YTogW3sgaWQ6IFwiaW52YWxpZFwiLCBuYW1lOiAxMjMgfV0sXG4gICAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgYXMgY29uc3QgfSxcbiAgICAgICAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJzdHJpbmdcIiBhcyBjb25zdCB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnQgPSBhd2FpdCB2YWxpZGF0ZVBhY2thZ2UoZGF0YVBhY2thZ2UpXG5cbiAgICBleHBlY3QocmVwb3J0LnZhbGlkKS50b0JlKGZhbHNlKVxuICAgIHJlcG9ydC5lcnJvcnMuZm9yRWFjaChlcnJvciA9PiB7XG4gICAgICBleHBlY3QoZXJyb3IucmVzb3VyY2UpLnRvQmUoXCJlcnJvci1yZXNvdXJjZVwiKVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgZGV0ZWN0IGJhZCBjZWxsIHR5cGUgKGlzc3VlLTE1MylcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRhdGFQYWNrYWdlID0gam9pbihcbiAgICAgIGltcG9ydC5tZXRhLmRpcm5hbWUsXG4gICAgICBcImZpeHR1cmVzL2lzc3VlLTE1My9kYXRhcGFja2FnZS5qc29uXCIsXG4gICAgKVxuXG4gICAgY29uc3QgcmVwb3J0ID0gYXdhaXQgdmFsaWRhdGVQYWNrYWdlKGRhdGFQYWNrYWdlKVxuXG4gICAgZXhwZWN0KHJlcG9ydC52YWxpZCkudG9CZShmYWxzZSlcbiAgICBleHBlY3QocmVwb3J0LmVycm9ycykudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIHJvd051bWJlcjogMyxcbiAgICAgICAgdHlwZTogXCJjZWxsL3R5cGVcIixcbiAgICAgICAgZmllbGROYW1lOiBcImxvbmdpdHVkZVwiLFxuICAgICAgICBmaWVsZFR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNlbGw6IFwiYmFkXCIsXG4gICAgICAgIHJlc291cmNlOiBcImRlcGxveW1lbnRzXCIsXG4gICAgICB9LFxuICAgIF0pXG4gIH0pXG59KVxuIl19
@@ -0,0 +1,2 @@
1
+ import type { TablePlugin } from "@frictionless-ts/table";
2
+ export type Plugin = TablePlugin;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFRhYmxlUGx1Z2luIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvdGFibGVcIlxuXG5leHBvcnQgdHlwZSBQbHVnaW4gPSBUYWJsZVBsdWdpblxuIl19