frictionless-ts 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +9 -0
- package/README.md +3 -0
- package/build/dialect/index.d.ts +1 -0
- package/build/dialect/index.js +2 -0
- package/build/dialect/infer.d.ts +3 -0
- package/build/dialect/infer.js +13 -0
- package/build/dialect/infer.spec.d.ts +1 -0
- package/build/dialect/infer.spec.js +89 -0
- package/build/index.d.ts +19 -0
- package/build/index.js +19 -0
- package/build/package/index.d.ts +4 -0
- package/build/package/index.js +5 -0
- package/build/package/infer.d.ts +40 -0
- package/build/package/infer.js +13 -0
- package/build/package/infer.spec.d.ts +1 -0
- package/build/package/infer.spec.js +121 -0
- package/build/package/integrity.d.ts +8 -0
- package/build/package/integrity.js +69 -0
- package/build/package/integrity.spec.d.ts +1 -0
- package/build/package/integrity.spec.js +575 -0
- package/build/package/load.d.ts +1 -0
- package/build/package/load.js +10 -0
- package/build/package/load.spec.d.ts +1 -0
- package/build/package/load.spec.js +117 -0
- package/build/package/save.d.ts +5 -0
- package/build/package/save.js +13 -0
- package/build/package/save.spec.d.ts +1 -0
- package/build/package/save.spec.js +138 -0
- package/build/package/validate.d.ts +20 -0
- package/build/package/validate.js +62 -0
- package/build/package/validate.spec.d.ts +1 -0
- package/build/package/validate.spec.js +172 -0
- package/build/plugin.d.ts +2 -0
- package/build/plugin.js +2 -0
- package/build/resource/index.d.ts +2 -0
- package/build/resource/index.js +3 -0
- package/build/resource/infer.d.ts +22 -0
- package/build/resource/infer.js +49 -0
- package/build/resource/infer.spec.d.ts +1 -0
- package/build/resource/infer.spec.js +164 -0
- package/build/resource/validate.d.ts +12 -0
- package/build/resource/validate.js +35 -0
- package/build/resource/validate.spec.d.ts +1 -0
- package/build/resource/validate.spec.js +147 -0
- package/build/schema/index.d.ts +1 -0
- package/build/schema/index.js +2 -0
- package/build/schema/infer.d.ts +3 -0
- package/build/schema/infer.js +18 -0
- package/build/schema/infer.spec.d.ts +1 -0
- package/build/schema/infer.spec.js +136 -0
- package/build/system.d.ts +6 -0
- package/build/system.js +41 -0
- package/build/table/index.d.ts +3 -0
- package/build/table/index.js +4 -0
- package/build/table/infer.d.ts +6 -0
- package/build/table/infer.js +20 -0
- package/build/table/infer.spec.d.ts +1 -0
- package/build/table/infer.spec.js +177 -0
- package/build/table/load.d.ts +3 -0
- package/build/table/load.js +11 -0
- package/build/table/load.spec.d.ts +1 -0
- package/build/table/load.spec.js +121 -0
- package/build/table/save.d.ts +2 -0
- package/build/table/save.js +11 -0
- package/build/table/save.spec.d.ts +1 -0
- package/build/table/save.spec.js +189 -0
- package/build/table/validate.d.ts +9 -0
- package/build/table/validate.js +26 -0
- package/package.json +38 -0
|
@@ -0,0 +1,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,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
|
package/build/plugin.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFRhYmxlUGx1Z2luIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvdGFibGVcIlxuXG5leHBvcnQgdHlwZSBQbHVnaW4gPSBUYWJsZVBsdWdpblxuIl19
|