@frictionless-ts/dataset 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/README.md +3 -0
- package/build/file/copy.d.ts +4 -0
- package/build/file/copy.js +7 -0
- package/build/file/copy.spec.d.ts +1 -0
- package/build/file/copy.spec.js +104 -0
- package/build/file/describe.d.ts +7 -0
- package/build/file/describe.js +9 -0
- package/build/file/fetch.d.ts +2 -0
- package/build/file/fetch.js +21 -0
- package/build/file/index.d.ts +9 -0
- package/build/file/index.js +10 -0
- package/build/file/infer.d.ts +10 -0
- package/build/file/infer.js +48 -0
- package/build/file/infer.spec.d.ts +1 -0
- package/build/file/infer.spec.js +141 -0
- package/build/file/load.d.ts +3 -0
- package/build/file/load.js +7 -0
- package/build/file/path.d.ts +2 -0
- package/build/file/path.js +17 -0
- package/build/file/save.d.ts +3 -0
- package/build/file/save.js +7 -0
- package/build/file/temp.d.ts +11 -0
- package/build/file/temp.js +23 -0
- package/build/file/validate.d.ts +6 -0
- package/build/file/validate.js +47 -0
- package/build/file/validate.spec.d.ts +1 -0
- package/build/file/validate.spec.js +180 -0
- package/build/folder/create.d.ts +1 -0
- package/build/folder/create.js +5 -0
- package/build/folder/index.d.ts +2 -0
- package/build/folder/index.js +3 -0
- package/build/folder/temp.d.ts +3 -0
- package/build/folder/temp.js +16 -0
- package/build/index.d.ts +36 -0
- package/build/index.js +35 -0
- package/build/package/index.d.ts +2 -0
- package/build/package/index.js +3 -0
- package/build/package/merge.d.ts +23 -0
- package/build/package/merge.js +12 -0
- package/build/package/path.d.ts +3 -0
- package/build/package/path.js +43 -0
- package/build/package/path.spec.d.ts +1 -0
- package/build/package/path.spec.js +56 -0
- package/build/plugin.d.ts +11 -0
- package/build/plugin.js +2 -0
- package/build/plugins/ckan/ckan/index.d.ts +1 -0
- package/build/plugins/ckan/ckan/index.js +2 -0
- package/build/plugins/ckan/ckan/request.d.ts +11 -0
- package/build/plugins/ckan/ckan/request.js +35 -0
- package/build/plugins/ckan/index.d.ts +4 -0
- package/build/plugins/ckan/index.js +5 -0
- package/build/plugins/ckan/package/Organization.d.ts +21 -0
- package/build/plugins/ckan/package/Organization.js +2 -0
- package/build/plugins/ckan/package/Package.d.ts +76 -0
- package/build/plugins/ckan/package/Package.js +2 -0
- package/build/plugins/ckan/package/Tag.d.ts +17 -0
- package/build/plugins/ckan/package/Tag.js +2 -0
- package/build/plugins/ckan/package/convert/fromCkan.d.ts +3 -0
- package/build/plugins/ckan/package/convert/fromCkan.js +63 -0
- package/build/plugins/ckan/package/convert/fromCkan.spec.d.ts +1 -0
- package/build/plugins/ckan/package/convert/fromCkan.spec.js +80 -0
- package/build/plugins/ckan/package/convert/toCkan.d.ts +22 -0
- package/build/plugins/ckan/package/convert/toCkan.js +51 -0
- package/build/plugins/ckan/package/convert/toCkan.spec.d.ts +1 -0
- package/build/plugins/ckan/package/convert/toCkan.spec.js +153 -0
- package/build/plugins/ckan/package/fixtures/ckan-package.json +308 -0
- package/build/plugins/ckan/package/index.d.ts +7 -0
- package/build/plugins/ckan/package/index.js +5 -0
- package/build/plugins/ckan/package/load.d.ts +21 -0
- package/build/plugins/ckan/package/load.js +74 -0
- package/build/plugins/ckan/package/load.spec.d.ts +1 -0
- package/build/plugins/ckan/package/load.spec.js +11 -0
- package/build/plugins/ckan/package/save.d.ts +10 -0
- package/build/plugins/ckan/package/save.js +83 -0
- package/build/plugins/ckan/package/save.spec.d.ts +1 -0
- package/build/plugins/ckan/package/save.spec.js +319 -0
- package/build/plugins/ckan/plugin.d.ts +19 -0
- package/build/plugins/ckan/plugin.js +18 -0
- package/build/plugins/ckan/plugin.spec.d.ts +1 -0
- package/build/plugins/ckan/plugin.spec.js +83 -0
- package/build/plugins/ckan/resource/Resource.d.ts +56 -0
- package/build/plugins/ckan/resource/Resource.js +2 -0
- package/build/plugins/ckan/resource/convert/fromCkan.d.ts +3 -0
- package/build/plugins/ckan/resource/convert/fromCkan.js +39 -0
- package/build/plugins/ckan/resource/convert/toCkan.d.ts +3 -0
- package/build/plugins/ckan/resource/convert/toCkan.js +20 -0
- package/build/plugins/ckan/resource/index.d.ts +3 -0
- package/build/plugins/ckan/resource/index.js +3 -0
- package/build/plugins/ckan/schema/Field.d.ts +34 -0
- package/build/plugins/ckan/schema/Field.js +2 -0
- package/build/plugins/ckan/schema/Schema.d.ts +10 -0
- package/build/plugins/ckan/schema/Schema.js +2 -0
- package/build/plugins/ckan/schema/convert/fixtures/ckan-schema.json +115 -0
- package/build/plugins/ckan/schema/convert/fromCkan.d.ts +3 -0
- package/build/plugins/ckan/schema/convert/fromCkan.js +47 -0
- package/build/plugins/ckan/schema/convert/fromCkan.spec.d.ts +1 -0
- package/build/plugins/ckan/schema/convert/fromCkan.spec.js +157 -0
- package/build/plugins/ckan/schema/convert/toCkan.d.ts +3 -0
- package/build/plugins/ckan/schema/convert/toCkan.js +50 -0
- package/build/plugins/ckan/schema/convert/toCkan.spec.d.ts +1 -0
- package/build/plugins/ckan/schema/convert/toCkan.spec.js +278 -0
- package/build/plugins/ckan/schema/index.d.ts +4 -0
- package/build/plugins/ckan/schema/index.js +3 -0
- package/build/plugins/datahub/index.d.ts +2 -0
- package/build/plugins/datahub/index.js +3 -0
- package/build/plugins/datahub/package/index.d.ts +1 -0
- package/build/plugins/datahub/package/index.js +2 -0
- package/build/plugins/datahub/package/load.d.ts +1 -0
- package/build/plugins/datahub/package/load.js +9 -0
- package/build/plugins/datahub/package/load.spec.d.ts +1 -0
- package/build/plugins/datahub/package/load.spec.js +11 -0
- package/build/plugins/datahub/plugin.d.ts +4 -0
- package/build/plugins/datahub/plugin.js +18 -0
- package/build/plugins/datahub/plugin.spec.d.ts +1 -0
- package/build/plugins/datahub/plugin.spec.js +78 -0
- package/build/plugins/descriptor/index.d.ts +1 -0
- package/build/plugins/descriptor/index.js +2 -0
- package/build/plugins/descriptor/plugin.d.ts +11 -0
- package/build/plugins/descriptor/plugin.js +29 -0
- package/build/plugins/descriptor/plugin.spec.d.ts +1 -0
- package/build/plugins/descriptor/plugin.spec.js +169 -0
- package/build/plugins/folder/index.d.ts +2 -0
- package/build/plugins/folder/index.js +3 -0
- package/build/plugins/folder/package/index.d.ts +2 -0
- package/build/plugins/folder/package/index.js +3 -0
- package/build/plugins/folder/package/load.d.ts +1 -0
- package/build/plugins/folder/package/load.js +6 -0
- package/build/plugins/folder/package/load.spec.d.ts +1 -0
- package/build/plugins/folder/package/load.spec.js +175 -0
- package/build/plugins/folder/package/save.d.ts +7 -0
- package/build/plugins/folder/package/save.js +35 -0
- package/build/plugins/folder/package/save.spec.d.ts +1 -0
- package/build/plugins/folder/package/save.spec.js +328 -0
- package/build/plugins/folder/plugin.d.ts +4 -0
- package/build/plugins/folder/plugin.js +19 -0
- package/build/plugins/folder/plugin.spec.d.ts +1 -0
- package/build/plugins/folder/plugin.spec.js +53 -0
- package/build/plugins/github/github/index.d.ts +1 -0
- package/build/plugins/github/github/index.js +2 -0
- package/build/plugins/github/github/path.d.ts +1 -0
- package/build/plugins/github/github/path.js +4 -0
- package/build/plugins/github/github/request.d.ts +15 -0
- package/build/plugins/github/github/request.js +43 -0
- package/build/plugins/github/index.d.ts +3 -0
- package/build/plugins/github/index.js +4 -0
- package/build/plugins/github/package/License.d.ts +21 -0
- package/build/plugins/github/package/License.js +2 -0
- package/build/plugins/github/package/Owner.d.ts +25 -0
- package/build/plugins/github/package/Owner.js +2 -0
- package/build/plugins/github/package/Package.d.ts +87 -0
- package/build/plugins/github/package/Package.js +2 -0
- package/build/plugins/github/package/convert/fromGithub.d.ts +3 -0
- package/build/plugins/github/package/convert/fromGithub.js +50 -0
- package/build/plugins/github/package/index.d.ts +6 -0
- package/build/plugins/github/package/index.js +4 -0
- package/build/plugins/github/package/load.d.ts +23 -0
- package/build/plugins/github/package/load.js +48 -0
- package/build/plugins/github/package/load.spec.d.ts +1 -0
- package/build/plugins/github/package/load.spec.js +15 -0
- package/build/plugins/github/package/save.d.ts +14 -0
- package/build/plugins/github/package/save.js +69 -0
- package/build/plugins/github/package/save.spec.d.ts +1 -0
- package/build/plugins/github/package/save.spec.js +566 -0
- package/build/plugins/github/plugin.d.ts +19 -0
- package/build/plugins/github/plugin.js +18 -0
- package/build/plugins/github/plugin.spec.d.ts +1 -0
- package/build/plugins/github/plugin.spec.js +73 -0
- package/build/plugins/github/resource/Resource.d.ts +29 -0
- package/build/plugins/github/resource/Resource.js +2 -0
- package/build/plugins/github/resource/convert/fromGithub.d.ts +5 -0
- package/build/plugins/github/resource/convert/fromGithub.js +24 -0
- package/build/plugins/github/resource/convert/toGithub.d.ts +3 -0
- package/build/plugins/github/resource/convert/toGithub.js +10 -0
- package/build/plugins/github/resource/index.d.ts +3 -0
- package/build/plugins/github/resource/index.js +3 -0
- package/build/plugins/zenodo/index.d.ts +3 -0
- package/build/plugins/zenodo/index.js +4 -0
- package/build/plugins/zenodo/package/Creator.d.ts +20 -0
- package/build/plugins/zenodo/package/Creator.js +2 -0
- package/build/plugins/zenodo/package/Package.d.ts +94 -0
- package/build/plugins/zenodo/package/Package.js +2 -0
- package/build/plugins/zenodo/package/convert/fromZenodo.d.ts +3 -0
- package/build/plugins/zenodo/package/convert/fromZenodo.js +43 -0
- package/build/plugins/zenodo/package/convert/toZenodo.d.ts +3 -0
- package/build/plugins/zenodo/package/convert/toZenodo.js +79 -0
- package/build/plugins/zenodo/package/index.d.ts +6 -0
- package/build/plugins/zenodo/package/index.js +5 -0
- package/build/plugins/zenodo/package/load.d.ts +23 -0
- package/build/plugins/zenodo/package/load.js +45 -0
- package/build/plugins/zenodo/package/load.spec.d.ts +1 -0
- package/build/plugins/zenodo/package/load.spec.js +15 -0
- package/build/plugins/zenodo/package/save.d.ts +13 -0
- package/build/plugins/zenodo/package/save.js +74 -0
- package/build/plugins/zenodo/package/save.spec.d.ts +1 -0
- package/build/plugins/zenodo/package/save.spec.js +524 -0
- package/build/plugins/zenodo/plugin.d.ts +19 -0
- package/build/plugins/zenodo/plugin.js +18 -0
- package/build/plugins/zenodo/plugin.spec.d.ts +1 -0
- package/build/plugins/zenodo/plugin.spec.js +78 -0
- package/build/plugins/zenodo/resource/Resource.d.ts +27 -0
- package/build/plugins/zenodo/resource/Resource.js +2 -0
- package/build/plugins/zenodo/resource/convert/fromZenodo.d.ts +10 -0
- package/build/plugins/zenodo/resource/convert/fromZenodo.js +18 -0
- package/build/plugins/zenodo/resource/convert/toZenodo.d.ts +3 -0
- package/build/plugins/zenodo/resource/convert/toZenodo.js +13 -0
- package/build/plugins/zenodo/resource/index.d.ts +3 -0
- package/build/plugins/zenodo/resource/index.js +3 -0
- package/build/plugins/zenodo/zenodo/index.d.ts +1 -0
- package/build/plugins/zenodo/zenodo/index.js +2 -0
- package/build/plugins/zenodo/zenodo/request.d.ts +12 -0
- package/build/plugins/zenodo/zenodo/request.js +36 -0
- package/build/plugins/zip/index.d.ts +2 -0
- package/build/plugins/zip/index.js +3 -0
- package/build/plugins/zip/package/index.d.ts +2 -0
- package/build/plugins/zip/package/index.js +3 -0
- package/build/plugins/zip/package/load.d.ts +1 -0
- package/build/plugins/zip/package/load.js +30 -0
- package/build/plugins/zip/package/load.spec.d.ts +1 -0
- package/build/plugins/zip/package/load.spec.js +173 -0
- package/build/plugins/zip/package/save.d.ts +5 -0
- package/build/plugins/zip/package/save.js +50 -0
- package/build/plugins/zip/package/save.spec.d.ts +1 -0
- package/build/plugins/zip/package/save.spec.js +287 -0
- package/build/plugins/zip/plugin.d.ts +11 -0
- package/build/plugins/zip/plugin.js +24 -0
- package/build/plugins/zip/plugin.spec.d.ts +1 -0
- package/build/plugins/zip/plugin.spec.js +158 -0
- package/build/resource/index.d.ts +1 -0
- package/build/resource/index.js +2 -0
- package/build/resource/save.d.ts +13 -0
- package/build/resource/save.js +53 -0
- package/build/resource/save.spec.d.ts +1 -0
- package/build/resource/save.spec.js +107 -0
- package/build/stream/concat.d.ts +3 -0
- package/build/stream/concat.js +5 -0
- package/build/stream/index.d.ts +3 -0
- package/build/stream/index.js +4 -0
- package/build/stream/load.d.ts +5 -0
- package/build/stream/load.js +46 -0
- package/build/stream/save.d.ts +5 -0
- package/build/stream/save.js +13 -0
- package/package.json +48 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
|
3
|
+
import { getTempFilePath, writeTempFile } from "../../../file/index.js";
|
|
4
|
+
import { loadPackageFromZip } from "./load.js";
|
|
5
|
+
import { savePackageToZip } from "./save.js";
|
|
6
|
+
describe("savePackageToZip", () => {
|
|
7
|
+
let tempZipPath;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
tempZipPath = getTempFilePath();
|
|
10
|
+
});
|
|
11
|
+
it("should save a basic package to zip", async () => {
|
|
12
|
+
const dataPackage = {
|
|
13
|
+
name: "test-package",
|
|
14
|
+
resources: [
|
|
15
|
+
{
|
|
16
|
+
name: "test-resource",
|
|
17
|
+
data: [],
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
};
|
|
21
|
+
await savePackageToZip(dataPackage, { archivePath: tempZipPath });
|
|
22
|
+
const fileBuffer = await readFile(tempZipPath);
|
|
23
|
+
expect(fileBuffer.length).toBeGreaterThan(0);
|
|
24
|
+
});
|
|
25
|
+
it("should save package with metadata", async () => {
|
|
26
|
+
const dataPackage = {
|
|
27
|
+
name: "test-package",
|
|
28
|
+
title: "Test Package",
|
|
29
|
+
description: "A test package",
|
|
30
|
+
version: "1.0.0",
|
|
31
|
+
resources: [
|
|
32
|
+
{
|
|
33
|
+
name: "test-resource",
|
|
34
|
+
data: [],
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
await savePackageToZip(dataPackage, { archivePath: tempZipPath });
|
|
39
|
+
const fileBuffer = await readFile(tempZipPath);
|
|
40
|
+
expect(fileBuffer.length).toBeGreaterThan(0);
|
|
41
|
+
});
|
|
42
|
+
it("should save package with inline data resources", async () => {
|
|
43
|
+
const dataPackage = {
|
|
44
|
+
name: "test-package",
|
|
45
|
+
resources: [
|
|
46
|
+
{
|
|
47
|
+
name: "test-resource",
|
|
48
|
+
data: [
|
|
49
|
+
{ id: 1, name: "alice" },
|
|
50
|
+
{ id: 2, name: "bob" },
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
};
|
|
55
|
+
await savePackageToZip(dataPackage, { archivePath: tempZipPath });
|
|
56
|
+
const fileBuffer = await readFile(tempZipPath);
|
|
57
|
+
expect(fileBuffer.length).toBeGreaterThan(0);
|
|
58
|
+
});
|
|
59
|
+
it("should save package with file resources", async () => {
|
|
60
|
+
const csvContent = "id,name\n1,alice\n2,bob";
|
|
61
|
+
const csvPath = await writeTempFile(csvContent);
|
|
62
|
+
const dataPackage = {
|
|
63
|
+
name: "test-package",
|
|
64
|
+
resources: [
|
|
65
|
+
{
|
|
66
|
+
name: "test-resource",
|
|
67
|
+
path: csvPath,
|
|
68
|
+
format: "csv",
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
await savePackageToZip(dataPackage, { archivePath: tempZipPath });
|
|
73
|
+
const fileBuffer = await readFile(tempZipPath);
|
|
74
|
+
expect(fileBuffer.length).toBeGreaterThan(0);
|
|
75
|
+
});
|
|
76
|
+
it("should save package with multiple resources", async () => {
|
|
77
|
+
const csvContent = "id,name\n1,alice\n2,bob";
|
|
78
|
+
const csvPath = await writeTempFile(csvContent);
|
|
79
|
+
const dataPackage = {
|
|
80
|
+
name: "test-package",
|
|
81
|
+
resources: [
|
|
82
|
+
{
|
|
83
|
+
name: "resource-1",
|
|
84
|
+
path: csvPath,
|
|
85
|
+
format: "csv",
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
name: "resource-2",
|
|
89
|
+
data: [{ id: 1, value: 100 }],
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
};
|
|
93
|
+
await savePackageToZip(dataPackage, { archivePath: tempZipPath });
|
|
94
|
+
const fileBuffer = await readFile(tempZipPath);
|
|
95
|
+
expect(fileBuffer.length).toBeGreaterThan(0);
|
|
96
|
+
});
|
|
97
|
+
it("should save package with schema", async () => {
|
|
98
|
+
const dataPackage = {
|
|
99
|
+
name: "test-package",
|
|
100
|
+
resources: [
|
|
101
|
+
{
|
|
102
|
+
name: "test-resource",
|
|
103
|
+
data: [{ id: 1, name: "alice" }],
|
|
104
|
+
schema: {
|
|
105
|
+
fields: [
|
|
106
|
+
{ name: "id", type: "integer" },
|
|
107
|
+
{ name: "name", type: "string" },
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
};
|
|
113
|
+
await savePackageToZip(dataPackage, { archivePath: tempZipPath });
|
|
114
|
+
const fileBuffer = await readFile(tempZipPath);
|
|
115
|
+
expect(fileBuffer.length).toBeGreaterThan(0);
|
|
116
|
+
});
|
|
117
|
+
it("should save package with dialect", async () => {
|
|
118
|
+
const csvContent = "id;name\n1;alice\n2;bob";
|
|
119
|
+
const csvPath = await writeTempFile(csvContent);
|
|
120
|
+
const dataPackage = {
|
|
121
|
+
name: "test-package",
|
|
122
|
+
resources: [
|
|
123
|
+
{
|
|
124
|
+
name: "test-resource",
|
|
125
|
+
path: csvPath,
|
|
126
|
+
format: "csv",
|
|
127
|
+
dialect: {
|
|
128
|
+
delimiter: ";",
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
};
|
|
133
|
+
await savePackageToZip(dataPackage, { archivePath: tempZipPath });
|
|
134
|
+
const fileBuffer = await readFile(tempZipPath);
|
|
135
|
+
expect(fileBuffer.length).toBeGreaterThan(0);
|
|
136
|
+
});
|
|
137
|
+
it("should save and reload package with same structure", async () => {
|
|
138
|
+
const originalPackage = {
|
|
139
|
+
name: "test-package",
|
|
140
|
+
title: "Test Package",
|
|
141
|
+
description: "A test package",
|
|
142
|
+
resources: [
|
|
143
|
+
{
|
|
144
|
+
name: "test-resource",
|
|
145
|
+
data: [{ id: 1, name: "alice" }],
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
};
|
|
149
|
+
await savePackageToZip(originalPackage, { archivePath: tempZipPath });
|
|
150
|
+
const reloadedPackage = await loadPackageFromZip(tempZipPath);
|
|
151
|
+
expect(reloadedPackage).toBeDefined();
|
|
152
|
+
expect(reloadedPackage.name).toBe("test-package");
|
|
153
|
+
expect(reloadedPackage.title).toBe("Test Package");
|
|
154
|
+
expect(reloadedPackage.description).toBe("A test package");
|
|
155
|
+
expect(reloadedPackage.resources).toHaveLength(1);
|
|
156
|
+
expect(reloadedPackage.resources[0]?.name).toBe("test-resource");
|
|
157
|
+
});
|
|
158
|
+
it("should save and reload package preserving metadata", async () => {
|
|
159
|
+
const originalPackage = {
|
|
160
|
+
name: "test-package",
|
|
161
|
+
title: "Test Package",
|
|
162
|
+
description: "A test package",
|
|
163
|
+
version: "1.0.0",
|
|
164
|
+
keywords: ["test", "package"],
|
|
165
|
+
resources: [
|
|
166
|
+
{
|
|
167
|
+
name: "test-resource",
|
|
168
|
+
data: [{ id: 1 }],
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
};
|
|
172
|
+
await savePackageToZip(originalPackage, { archivePath: tempZipPath });
|
|
173
|
+
const reloadedPackage = await loadPackageFromZip(tempZipPath);
|
|
174
|
+
expect(reloadedPackage.name).toBe("test-package");
|
|
175
|
+
expect(reloadedPackage.title).toBe("Test Package");
|
|
176
|
+
expect(reloadedPackage.version).toBe("1.0.0");
|
|
177
|
+
expect(reloadedPackage.keywords).toEqual(["test", "package"]);
|
|
178
|
+
});
|
|
179
|
+
it("should save and reload package with schema", async () => {
|
|
180
|
+
const originalPackage = {
|
|
181
|
+
name: "test-package",
|
|
182
|
+
resources: [
|
|
183
|
+
{
|
|
184
|
+
name: "test-resource",
|
|
185
|
+
data: [{ id: 1, name: "alice" }],
|
|
186
|
+
schema: {
|
|
187
|
+
fields: [
|
|
188
|
+
{ name: "id", type: "integer" },
|
|
189
|
+
{ name: "name", type: "string" },
|
|
190
|
+
],
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
],
|
|
194
|
+
};
|
|
195
|
+
await savePackageToZip(originalPackage, { archivePath: tempZipPath });
|
|
196
|
+
const reloadedPackage = await loadPackageFromZip(tempZipPath);
|
|
197
|
+
const schema = reloadedPackage.resources[0]?.schema;
|
|
198
|
+
expect(schema).toBeDefined();
|
|
199
|
+
expect(typeof schema === "object" && "fields" in schema).toBe(true);
|
|
200
|
+
if (typeof schema === "object" && "fields" in schema) {
|
|
201
|
+
expect(schema.fields).toHaveLength(2);
|
|
202
|
+
expect(schema.fields?.[0]?.name).toBe("id");
|
|
203
|
+
expect(schema.fields?.[1]?.name).toBe("name");
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
it("should save and reload package with file resources", async () => {
|
|
207
|
+
const csvContent = "id,name\n1,alice\n2,bob";
|
|
208
|
+
const csvPath = await writeTempFile(csvContent);
|
|
209
|
+
const originalPackage = {
|
|
210
|
+
name: "test-package",
|
|
211
|
+
resources: [
|
|
212
|
+
{
|
|
213
|
+
name: "test-resource",
|
|
214
|
+
path: csvPath,
|
|
215
|
+
format: "csv",
|
|
216
|
+
},
|
|
217
|
+
],
|
|
218
|
+
};
|
|
219
|
+
await savePackageToZip(originalPackage, { archivePath: tempZipPath });
|
|
220
|
+
const reloadedPackage = await loadPackageFromZip(tempZipPath);
|
|
221
|
+
expect(reloadedPackage.resources).toHaveLength(1);
|
|
222
|
+
expect(reloadedPackage.resources[0]?.name).toBe("test-resource");
|
|
223
|
+
expect(reloadedPackage.resources[0]?.format).toBe("csv");
|
|
224
|
+
});
|
|
225
|
+
it("should throw error when saving to existing file", async () => {
|
|
226
|
+
const dataPackage = {
|
|
227
|
+
name: "test-package",
|
|
228
|
+
resources: [
|
|
229
|
+
{
|
|
230
|
+
name: "test-resource",
|
|
231
|
+
data: [],
|
|
232
|
+
},
|
|
233
|
+
],
|
|
234
|
+
};
|
|
235
|
+
await writeTempFile("existing content", { persist: true });
|
|
236
|
+
const existingPath = await writeTempFile("existing content");
|
|
237
|
+
await expect(savePackageToZip(dataPackage, { archivePath: existingPath })).rejects.toThrow();
|
|
238
|
+
});
|
|
239
|
+
it("should create valid zip file structure", async () => {
|
|
240
|
+
const dataPackage = {
|
|
241
|
+
name: "test-package",
|
|
242
|
+
resources: [
|
|
243
|
+
{
|
|
244
|
+
name: "test-resource",
|
|
245
|
+
data: [{ id: 1 }],
|
|
246
|
+
},
|
|
247
|
+
],
|
|
248
|
+
};
|
|
249
|
+
await savePackageToZip(dataPackage, { archivePath: tempZipPath });
|
|
250
|
+
const reloadedPackage = await loadPackageFromZip(tempZipPath);
|
|
251
|
+
expect(reloadedPackage).toMatchObject({
|
|
252
|
+
name: "test-package",
|
|
253
|
+
resources: [
|
|
254
|
+
{
|
|
255
|
+
name: "test-resource",
|
|
256
|
+
},
|
|
257
|
+
],
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
it("should save package with multiple file resources", async () => {
|
|
261
|
+
const csv1Content = "id,name\n1,alice";
|
|
262
|
+
const csv2Content = "id,value\n1,100";
|
|
263
|
+
const csv1Path = await writeTempFile(csv1Content);
|
|
264
|
+
const csv2Path = await writeTempFile(csv2Content);
|
|
265
|
+
const originalPackage = {
|
|
266
|
+
name: "test-package",
|
|
267
|
+
resources: [
|
|
268
|
+
{
|
|
269
|
+
name: "resource-1",
|
|
270
|
+
path: csv1Path,
|
|
271
|
+
format: "csv",
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
name: "resource-2",
|
|
275
|
+
path: csv2Path,
|
|
276
|
+
format: "csv",
|
|
277
|
+
},
|
|
278
|
+
],
|
|
279
|
+
};
|
|
280
|
+
await savePackageToZip(originalPackage, { archivePath: tempZipPath });
|
|
281
|
+
const reloadedPackage = await loadPackageFromZip(tempZipPath);
|
|
282
|
+
expect(reloadedPackage.resources).toHaveLength(2);
|
|
283
|
+
expect(reloadedPackage.resources[0]?.name).toBe("resource-1");
|
|
284
|
+
expect(reloadedPackage.resources[1]?.name).toBe("resource-2");
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGx1Z2lucy96aXAvcGFja2FnZS9zYXZlLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sV0FBVyxDQUFBO0FBRTVDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7SUFDaEMsSUFBSSxXQUFtQixDQUFBO0lBRXZCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxXQUFXLEdBQUcsZUFBZSxFQUFFLENBQUE7SUFDakMsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbEQsTUFBTSxXQUFXLEdBQVk7WUFDM0IsSUFBSSxFQUFFLGNBQWM7WUFDcEIsU0FBUyxFQUFFO2dCQUNUO29CQUNFLElBQUksRUFBRSxlQUFlO29CQUNyQixJQUFJLEVBQUUsRUFBRTtpQkFDVDthQUNGO1NBQ0YsQ0FBQTtRQUVELE1BQU0sZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUE7UUFFakUsTUFBTSxVQUFVLEdBQUcsTUFBTSxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDOUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDOUMsQ0FBQyxDQUFDLENBQUE7SUFF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ZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB0eXBlIHsgUGFja2FnZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB7IGJlZm9yZUVhY2gsIGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyBnZXRUZW1wRmlsZVBhdGgsIHdyaXRlVGVtcEZpbGUgfSBmcm9tIFwiLi4vLi4vLi4vZmlsZS9pbmRleC50c1wiXG5pbXBvcnQgeyBsb2FkUGFja2FnZUZyb21aaXAgfSBmcm9tIFwiLi9sb2FkLnRzXCJcbmltcG9ydCB7IHNhdmVQYWNrYWdlVG9aaXAgfSBmcm9tIFwiLi9zYXZlLnRzXCJcblxuZGVzY3JpYmUoXCJzYXZlUGFja2FnZVRvWmlwXCIsICgpID0+IHtcbiAgbGV0IHRlbXBaaXBQYXRoOiBzdHJpbmdcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0ZW1wWmlwUGF0aCA9IGdldFRlbXBGaWxlUGF0aCgpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc2F2ZSBhIGJhc2ljIHBhY2thZ2UgdG8gemlwXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkYXRhUGFja2FnZTogUGFja2FnZSA9IHtcbiAgICAgIG5hbWU6IFwidGVzdC1wYWNrYWdlXCIsXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwidGVzdC1yZXNvdXJjZVwiLFxuICAgICAgICAgIGRhdGE6IFtdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBhd2FpdCBzYXZlUGFja2FnZVRvWmlwKGRhdGFQYWNrYWdlLCB7IGFyY2hpdmVQYXRoOiB0ZW1wWmlwUGF0aCB9KVxuXG4gICAgY29uc3QgZmlsZUJ1ZmZlciA9IGF3YWl0IHJlYWRGaWxlKHRlbXBaaXBQYXRoKVxuICAgIGV4cGVjdChmaWxlQnVmZmVyLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc2F2ZSBwYWNrYWdlIHdpdGggbWV0YWRhdGFcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRhdGFQYWNrYWdlOiBQYWNrYWdlID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgIHRpdGxlOiBcIlRlc3QgUGFja2FnZVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiQSB0ZXN0IHBhY2thZ2VcIixcbiAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0ZXN0LXJlc291cmNlXCIsXG4gICAgICAgICAgZGF0YTogW10sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGF3YWl0IHNhdmVQYWNrYWdlVG9aaXAoZGF0YVBhY2thZ2UsIHsgYXJjaGl2ZVBhdGg6IHRlbXBaaXBQYXRoIH0pXG5cbiAgICBjb25zdCBmaWxlQnVmZmVyID0gYXdhaXQgcmVhZEZpbGUodGVtcFppcFBhdGgpXG4gICAgZXhwZWN0KGZpbGVCdWZmZXIubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMClcbiAgfSlcblxuICBpdChcInNob3VsZCBzYXZlIHBhY2thZ2Ugd2l0aCBpbmxpbmUgZGF0YSByZXNvdXJjZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRhdGFQYWNrYWdlOiBQYWNrYWdlID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0ZXN0LXJlc291cmNlXCIsXG4gICAgICAgICAgZGF0YTogW1xuICAgICAgICAgICAgeyBpZDogMSwgbmFtZTogXCJhbGljZVwiIH0sXG4gICAgICAgICAgICB7IGlkOiAyLCBuYW1lOiBcImJvYlwiIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgYXdhaXQgc2F2ZVBhY2thZ2VUb1ppcChkYXRhUGFja2FnZSwgeyBhcmNoaXZlUGF0aDogdGVtcFppcFBhdGggfSlcblxuICAgIGNvbnN0IGZpbGVCdWZmZXIgPSBhd2FpdCByZWFkRmlsZSh0ZW1wWmlwUGF0aClcbiAgICBleHBlY3QoZmlsZUJ1ZmZlci5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHNhdmUgcGFja2FnZSB3aXRoIGZpbGUgcmVzb3VyY2VzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZDb250ZW50ID0gXCJpZCxuYW1lXFxuMSxhbGljZVxcbjIsYm9iXCJcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShjc3ZDb250ZW50KVxuXG4gICAgY29uc3QgZGF0YVBhY2thZ2U6IFBhY2thZ2UgPSB7XG4gICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInRlc3QtcmVzb3VyY2VcIixcbiAgICAgICAgICBwYXRoOiBjc3ZQYXRoLFxuICAgICAgICAgIGZvcm1hdDogXCJjc3ZcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgYXdhaXQgc2F2ZVBhY2thZ2VUb1ppcChkYXRhUGFja2FnZSwgeyBhcmNoaXZlUGF0aDogdGVtcFppcFBhdGggfSlcblxuICAgIGNvbnN0IGZpbGVCdWZmZXIgPSBhd2FpdCByZWFkRmlsZSh0ZW1wWmlwUGF0aClcbiAgICBleHBlY3QoZmlsZUJ1ZmZlci5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHNhdmUgcGFja2FnZSB3aXRoIG11bHRpcGxlIHJlc291cmNlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2Q29udGVudCA9IFwiaWQsbmFtZVxcbjEsYWxpY2VcXG4yLGJvYlwiXG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoY3N2Q29udGVudClcblxuICAgIGNvbnN0IGRhdGFQYWNrYWdlOiBQYWNrYWdlID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJyZXNvdXJjZS0xXCIsXG4gICAgICAgICAgcGF0aDogY3N2UGF0aCxcbiAgICAgICAgICBmb3JtYXQ6IFwiY3N2XCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInJlc291cmNlLTJcIixcbiAgICAgICAgICBkYXRhOiBbeyBpZDogMSwgdmFsdWU6IDEwMCB9XSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgYXdhaXQgc2F2ZVBhY2thZ2VUb1ppcChkYXRhUGFja2FnZSwgeyBhcmNoaXZlUGF0aDogdGVtcFppcFBhdGggfSlcblxuICAgIGNvbnN0IGZpbGVCdWZmZXIgPSBhd2FpdCByZWFkRmlsZSh0ZW1wWmlwUGF0aClcbiAgICBleHBlY3QoZmlsZUJ1ZmZlci5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHNhdmUgcGFja2FnZSB3aXRoIHNjaGVtYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGF0YVBhY2thZ2U6IFBhY2thZ2UgPSB7XG4gICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInRlc3QtcmVzb3VyY2VcIixcbiAgICAgICAgICBkYXRhOiBbeyBpZDogMSwgbmFtZTogXCJhbGljZVwiIH1dLFxuICAgICAgICAgIHNjaGVtYToge1xuICAgICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcImludGVnZXJcIiB9LFxuICAgICAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGF3YWl0IHNhdmVQYWNrYWdlVG9aaXAoZGF0YVBhY2thZ2UsIHsgYXJjaGl2ZVBhdGg6IHRlbXBaaXBQYXRoIH0pXG5cbiAgICBjb25zdCBmaWxlQnVmZmVyID0gYXdhaXQgcmVhZEZpbGUodGVtcFppcFBhdGgpXG4gICAgZXhwZWN0KGZpbGVCdWZmZXIubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMClcbiAgfSlcblxuICBpdChcInNob3VsZCBzYXZlIHBhY2thZ2Ugd2l0aCBkaWFsZWN0XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZDb250ZW50ID0gXCJpZDtuYW1lXFxuMTthbGljZVxcbjI7Ym9iXCJcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShjc3ZDb250ZW50KVxuXG4gICAgY29uc3QgZGF0YVBhY2thZ2U6IFBhY2thZ2UgPSB7XG4gICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInRlc3QtcmVzb3VyY2VcIixcbiAgICAgICAgICBwYXRoOiBjc3ZQYXRoLFxuICAgICAgICAgIGZvcm1hdDogXCJjc3ZcIixcbiAgICAgICAgICBkaWFsZWN0OiB7XG4gICAgICAgICAgICBkZWxpbWl0ZXI6IFwiO1wiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGF3YWl0IHNhdmVQYWNrYWdlVG9aaXAoZGF0YVBhY2thZ2UsIHsgYXJjaGl2ZVBhdGg6IHRlbXBaaXBQYXRoIH0pXG5cbiAgICBjb25zdCBmaWxlQnVmZmVyID0gYXdhaXQgcmVhZEZpbGUodGVtcFppcFBhdGgpXG4gICAgZXhwZWN0KGZpbGVCdWZmZXIubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMClcbiAgfSlcblxuICBpdChcInNob3VsZCBzYXZlIGFuZCByZWxvYWQgcGFja2FnZSB3aXRoIHNhbWUgc3RydWN0dXJlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvcmlnaW5hbFBhY2thZ2U6IFBhY2thZ2UgPSB7XG4gICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgdGl0bGU6IFwiVGVzdCBQYWNrYWdlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJBIHRlc3QgcGFja2FnZVwiLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInRlc3QtcmVzb3VyY2VcIixcbiAgICAgICAgICBkYXRhOiBbeyBpZDogMSwgbmFtZTogXCJhbGljZVwiIH1dLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBhd2FpdCBzYXZlUGFja2FnZVRvWmlwKG9yaWdpbmFsUGFja2FnZSwgeyBhcmNoaXZlUGF0aDogdGVtcFppcFBhdGggfSlcbiAgICBjb25zdCByZWxvYWRlZFBhY2thZ2UgPSBhd2FpdCBsb2FkUGFja2FnZUZyb21aaXAodGVtcFppcFBhdGgpXG5cbiAgICBleHBlY3QocmVsb2FkZWRQYWNrYWdlKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlbG9hZGVkUGFja2FnZS5uYW1lKS50b0JlKFwidGVzdC1wYWNrYWdlXCIpXG4gICAgZXhwZWN0KHJlbG9hZGVkUGFja2FnZS50aXRsZSkudG9CZShcIlRlc3QgUGFja2FnZVwiKVxuICAgIGV4cGVjdChyZWxvYWRlZFBhY2thZ2UuZGVzY3JpcHRpb24pLnRvQmUoXCJBIHRlc3QgcGFja2FnZVwiKVxuICAgIGV4cGVjdChyZWxvYWRlZFBhY2thZ2UucmVzb3VyY2VzKS50b0hhdmVMZW5ndGgoMSlcbiAgICBleHBlY3QocmVsb2FkZWRQYWNrYWdlLnJlc291cmNlc1swXT8ubmFtZSkudG9CZShcInRlc3QtcmVzb3VyY2VcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBzYXZlIGFuZCByZWxvYWQgcGFja2FnZSBwcmVzZXJ2aW5nIG1ldGFkYXRhXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvcmlnaW5hbFBhY2thZ2U6IFBhY2thZ2UgPSB7XG4gICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgdGl0bGU6IFwiVGVzdCBQYWNrYWdlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJBIHRlc3QgcGFja2FnZVwiLFxuICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgICAga2V5d29yZHM6IFtcInRlc3RcIiwgXCJwYWNrYWdlXCJdLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInRlc3QtcmVzb3VyY2VcIixcbiAgICAgICAgICBkYXRhOiBbeyBpZDogMSB9XSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgYXdhaXQgc2F2ZVBhY2thZ2VUb1ppcChvcmlnaW5hbFBhY2thZ2UsIHsgYXJjaGl2ZVBhdGg6IHRlbXBaaXBQYXRoIH0pXG4gICAgY29uc3QgcmVsb2FkZWRQYWNrYWdlID0gYXdhaXQgbG9hZFBhY2thZ2VGcm9tWmlwKHRlbXBaaXBQYXRoKVxuXG4gICAgZXhwZWN0KHJlbG9hZGVkUGFja2FnZS5uYW1lKS50b0JlKFwidGVzdC1wYWNrYWdlXCIpXG4gICAgZXhwZWN0KHJlbG9hZGVkUGFja2FnZS50aXRsZSkudG9CZShcIlRlc3QgUGFja2FnZVwiKVxuICAgIGV4cGVjdChyZWxvYWRlZFBhY2thZ2UudmVyc2lvbikudG9CZShcIjEuMC4wXCIpXG4gICAgZXhwZWN0KHJlbG9hZGVkUGFja2FnZS5rZXl3b3JkcykudG9FcXVhbChbXCJ0ZXN0XCIsIFwicGFja2FnZVwiXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBzYXZlIGFuZCByZWxvYWQgcGFja2FnZSB3aXRoIHNjaGVtYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3JpZ2luYWxQYWNrYWdlOiBQYWNrYWdlID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0ZXN0LXJlc291cmNlXCIsXG4gICAgICAgICAgZGF0YTogW3sgaWQ6IDEsIG5hbWU6IFwiYWxpY2VcIiB9XSxcbiAgICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJpbnRlZ2VyXCIgfSxcbiAgICAgICAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBhd2FpdCBzYXZlUGFja2FnZVRvWmlwKG9yaWdpbmFsUGFja2FnZSwgeyBhcmNoaXZlUGF0aDogdGVtcFppcFBhdGggfSlcbiAgICBjb25zdCByZWxvYWRlZFBhY2thZ2UgPSBhd2FpdCBsb2FkUGFja2FnZUZyb21aaXAodGVtcFppcFBhdGgpXG5cbiAgICBjb25zdCBzY2hlbWEgPSByZWxvYWRlZFBhY2thZ2UucmVzb3VyY2VzWzBdPy5zY2hlbWFcbiAgICBleHBlY3Qoc2NoZW1hKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHR5cGVvZiBzY2hlbWEgPT09IFwib2JqZWN0XCIgJiYgXCJmaWVsZHNcIiBpbiBzY2hlbWEpLnRvQmUodHJ1ZSlcbiAgICBpZiAodHlwZW9mIHNjaGVtYSA9PT0gXCJvYmplY3RcIiAmJiBcImZpZWxkc1wiIGluIHNjaGVtYSkge1xuICAgICAgZXhwZWN0KHNjaGVtYS5maWVsZHMpLnRvSGF2ZUxlbmd0aCgyKVxuICAgICAgZXhwZWN0KHNjaGVtYS5maWVsZHM/LlswXT8ubmFtZSkudG9CZShcImlkXCIpXG4gICAgICBleHBlY3Qoc2NoZW1hLmZpZWxkcz8uWzFdPy5uYW1lKS50b0JlKFwibmFtZVwiKVxuICAgIH1cbiAgfSlcblxuICBpdChcInNob3VsZCBzYXZlIGFuZCByZWxvYWQgcGFja2FnZSB3aXRoIGZpbGUgcmVzb3VyY2VzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZDb250ZW50ID0gXCJpZCxuYW1lXFxuMSxhbGljZVxcbjIsYm9iXCJcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShjc3ZDb250ZW50KVxuXG4gICAgY29uc3Qgb3JpZ2luYWxQYWNrYWdlOiBQYWNrYWdlID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0ZXN0LXJlc291cmNlXCIsXG4gICAgICAgICAgcGF0aDogY3N2UGF0aCxcbiAgICAgICAgICBmb3JtYXQ6IFwiY3N2XCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGF3YWl0IHNhdmVQYWNrYWdlVG9aaXAob3JpZ2luYWxQYWNrYWdlLCB7IGFyY2hpdmVQYXRoOiB0ZW1wWmlwUGF0aCB9KVxuICAgIGNvbnN0IHJlbG9hZGVkUGFja2FnZSA9IGF3YWl0IGxvYWRQYWNrYWdlRnJvbVppcCh0ZW1wWmlwUGF0aClcblxuICAgIGV4cGVjdChyZWxvYWRlZFBhY2thZ2UucmVzb3VyY2VzKS50b0hhdmVMZW5ndGgoMSlcbiAgICBleHBlY3QocmVsb2FkZWRQYWNrYWdlLnJlc291cmNlc1swXT8ubmFtZSkudG9CZShcInRlc3QtcmVzb3VyY2VcIilcbiAgICBleHBlY3QocmVsb2FkZWRQYWNrYWdlLnJlc291cmNlc1swXT8uZm9ybWF0KS50b0JlKFwiY3N2XCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiBzYXZpbmcgdG8gZXhpc3RpbmcgZmlsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGF0YVBhY2thZ2U6IFBhY2thZ2UgPSB7XG4gICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInRlc3QtcmVzb3VyY2VcIixcbiAgICAgICAgICBkYXRhOiBbXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgYXdhaXQgd3JpdGVUZW1wRmlsZShcImV4aXN0aW5nIGNvbnRlbnRcIiwgeyBwZXJzaXN0OiB0cnVlIH0pXG4gICAgY29uc3QgZXhpc3RpbmdQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImV4aXN0aW5nIGNvbnRlbnRcIilcblxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIHNhdmVQYWNrYWdlVG9aaXAoZGF0YVBhY2thZ2UsIHsgYXJjaGl2ZVBhdGg6IGV4aXN0aW5nUGF0aCB9KSxcbiAgICApLnJlamVjdHMudG9UaHJvdygpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgY3JlYXRlIHZhbGlkIHppcCBmaWxlIHN0cnVjdHVyZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGF0YVBhY2thZ2U6IFBhY2thZ2UgPSB7XG4gICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInRlc3QtcmVzb3VyY2VcIixcbiAgICAgICAgICBkYXRhOiBbeyBpZDogMSB9XSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgYXdhaXQgc2F2ZVBhY2thZ2VUb1ppcChkYXRhUGFja2FnZSwgeyBhcmNoaXZlUGF0aDogdGVtcFppcFBhdGggfSlcbiAgICBjb25zdCByZWxvYWRlZFBhY2thZ2UgPSBhd2FpdCBsb2FkUGFja2FnZUZyb21aaXAodGVtcFppcFBhdGgpXG5cbiAgICBleHBlY3QocmVsb2FkZWRQYWNrYWdlKS50b01hdGNoT2JqZWN0KHtcbiAgICAgIG5hbWU6IFwidGVzdC1wYWNrYWdlXCIsXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwidGVzdC1yZXNvdXJjZVwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHNhdmUgcGFja2FnZSB3aXRoIG11bHRpcGxlIGZpbGUgcmVzb3VyY2VzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3YxQ29udGVudCA9IFwiaWQsbmFtZVxcbjEsYWxpY2VcIlxuICAgIGNvbnN0IGNzdjJDb250ZW50ID0gXCJpZCx2YWx1ZVxcbjEsMTAwXCJcbiAgICBjb25zdCBjc3YxUGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoY3N2MUNvbnRlbnQpXG4gICAgY29uc3QgY3N2MlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKGNzdjJDb250ZW50KVxuXG4gICAgY29uc3Qgb3JpZ2luYWxQYWNrYWdlOiBQYWNrYWdlID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJyZXNvdXJjZS0xXCIsXG4gICAgICAgICAgcGF0aDogY3N2MVBhdGgsXG4gICAgICAgICAgZm9ybWF0OiBcImNzdlwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJyZXNvdXJjZS0yXCIsXG4gICAgICAgICAgcGF0aDogY3N2MlBhdGgsXG4gICAgICAgICAgZm9ybWF0OiBcImNzdlwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBhd2FpdCBzYXZlUGFja2FnZVRvWmlwKG9yaWdpbmFsUGFja2FnZSwgeyBhcmNoaXZlUGF0aDogdGVtcFppcFBhdGggfSlcbiAgICBjb25zdCByZWxvYWRlZFBhY2thZ2UgPSBhd2FpdCBsb2FkUGFja2FnZUZyb21aaXAodGVtcFppcFBhdGgpXG5cbiAgICBleHBlY3QocmVsb2FkZWRQYWNrYWdlLnJlc291cmNlcykudG9IYXZlTGVuZ3RoKDIpXG4gICAgZXhwZWN0KHJlbG9hZGVkUGFja2FnZS5yZXNvdXJjZXNbMF0/Lm5hbWUpLnRvQmUoXCJyZXNvdXJjZS0xXCIpXG4gICAgZXhwZWN0KHJlbG9hZGVkUGFja2FnZS5yZXNvdXJjZXNbMV0/Lm5hbWUpLnRvQmUoXCJyZXNvdXJjZS0yXCIpXG4gIH0pXG59KVxuIl19
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Package } from "@frictionless-ts/metadata";
|
|
2
|
+
import type { DatasetPlugin } from "../../plugin.ts";
|
|
3
|
+
export declare class ZipPlugin implements DatasetPlugin {
|
|
4
|
+
loadPackage(source: string): Promise<Package | undefined>;
|
|
5
|
+
savePackage(dataPackage: Package, options: {
|
|
6
|
+
target: string;
|
|
7
|
+
withRemote?: boolean;
|
|
8
|
+
}): Promise<{
|
|
9
|
+
path: undefined;
|
|
10
|
+
} | undefined>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { loadPackageFromZip, savePackageToZip } from "./package/index.js";
|
|
2
|
+
export class ZipPlugin {
|
|
3
|
+
async loadPackage(source) {
|
|
4
|
+
const isZip = getIsZip(source);
|
|
5
|
+
if (!isZip)
|
|
6
|
+
return undefined;
|
|
7
|
+
const dataPackage = await loadPackageFromZip(source);
|
|
8
|
+
return dataPackage;
|
|
9
|
+
}
|
|
10
|
+
async savePackage(dataPackage, options) {
|
|
11
|
+
const isZip = getIsZip(options.target);
|
|
12
|
+
if (!isZip)
|
|
13
|
+
return undefined;
|
|
14
|
+
await savePackageToZip(dataPackage, {
|
|
15
|
+
archivePath: options.target,
|
|
16
|
+
withRemote: !!options?.withRemote,
|
|
17
|
+
});
|
|
18
|
+
return { path: undefined };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function getIsZip(path) {
|
|
22
|
+
return path.endsWith(".zip");
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2lucy96aXAvcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBRXpFLE1BQU0sT0FBTyxTQUFTO0lBQ3BCLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBYztRQUM5QixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDOUIsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUU1QixNQUFNLFdBQVcsR0FBRyxNQUFNLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ3BELE9BQU8sV0FBVyxDQUFBO0lBQ3BCLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUNmLFdBQW9CLEVBQ3BCLE9BQWlEO1FBRWpELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDdEMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUU1QixNQUFNLGdCQUFnQixDQUFDLFdBQVcsRUFBRTtZQUNsQyxXQUFXLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDM0IsVUFBVSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVTtTQUNsQyxDQUFDLENBQUE7UUFFRixPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFBO0lBQzVCLENBQUM7Q0FDRjtBQUVELFNBQVMsUUFBUSxDQUFDLElBQVk7SUFDNUIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFBhY2thZ2UgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IERhdGFzZXRQbHVnaW4gfSBmcm9tIFwiLi4vLi4vcGx1Z2luLnRzXCJcbmltcG9ydCB7IGxvYWRQYWNrYWdlRnJvbVppcCwgc2F2ZVBhY2thZ2VUb1ppcCB9IGZyb20gXCIuL3BhY2thZ2UvaW5kZXgudHNcIlxuXG5leHBvcnQgY2xhc3MgWmlwUGx1Z2luIGltcGxlbWVudHMgRGF0YXNldFBsdWdpbiB7XG4gIGFzeW5jIGxvYWRQYWNrYWdlKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgY29uc3QgaXNaaXAgPSBnZXRJc1ppcChzb3VyY2UpXG4gICAgaWYgKCFpc1ppcCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgY29uc3QgZGF0YVBhY2thZ2UgPSBhd2FpdCBsb2FkUGFja2FnZUZyb21aaXAoc291cmNlKVxuICAgIHJldHVybiBkYXRhUGFja2FnZVxuICB9XG5cbiAgYXN5bmMgc2F2ZVBhY2thZ2UoXG4gICAgZGF0YVBhY2thZ2U6IFBhY2thZ2UsXG4gICAgb3B0aW9uczogeyB0YXJnZXQ6IHN0cmluZzsgd2l0aFJlbW90ZT86IGJvb2xlYW4gfSxcbiAgKSB7XG4gICAgY29uc3QgaXNaaXAgPSBnZXRJc1ppcChvcHRpb25zLnRhcmdldClcbiAgICBpZiAoIWlzWmlwKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICBhd2FpdCBzYXZlUGFja2FnZVRvWmlwKGRhdGFQYWNrYWdlLCB7XG4gICAgICBhcmNoaXZlUGF0aDogb3B0aW9ucy50YXJnZXQsXG4gICAgICB3aXRoUmVtb3RlOiAhIW9wdGlvbnM/LndpdGhSZW1vdGUsXG4gICAgfSlcblxuICAgIHJldHVybiB7IHBhdGg6IHVuZGVmaW5lZCB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SXNaaXAocGF0aDogc3RyaW5nKSB7XG4gIHJldHVybiBwYXRoLmVuZHNXaXRoKFwiLnppcFwiKVxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import * as packageModule from "./package/index.js";
|
|
3
|
+
import { ZipPlugin } from "./plugin.js";
|
|
4
|
+
vi.mock("./package/index.ts", () => ({
|
|
5
|
+
loadPackageFromZip: vi.fn(),
|
|
6
|
+
savePackageToZip: vi.fn(),
|
|
7
|
+
}));
|
|
8
|
+
describe("ZipPlugin", () => {
|
|
9
|
+
let plugin;
|
|
10
|
+
let mockLoadPackageFromZip;
|
|
11
|
+
let mockSavePackageToZip;
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
plugin = new ZipPlugin();
|
|
14
|
+
mockLoadPackageFromZip = vi.mocked(packageModule.loadPackageFromZip);
|
|
15
|
+
mockSavePackageToZip = vi.mocked(packageModule.savePackageToZip);
|
|
16
|
+
vi.clearAllMocks();
|
|
17
|
+
});
|
|
18
|
+
describe("loadPackage", () => {
|
|
19
|
+
it("should load package from zip file", async () => {
|
|
20
|
+
const mockPackage = {
|
|
21
|
+
name: "test-package",
|
|
22
|
+
resources: [{ name: "test-resource", data: [] }],
|
|
23
|
+
};
|
|
24
|
+
mockLoadPackageFromZip.mockResolvedValue(mockPackage);
|
|
25
|
+
const result = await plugin.loadPackage("test.zip");
|
|
26
|
+
expect(mockLoadPackageFromZip).toHaveBeenCalledWith("test.zip");
|
|
27
|
+
expect(result).toEqual(mockPackage);
|
|
28
|
+
});
|
|
29
|
+
it("should return undefined for non-zip files", async () => {
|
|
30
|
+
const result = await plugin.loadPackage("test.json");
|
|
31
|
+
expect(mockLoadPackageFromZip).not.toHaveBeenCalled();
|
|
32
|
+
expect(result).toBeUndefined();
|
|
33
|
+
});
|
|
34
|
+
it("should recognize .zip extension case-insensitively", async () => {
|
|
35
|
+
const mockPackage = {
|
|
36
|
+
name: "test-package",
|
|
37
|
+
resources: [],
|
|
38
|
+
};
|
|
39
|
+
mockLoadPackageFromZip.mockResolvedValue(mockPackage);
|
|
40
|
+
await plugin.loadPackage("test.zip");
|
|
41
|
+
expect(mockLoadPackageFromZip).toHaveBeenCalledWith("test.zip");
|
|
42
|
+
});
|
|
43
|
+
it("should handle paths with directories", async () => {
|
|
44
|
+
const mockPackage = {
|
|
45
|
+
name: "test-package",
|
|
46
|
+
resources: [],
|
|
47
|
+
};
|
|
48
|
+
mockLoadPackageFromZip.mockResolvedValue(mockPackage);
|
|
49
|
+
const result = await plugin.loadPackage("/path/to/file.zip");
|
|
50
|
+
expect(mockLoadPackageFromZip).toHaveBeenCalledWith("/path/to/file.zip");
|
|
51
|
+
expect(result).toEqual(mockPackage);
|
|
52
|
+
});
|
|
53
|
+
it("should return undefined for files without extension", async () => {
|
|
54
|
+
const result = await plugin.loadPackage("test");
|
|
55
|
+
expect(mockLoadPackageFromZip).not.toHaveBeenCalled();
|
|
56
|
+
expect(result).toBeUndefined();
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe("savePackage", () => {
|
|
60
|
+
it("should save package to zip file", async () => {
|
|
61
|
+
const dataPackage = {
|
|
62
|
+
name: "test-package",
|
|
63
|
+
resources: [{ name: "test-resource", data: [] }],
|
|
64
|
+
};
|
|
65
|
+
mockSavePackageToZip.mockResolvedValue(undefined);
|
|
66
|
+
const result = await plugin.savePackage(dataPackage, {
|
|
67
|
+
target: "output.zip",
|
|
68
|
+
});
|
|
69
|
+
expect(mockSavePackageToZip).toHaveBeenCalledWith(dataPackage, {
|
|
70
|
+
archivePath: "output.zip",
|
|
71
|
+
withRemote: false,
|
|
72
|
+
});
|
|
73
|
+
expect(result).toEqual({ path: undefined });
|
|
74
|
+
});
|
|
75
|
+
it("should return undefined for non-zip targets", async () => {
|
|
76
|
+
const dataPackage = {
|
|
77
|
+
name: "test-package",
|
|
78
|
+
resources: [],
|
|
79
|
+
};
|
|
80
|
+
const result = await plugin.savePackage(dataPackage, {
|
|
81
|
+
target: "output.json",
|
|
82
|
+
});
|
|
83
|
+
expect(mockSavePackageToZip).not.toHaveBeenCalled();
|
|
84
|
+
expect(result).toBeUndefined();
|
|
85
|
+
});
|
|
86
|
+
it("should pass withRemote option", async () => {
|
|
87
|
+
const dataPackage = {
|
|
88
|
+
name: "test-package",
|
|
89
|
+
resources: [],
|
|
90
|
+
};
|
|
91
|
+
mockSavePackageToZip.mockResolvedValue(undefined);
|
|
92
|
+
await plugin.savePackage(dataPackage, {
|
|
93
|
+
target: "output.zip",
|
|
94
|
+
withRemote: true,
|
|
95
|
+
});
|
|
96
|
+
expect(mockSavePackageToZip).toHaveBeenCalledWith(dataPackage, {
|
|
97
|
+
archivePath: "output.zip",
|
|
98
|
+
withRemote: true,
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
it("should handle withRemote as false when not provided", async () => {
|
|
102
|
+
const dataPackage = {
|
|
103
|
+
name: "test-package",
|
|
104
|
+
resources: [],
|
|
105
|
+
};
|
|
106
|
+
mockSavePackageToZip.mockResolvedValue(undefined);
|
|
107
|
+
await plugin.savePackage(dataPackage, {
|
|
108
|
+
target: "output.zip",
|
|
109
|
+
});
|
|
110
|
+
expect(mockSavePackageToZip).toHaveBeenCalledWith(dataPackage, {
|
|
111
|
+
archivePath: "output.zip",
|
|
112
|
+
withRemote: false,
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
it("should handle paths with directories", async () => {
|
|
116
|
+
const dataPackage = {
|
|
117
|
+
name: "test-package",
|
|
118
|
+
resources: [],
|
|
119
|
+
};
|
|
120
|
+
mockSavePackageToZip.mockResolvedValue(undefined);
|
|
121
|
+
await plugin.savePackage(dataPackage, {
|
|
122
|
+
target: "/path/to/output.zip",
|
|
123
|
+
});
|
|
124
|
+
expect(mockSavePackageToZip).toHaveBeenCalledWith(dataPackage, {
|
|
125
|
+
archivePath: "/path/to/output.zip",
|
|
126
|
+
withRemote: false,
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
it("should save package with metadata", async () => {
|
|
130
|
+
const dataPackage = {
|
|
131
|
+
name: "test-package",
|
|
132
|
+
title: "Test Package",
|
|
133
|
+
description: "A test package",
|
|
134
|
+
resources: [],
|
|
135
|
+
};
|
|
136
|
+
mockSavePackageToZip.mockResolvedValue(undefined);
|
|
137
|
+
await plugin.savePackage(dataPackage, {
|
|
138
|
+
target: "output.zip",
|
|
139
|
+
});
|
|
140
|
+
expect(mockSavePackageToZip).toHaveBeenCalledWith(dataPackage, {
|
|
141
|
+
archivePath: "output.zip",
|
|
142
|
+
withRemote: false,
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
it("should return undefined for files without extension", async () => {
|
|
146
|
+
const dataPackage = {
|
|
147
|
+
name: "test-package",
|
|
148
|
+
resources: [],
|
|
149
|
+
};
|
|
150
|
+
const result = await plugin.savePackage(dataPackage, {
|
|
151
|
+
target: "output",
|
|
152
|
+
});
|
|
153
|
+
expect(mockSavePackageToZip).not.toHaveBeenCalled();
|
|
154
|
+
expect(result).toBeUndefined();
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW5zL3ppcC9wbHVnaW4uc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3RCxPQUFPLEtBQUssYUFBYSxNQUFNLG9CQUFvQixDQUFBO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFdkMsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDM0IsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtDQUMxQixDQUFDLENBQUMsQ0FBQTtBQUVILFFBQVEsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO0lBQ3pCLElBQUksTUFBaUIsQ0FBQTtJQUNyQixJQUFJLHNCQUFnRCxDQUFBO0lBQ3BELElBQUksb0JBQThDLENBQUE7SUFFbEQsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLE1BQU0sR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFBO1FBQ3hCLHNCQUFzQixHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFDcEUsb0JBQW9CLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUNoRSxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUE7SUFDcEIsQ0FBQyxDQUFDLENBQUE7SUFFRixRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtRQUMzQixFQUFFLENBQUMsbUNBQW1DLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDakQsTUFBTSxXQUFXLEdBQVk7Z0JBQzNCLElBQUksRUFB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LGNBQWM7Z0JBQ3JCLFdBQVcsRUFBRSxnQkFBZ0I7Z0JBQzdCLFNBQVMsRUFBRSxFQUFFO2FBQ2QsQ0FBQTtZQUNELG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBRWpELE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUU7Z0JBQ3BDLE1BQU0sRUFBRSxZQUFZO2FBQ3JCLENBQUMsQ0FBQTtZQUVGLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRTtnQkFDN0QsV0FBVyxFQUFFLFlBQVk7Z0JBQ3pCLFVBQVUsRUFBRSxLQUFLO2FBQ2xCLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO1FBRUYsRUFBRSxDQUFDLHFEQUFxRCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ25FLE1BQU0sV0FBVyxHQUFZO2dCQUMzQixJQUFJLEVBQUUsY0FBYztnQkFDcEIsU0FBUyxFQUFFLEVBQUU7YUFDZCxDQUFBO1lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRTtnQkFDbkQsTUFBTSxFQUFFLFFBQVE7YUFDakIsQ0FBQyxDQUFBO1lBRUYsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUE7WUFDbkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ2hDLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUGFja2FnZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB7IGJlZm9yZUVhY2gsIGRlc2NyaWJlLCBleHBlY3QsIGl0LCB2aSB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0ICogYXMgcGFja2FnZU1vZHVsZSBmcm9tIFwiLi9wYWNrYWdlL2luZGV4LnRzXCJcbmltcG9ydCB7IFppcFBsdWdpbiB9IGZyb20gXCIuL3BsdWdpbi50c1wiXG5cbnZpLm1vY2soXCIuL3BhY2thZ2UvaW5kZXgudHNcIiwgKCkgPT4gKHtcbiAgbG9hZFBhY2thZ2VGcm9tWmlwOiB2aS5mbigpLFxuICBzYXZlUGFja2FnZVRvWmlwOiB2aS5mbigpLFxufSkpXG5cbmRlc2NyaWJlKFwiWmlwUGx1Z2luXCIsICgpID0+IHtcbiAgbGV0IHBsdWdpbjogWmlwUGx1Z2luXG4gIGxldCBtb2NrTG9hZFBhY2thZ2VGcm9tWmlwOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj5cbiAgbGV0IG1vY2tTYXZlUGFja2FnZVRvWmlwOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj5cblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBwbHVnaW4gPSBuZXcgWmlwUGx1Z2luKClcbiAgICBtb2NrTG9hZFBhY2thZ2VGcm9tWmlwID0gdmkubW9ja2VkKHBhY2thZ2VNb2R1bGUubG9hZFBhY2thZ2VGcm9tWmlwKVxuICAgIG1vY2tTYXZlUGFja2FnZVRvWmlwID0gdmkubW9ja2VkKHBhY2thZ2VNb2R1bGUuc2F2ZVBhY2thZ2VUb1ppcClcbiAgICB2aS5jbGVhckFsbE1vY2tzKClcbiAgfSlcblxuICBkZXNjcmliZShcImxvYWRQYWNrYWdlXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBsb2FkIHBhY2thZ2UgZnJvbSB6aXAgZmlsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtb2NrUGFja2FnZTogUGFja2FnZSA9IHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgICAgcmVzb3VyY2VzOiBbeyBuYW1lOiBcInRlc3QtcmVzb3VyY2VcIiwgZGF0YTogW10gfV0sXG4gICAgICB9XG4gICAgICBtb2NrTG9hZFBhY2thZ2VGcm9tWmlwLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tQYWNrYWdlKVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwbHVnaW4ubG9hZFBhY2thZ2UoXCJ0ZXN0LnppcFwiKVxuXG4gICAgICBleHBlY3QobW9ja0xvYWRQYWNrYWdlRnJvbVppcCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXCJ0ZXN0LnppcFwiKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChtb2NrUGFja2FnZSlcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCBmb3Igbm9uLXppcCBmaWxlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwbHVnaW4ubG9hZFBhY2thZ2UoXCJ0ZXN0Lmpzb25cIilcblxuICAgICAgZXhwZWN0KG1vY2tMb2FkUGFja2FnZUZyb21aaXApLm5vdC50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVVbmRlZmluZWQoKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCByZWNvZ25pemUgLnppcCBleHRlbnNpb24gY2FzZS1pbnNlbnNpdGl2ZWx5XCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1vY2tQYWNrYWdlOiBQYWNrYWdlID0ge1xuICAgICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgICByZXNvdXJjZXM6IFtdLFxuICAgICAgfVxuICAgICAgbW9ja0xvYWRQYWNrYWdlRnJvbVppcC5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrUGFja2FnZSlcblxuICAgICAgYXdhaXQgcGx1Z2luLmxvYWRQYWNrYWdlKFwidGVzdC56aXBcIilcblxuICAgICAgZXhwZWN0KG1vY2tMb2FkUGFja2FnZUZyb21aaXApLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFwidGVzdC56aXBcIilcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgaGFuZGxlIHBhdGhzIHdpdGggZGlyZWN0b3JpZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbW9ja1BhY2thZ2U6IFBhY2thZ2UgPSB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1wYWNrYWdlXCIsXG4gICAgICAgIHJlc291cmNlczogW10sXG4gICAgICB9XG4gICAgICBtb2NrTG9hZFBhY2thZ2VGcm9tWmlwLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tQYWNrYWdlKVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwbHVnaW4ubG9hZFBhY2thZ2UoXCIvcGF0aC90by9maWxlLnppcFwiKVxuXG4gICAgICBleHBlY3QobW9ja0xvYWRQYWNrYWdlRnJvbVppcCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXCIvcGF0aC90by9maWxlLnppcFwiKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChtb2NrUGFja2FnZSlcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCBmb3IgZmlsZXMgd2l0aG91dCBleHRlbnNpb25cIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGx1Z2luLmxvYWRQYWNrYWdlKFwidGVzdFwiKVxuXG4gICAgICBleHBlY3QobW9ja0xvYWRQYWNrYWdlRnJvbVppcCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZVVuZGVmaW5lZCgpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZShcInNhdmVQYWNrYWdlXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBzYXZlIHBhY2thZ2UgdG8gemlwIGZpbGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YVBhY2thZ2U6IFBhY2thZ2UgPSB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1wYWNrYWdlXCIsXG4gICAgICAgIHJlc291cmNlczogW3sgbmFtZTogXCJ0ZXN0LXJlc291cmNlXCIsIGRhdGE6IFtdIH1dLFxuICAgICAgfVxuICAgICAgbW9ja1NhdmVQYWNrYWdlVG9aaXAubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwbHVnaW4uc2F2ZVBhY2thZ2UoZGF0YVBhY2thZ2UsIHtcbiAgICAgICAgdGFyZ2V0OiBcIm91dHB1dC56aXBcIixcbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdChtb2NrU2F2ZVBhY2thZ2VUb1ppcCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZGF0YVBhY2thZ2UsIHtcbiAgICAgICAgYXJjaGl2ZVBhdGg6IFwib3V0cHV0LnppcFwiLFxuICAgICAgICB3aXRoUmVtb3RlOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHsgcGF0aDogdW5kZWZpbmVkIH0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIHJldHVybiB1bmRlZmluZWQgZm9yIG5vbi16aXAgdGFyZ2V0c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhUGFja2FnZTogUGFja2FnZSA9IHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgICAgcmVzb3VyY2VzOiBbXSxcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGx1Z2luLnNhdmVQYWNrYWdlKGRhdGFQYWNrYWdlLCB7XG4gICAgICAgIHRhcmdldDogXCJvdXRwdXQuanNvblwiLFxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KG1vY2tTYXZlUGFja2FnZVRvWmlwKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlVW5kZWZpbmVkKClcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgcGFzcyB3aXRoUmVtb3RlIG9wdGlvblwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhUGFja2FnZTogUGFja2FnZSA9IHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgICAgcmVzb3VyY2VzOiBbXSxcbiAgICAgIH1cbiAgICAgIG1vY2tTYXZlUGFja2FnZVRvWmlwLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZClcblxuICAgICAgYXdhaXQgcGx1Z2luLnNhdmVQYWNrYWdlKGRhdGFQYWNrYWdlLCB7XG4gICAgICAgIHRhcmdldDogXCJvdXRwdXQuemlwXCIsXG4gICAgICAgIHdpdGhSZW1vdGU6IHRydWUsXG4gICAgICB9KVxuXG4gICAgICBleHBlY3QobW9ja1NhdmVQYWNrYWdlVG9aaXApLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGRhdGFQYWNrYWdlLCB7XG4gICAgICAgIGFyY2hpdmVQYXRoOiBcIm91dHB1dC56aXBcIixcbiAgICAgICAgd2l0aFJlbW90ZTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGhhbmRsZSB3aXRoUmVtb3RlIGFzIGZhbHNlIHdoZW4gbm90IHByb3ZpZGVkXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFQYWNrYWdlOiBQYWNrYWdlID0ge1xuICAgICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgICByZXNvdXJjZXM6IFtdLFxuICAgICAgfVxuICAgICAgbW9ja1NhdmVQYWNrYWdlVG9aaXAubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKVxuXG4gICAgICBhd2FpdCBwbHVnaW4uc2F2ZVBhY2thZ2UoZGF0YVBhY2thZ2UsIHtcbiAgICAgICAgdGFyZ2V0OiBcIm91dHB1dC56aXBcIixcbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdChtb2NrU2F2ZVBhY2thZ2VUb1ppcCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZGF0YVBhY2thZ2UsIHtcbiAgICAgICAgYXJjaGl2ZVBhdGg6IFwib3V0cHV0LnppcFwiLFxuICAgICAgICB3aXRoUmVtb3RlOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGhhbmRsZSBwYXRocyB3aXRoIGRpcmVjdG9yaWVzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFQYWNrYWdlOiBQYWNrYWdlID0ge1xuICAgICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgICByZXNvdXJjZXM6IFtdLFxuICAgICAgfVxuICAgICAgbW9ja1NhdmVQYWNrYWdlVG9aaXAubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKVxuXG4gICAgICBhd2FpdCBwbHVnaW4uc2F2ZVBhY2thZ2UoZGF0YVBhY2thZ2UsIHtcbiAgICAgICAgdGFyZ2V0OiBcIi9wYXRoL3RvL291dHB1dC56aXBcIixcbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdChtb2NrU2F2ZVBhY2thZ2VUb1ppcCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZGF0YVBhY2thZ2UsIHtcbiAgICAgICAgYXJjaGl2ZVBhdGg6IFwiL3BhdGgvdG8vb3V0cHV0LnppcFwiLFxuICAgICAgICB3aXRoUmVtb3RlOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIHNhdmUgcGFja2FnZSB3aXRoIG1ldGFkYXRhXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFQYWNrYWdlOiBQYWNrYWdlID0ge1xuICAgICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgICB0aXRsZTogXCJUZXN0IFBhY2thZ2VcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiQSB0ZXN0IHBhY2thZ2VcIixcbiAgICAgICAgcmVzb3VyY2VzOiBbXSxcbiAgICAgIH1cbiAgICAgIG1vY2tTYXZlUGFja2FnZVRvWmlwLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZClcblxuICAgICAgYXdhaXQgcGx1Z2luLnNhdmVQYWNrYWdlKGRhdGFQYWNrYWdlLCB7XG4gICAgICAgIHRhcmdldDogXCJvdXRwdXQuemlwXCIsXG4gICAgICB9KVxuXG4gICAgICBleHBlY3QobW9ja1NhdmVQYWNrYWdlVG9aaXApLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGRhdGFQYWNrYWdlLCB7XG4gICAgICAgIGFyY2hpdmVQYXRoOiBcIm91dHB1dC56aXBcIixcbiAgICAgICAgd2l0aFJlbW90ZTogZmFsc2UsXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCByZXR1cm4gdW5kZWZpbmVkIGZvciBmaWxlcyB3aXRob3V0IGV4dGVuc2lvblwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhUGFja2FnZTogUGFja2FnZSA9IHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgICAgcmVzb3VyY2VzOiBbXSxcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGx1Z2luLnNhdmVQYWNrYWdlKGRhdGFQYWNrYWdlLCB7XG4gICAgICAgIHRhcmdldDogXCJvdXRwdXRcIixcbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdChtb2NrU2F2ZVBhY2thZ2VUb1ppcCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZVVuZGVmaW5lZCgpXG4gICAgfSlcbiAgfSlcbn0pXG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { saveResourceFiles } from "./save.ts";
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { saveResourceFiles } from "./save.js";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9yZXNvdXJjZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxXQUFXLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBzYXZlUmVzb3VyY2VGaWxlcyB9IGZyb20gXCIuL3NhdmUudHNcIlxuIl19
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Resource } from "@frictionless-ts/metadata";
|
|
2
|
+
export type SaveFile = (options: {
|
|
3
|
+
propertyName: string;
|
|
4
|
+
propertyIndex: number;
|
|
5
|
+
normalizedPath: string;
|
|
6
|
+
denormalizedPath: string;
|
|
7
|
+
}) => Promise<string>;
|
|
8
|
+
export declare function saveResourceFiles(resource: Resource, options: {
|
|
9
|
+
saveFile: SaveFile;
|
|
10
|
+
basepath?: string;
|
|
11
|
+
withRemote?: boolean;
|
|
12
|
+
withoutFolders?: boolean;
|
|
13
|
+
}): Promise<import("@frictionless-ts/metadata").Descriptor>;
|