@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.
Files changed (242) hide show
  1. package/README.md +3 -0
  2. package/build/file/copy.d.ts +4 -0
  3. package/build/file/copy.js +7 -0
  4. package/build/file/copy.spec.d.ts +1 -0
  5. package/build/file/copy.spec.js +104 -0
  6. package/build/file/describe.d.ts +7 -0
  7. package/build/file/describe.js +9 -0
  8. package/build/file/fetch.d.ts +2 -0
  9. package/build/file/fetch.js +21 -0
  10. package/build/file/index.d.ts +9 -0
  11. package/build/file/index.js +10 -0
  12. package/build/file/infer.d.ts +10 -0
  13. package/build/file/infer.js +48 -0
  14. package/build/file/infer.spec.d.ts +1 -0
  15. package/build/file/infer.spec.js +141 -0
  16. package/build/file/load.d.ts +3 -0
  17. package/build/file/load.js +7 -0
  18. package/build/file/path.d.ts +2 -0
  19. package/build/file/path.js +17 -0
  20. package/build/file/save.d.ts +3 -0
  21. package/build/file/save.js +7 -0
  22. package/build/file/temp.d.ts +11 -0
  23. package/build/file/temp.js +23 -0
  24. package/build/file/validate.d.ts +6 -0
  25. package/build/file/validate.js +47 -0
  26. package/build/file/validate.spec.d.ts +1 -0
  27. package/build/file/validate.spec.js +180 -0
  28. package/build/folder/create.d.ts +1 -0
  29. package/build/folder/create.js +5 -0
  30. package/build/folder/index.d.ts +2 -0
  31. package/build/folder/index.js +3 -0
  32. package/build/folder/temp.d.ts +3 -0
  33. package/build/folder/temp.js +16 -0
  34. package/build/index.d.ts +36 -0
  35. package/build/index.js +35 -0
  36. package/build/package/index.d.ts +2 -0
  37. package/build/package/index.js +3 -0
  38. package/build/package/merge.d.ts +23 -0
  39. package/build/package/merge.js +12 -0
  40. package/build/package/path.d.ts +3 -0
  41. package/build/package/path.js +43 -0
  42. package/build/package/path.spec.d.ts +1 -0
  43. package/build/package/path.spec.js +56 -0
  44. package/build/plugin.d.ts +11 -0
  45. package/build/plugin.js +2 -0
  46. package/build/plugins/ckan/ckan/index.d.ts +1 -0
  47. package/build/plugins/ckan/ckan/index.js +2 -0
  48. package/build/plugins/ckan/ckan/request.d.ts +11 -0
  49. package/build/plugins/ckan/ckan/request.js +35 -0
  50. package/build/plugins/ckan/index.d.ts +4 -0
  51. package/build/plugins/ckan/index.js +5 -0
  52. package/build/plugins/ckan/package/Organization.d.ts +21 -0
  53. package/build/plugins/ckan/package/Organization.js +2 -0
  54. package/build/plugins/ckan/package/Package.d.ts +76 -0
  55. package/build/plugins/ckan/package/Package.js +2 -0
  56. package/build/plugins/ckan/package/Tag.d.ts +17 -0
  57. package/build/plugins/ckan/package/Tag.js +2 -0
  58. package/build/plugins/ckan/package/convert/fromCkan.d.ts +3 -0
  59. package/build/plugins/ckan/package/convert/fromCkan.js +63 -0
  60. package/build/plugins/ckan/package/convert/fromCkan.spec.d.ts +1 -0
  61. package/build/plugins/ckan/package/convert/fromCkan.spec.js +80 -0
  62. package/build/plugins/ckan/package/convert/toCkan.d.ts +22 -0
  63. package/build/plugins/ckan/package/convert/toCkan.js +51 -0
  64. package/build/plugins/ckan/package/convert/toCkan.spec.d.ts +1 -0
  65. package/build/plugins/ckan/package/convert/toCkan.spec.js +153 -0
  66. package/build/plugins/ckan/package/fixtures/ckan-package.json +308 -0
  67. package/build/plugins/ckan/package/index.d.ts +7 -0
  68. package/build/plugins/ckan/package/index.js +5 -0
  69. package/build/plugins/ckan/package/load.d.ts +21 -0
  70. package/build/plugins/ckan/package/load.js +74 -0
  71. package/build/plugins/ckan/package/load.spec.d.ts +1 -0
  72. package/build/plugins/ckan/package/load.spec.js +11 -0
  73. package/build/plugins/ckan/package/save.d.ts +10 -0
  74. package/build/plugins/ckan/package/save.js +83 -0
  75. package/build/plugins/ckan/package/save.spec.d.ts +1 -0
  76. package/build/plugins/ckan/package/save.spec.js +319 -0
  77. package/build/plugins/ckan/plugin.d.ts +19 -0
  78. package/build/plugins/ckan/plugin.js +18 -0
  79. package/build/plugins/ckan/plugin.spec.d.ts +1 -0
  80. package/build/plugins/ckan/plugin.spec.js +83 -0
  81. package/build/plugins/ckan/resource/Resource.d.ts +56 -0
  82. package/build/plugins/ckan/resource/Resource.js +2 -0
  83. package/build/plugins/ckan/resource/convert/fromCkan.d.ts +3 -0
  84. package/build/plugins/ckan/resource/convert/fromCkan.js +39 -0
  85. package/build/plugins/ckan/resource/convert/toCkan.d.ts +3 -0
  86. package/build/plugins/ckan/resource/convert/toCkan.js +20 -0
  87. package/build/plugins/ckan/resource/index.d.ts +3 -0
  88. package/build/plugins/ckan/resource/index.js +3 -0
  89. package/build/plugins/ckan/schema/Field.d.ts +34 -0
  90. package/build/plugins/ckan/schema/Field.js +2 -0
  91. package/build/plugins/ckan/schema/Schema.d.ts +10 -0
  92. package/build/plugins/ckan/schema/Schema.js +2 -0
  93. package/build/plugins/ckan/schema/convert/fixtures/ckan-schema.json +115 -0
  94. package/build/plugins/ckan/schema/convert/fromCkan.d.ts +3 -0
  95. package/build/plugins/ckan/schema/convert/fromCkan.js +47 -0
  96. package/build/plugins/ckan/schema/convert/fromCkan.spec.d.ts +1 -0
  97. package/build/plugins/ckan/schema/convert/fromCkan.spec.js +157 -0
  98. package/build/plugins/ckan/schema/convert/toCkan.d.ts +3 -0
  99. package/build/plugins/ckan/schema/convert/toCkan.js +50 -0
  100. package/build/plugins/ckan/schema/convert/toCkan.spec.d.ts +1 -0
  101. package/build/plugins/ckan/schema/convert/toCkan.spec.js +278 -0
  102. package/build/plugins/ckan/schema/index.d.ts +4 -0
  103. package/build/plugins/ckan/schema/index.js +3 -0
  104. package/build/plugins/datahub/index.d.ts +2 -0
  105. package/build/plugins/datahub/index.js +3 -0
  106. package/build/plugins/datahub/package/index.d.ts +1 -0
  107. package/build/plugins/datahub/package/index.js +2 -0
  108. package/build/plugins/datahub/package/load.d.ts +1 -0
  109. package/build/plugins/datahub/package/load.js +9 -0
  110. package/build/plugins/datahub/package/load.spec.d.ts +1 -0
  111. package/build/plugins/datahub/package/load.spec.js +11 -0
  112. package/build/plugins/datahub/plugin.d.ts +4 -0
  113. package/build/plugins/datahub/plugin.js +18 -0
  114. package/build/plugins/datahub/plugin.spec.d.ts +1 -0
  115. package/build/plugins/datahub/plugin.spec.js +78 -0
  116. package/build/plugins/descriptor/index.d.ts +1 -0
  117. package/build/plugins/descriptor/index.js +2 -0
  118. package/build/plugins/descriptor/plugin.d.ts +11 -0
  119. package/build/plugins/descriptor/plugin.js +29 -0
  120. package/build/plugins/descriptor/plugin.spec.d.ts +1 -0
  121. package/build/plugins/descriptor/plugin.spec.js +169 -0
  122. package/build/plugins/folder/index.d.ts +2 -0
  123. package/build/plugins/folder/index.js +3 -0
  124. package/build/plugins/folder/package/index.d.ts +2 -0
  125. package/build/plugins/folder/package/index.js +3 -0
  126. package/build/plugins/folder/package/load.d.ts +1 -0
  127. package/build/plugins/folder/package/load.js +6 -0
  128. package/build/plugins/folder/package/load.spec.d.ts +1 -0
  129. package/build/plugins/folder/package/load.spec.js +175 -0
  130. package/build/plugins/folder/package/save.d.ts +7 -0
  131. package/build/plugins/folder/package/save.js +35 -0
  132. package/build/plugins/folder/package/save.spec.d.ts +1 -0
  133. package/build/plugins/folder/package/save.spec.js +328 -0
  134. package/build/plugins/folder/plugin.d.ts +4 -0
  135. package/build/plugins/folder/plugin.js +19 -0
  136. package/build/plugins/folder/plugin.spec.d.ts +1 -0
  137. package/build/plugins/folder/plugin.spec.js +53 -0
  138. package/build/plugins/github/github/index.d.ts +1 -0
  139. package/build/plugins/github/github/index.js +2 -0
  140. package/build/plugins/github/github/path.d.ts +1 -0
  141. package/build/plugins/github/github/path.js +4 -0
  142. package/build/plugins/github/github/request.d.ts +15 -0
  143. package/build/plugins/github/github/request.js +43 -0
  144. package/build/plugins/github/index.d.ts +3 -0
  145. package/build/plugins/github/index.js +4 -0
  146. package/build/plugins/github/package/License.d.ts +21 -0
  147. package/build/plugins/github/package/License.js +2 -0
  148. package/build/plugins/github/package/Owner.d.ts +25 -0
  149. package/build/plugins/github/package/Owner.js +2 -0
  150. package/build/plugins/github/package/Package.d.ts +87 -0
  151. package/build/plugins/github/package/Package.js +2 -0
  152. package/build/plugins/github/package/convert/fromGithub.d.ts +3 -0
  153. package/build/plugins/github/package/convert/fromGithub.js +50 -0
  154. package/build/plugins/github/package/index.d.ts +6 -0
  155. package/build/plugins/github/package/index.js +4 -0
  156. package/build/plugins/github/package/load.d.ts +23 -0
  157. package/build/plugins/github/package/load.js +48 -0
  158. package/build/plugins/github/package/load.spec.d.ts +1 -0
  159. package/build/plugins/github/package/load.spec.js +15 -0
  160. package/build/plugins/github/package/save.d.ts +14 -0
  161. package/build/plugins/github/package/save.js +69 -0
  162. package/build/plugins/github/package/save.spec.d.ts +1 -0
  163. package/build/plugins/github/package/save.spec.js +566 -0
  164. package/build/plugins/github/plugin.d.ts +19 -0
  165. package/build/plugins/github/plugin.js +18 -0
  166. package/build/plugins/github/plugin.spec.d.ts +1 -0
  167. package/build/plugins/github/plugin.spec.js +73 -0
  168. package/build/plugins/github/resource/Resource.d.ts +29 -0
  169. package/build/plugins/github/resource/Resource.js +2 -0
  170. package/build/plugins/github/resource/convert/fromGithub.d.ts +5 -0
  171. package/build/plugins/github/resource/convert/fromGithub.js +24 -0
  172. package/build/plugins/github/resource/convert/toGithub.d.ts +3 -0
  173. package/build/plugins/github/resource/convert/toGithub.js +10 -0
  174. package/build/plugins/github/resource/index.d.ts +3 -0
  175. package/build/plugins/github/resource/index.js +3 -0
  176. package/build/plugins/zenodo/index.d.ts +3 -0
  177. package/build/plugins/zenodo/index.js +4 -0
  178. package/build/plugins/zenodo/package/Creator.d.ts +20 -0
  179. package/build/plugins/zenodo/package/Creator.js +2 -0
  180. package/build/plugins/zenodo/package/Package.d.ts +94 -0
  181. package/build/plugins/zenodo/package/Package.js +2 -0
  182. package/build/plugins/zenodo/package/convert/fromZenodo.d.ts +3 -0
  183. package/build/plugins/zenodo/package/convert/fromZenodo.js +43 -0
  184. package/build/plugins/zenodo/package/convert/toZenodo.d.ts +3 -0
  185. package/build/plugins/zenodo/package/convert/toZenodo.js +79 -0
  186. package/build/plugins/zenodo/package/index.d.ts +6 -0
  187. package/build/plugins/zenodo/package/index.js +5 -0
  188. package/build/plugins/zenodo/package/load.d.ts +23 -0
  189. package/build/plugins/zenodo/package/load.js +45 -0
  190. package/build/plugins/zenodo/package/load.spec.d.ts +1 -0
  191. package/build/plugins/zenodo/package/load.spec.js +15 -0
  192. package/build/plugins/zenodo/package/save.d.ts +13 -0
  193. package/build/plugins/zenodo/package/save.js +74 -0
  194. package/build/plugins/zenodo/package/save.spec.d.ts +1 -0
  195. package/build/plugins/zenodo/package/save.spec.js +524 -0
  196. package/build/plugins/zenodo/plugin.d.ts +19 -0
  197. package/build/plugins/zenodo/plugin.js +18 -0
  198. package/build/plugins/zenodo/plugin.spec.d.ts +1 -0
  199. package/build/plugins/zenodo/plugin.spec.js +78 -0
  200. package/build/plugins/zenodo/resource/Resource.d.ts +27 -0
  201. package/build/plugins/zenodo/resource/Resource.js +2 -0
  202. package/build/plugins/zenodo/resource/convert/fromZenodo.d.ts +10 -0
  203. package/build/plugins/zenodo/resource/convert/fromZenodo.js +18 -0
  204. package/build/plugins/zenodo/resource/convert/toZenodo.d.ts +3 -0
  205. package/build/plugins/zenodo/resource/convert/toZenodo.js +13 -0
  206. package/build/plugins/zenodo/resource/index.d.ts +3 -0
  207. package/build/plugins/zenodo/resource/index.js +3 -0
  208. package/build/plugins/zenodo/zenodo/index.d.ts +1 -0
  209. package/build/plugins/zenodo/zenodo/index.js +2 -0
  210. package/build/plugins/zenodo/zenodo/request.d.ts +12 -0
  211. package/build/plugins/zenodo/zenodo/request.js +36 -0
  212. package/build/plugins/zip/index.d.ts +2 -0
  213. package/build/plugins/zip/index.js +3 -0
  214. package/build/plugins/zip/package/index.d.ts +2 -0
  215. package/build/plugins/zip/package/index.js +3 -0
  216. package/build/plugins/zip/package/load.d.ts +1 -0
  217. package/build/plugins/zip/package/load.js +30 -0
  218. package/build/plugins/zip/package/load.spec.d.ts +1 -0
  219. package/build/plugins/zip/package/load.spec.js +173 -0
  220. package/build/plugins/zip/package/save.d.ts +5 -0
  221. package/build/plugins/zip/package/save.js +50 -0
  222. package/build/plugins/zip/package/save.spec.d.ts +1 -0
  223. package/build/plugins/zip/package/save.spec.js +287 -0
  224. package/build/plugins/zip/plugin.d.ts +11 -0
  225. package/build/plugins/zip/plugin.js +24 -0
  226. package/build/plugins/zip/plugin.spec.d.ts +1 -0
  227. package/build/plugins/zip/plugin.spec.js +158 -0
  228. package/build/resource/index.d.ts +1 -0
  229. package/build/resource/index.js +2 -0
  230. package/build/resource/save.d.ts +13 -0
  231. package/build/resource/save.js +53 -0
  232. package/build/resource/save.spec.d.ts +1 -0
  233. package/build/resource/save.spec.js +107 -0
  234. package/build/stream/concat.d.ts +3 -0
  235. package/build/stream/concat.js +5 -0
  236. package/build/stream/index.d.ts +3 -0
  237. package/build/stream/index.js +4 -0
  238. package/build/stream/load.d.ts +5 -0
  239. package/build/stream/load.js +46 -0
  240. package/build/stream/save.d.ts +5 -0
  241. package/build/stream/save.js +13 -0
  242. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGx1Z2lucy96aXAvcGFja2FnZS9zYXZlLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sV0FBVyxDQUFBO0FBRTVDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7SUFDaEMsSUFBSSxXQUFtQixDQUFBO0lBRXZCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxXQUFXLEdBQUcsZUFBZSxFQUFFLENBQUE7SUFDakMsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbEQsTUFBTSxXQUFXLEdBQVk7WUFDM0IsSUFBSSxFQUFFLGNBQWM7WUFDcEIsU0FBUyxFQUFFO2dCQUNUO29CQUNFLElBQUksRUFBRSxlQUFlO29CQUNyQixJQUFJLEVBQUUsRUFBRTtpQkFDVDthQUNGO1NBQ0YsQ0FBQTtRQUVELE1BQU0sZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUE7UUFFakUsTUFBTSxVQUFVLEdBQUcsTUFBTSxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDOUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDOUMsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsbUNBQW1DLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDakQsTUFBTSxXQUFXLEdBQVk7WUFDM0IsSUFBSSxFQUFFLGNBQWM7WUFDcEIsS0FBSyxFQUFFLGNBQWM7WUFDckIsV0FBVyxFQUFFLGdCQUFnQjtZQUM3QixPQUFPLEVBQUUsT0FBTztZQUNoQixTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsSUFBSSxFQUFFLGVBQWU7b0JBQ3JCLElBQUksRUFBRSxFQUFFO2lCQUNUO2FBQ0Y7U0FDRixDQUFBO1FBRUQsTUFBTSxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQTtRQUVqRSxNQUFNLFVBQVUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUM5QyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM5QyxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxnREFBZ0QsRUFBRSxLQUFLLElBQUksRUFBRTtRQUM5RCxNQUFNLFdBQVcsR0FBWTtZQUMzQixJQUFJLEVBQUUsY0FBYztZQUNwQixTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsSUFBSSxFQUFFLGVBQWU7b0JBQ3JCLElBQUksRUFBRTt3QkFDSixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTt3QkFDeEIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7cUJBQ3ZCO2lCQUNGO2FBQ0Y7U0FDRixDQUFBO1FBRUQsTUFBTSxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQTtRQUVqRSxNQUFNLFVBQVUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUM5QyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM5QyxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RCxNQUFNLFVBQVUsR0FBRyx5QkFBeUIsQ0FBQTtRQUM1QyxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUUvQyxNQUFNLFdBQVcsR0FBWTtZQUMzQixJQUFJLEVBQUUsY0FBYztZQUNwQixTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsSUFBSSxFQUFFLGVBQWU7b0JBQ3JCLElBQUksRUFBRSxPQUFPO29CQUNiLE1BQU0sRUFBRSxLQUFLO2lCQUNkO2FBQ0Y7U0FDRixDQUFBO1FBRUQsTUFBTSxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQTtRQUVqRSxNQUFNLFVBQVUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUM5QyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM5QyxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMzRCxNQUFNLFVBQVUsR0FBRyx5QkFBeUIsQ0FBQTtRQUM1QyxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUUvQyxNQUFNLFdBQVcsR0FBWTtZQUMzQixJQUFJLEVBQUUsY0FBYztZQUNwQixTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsSUFBSSxFQUFFLFlBQVk7b0JBQ2xCLElBQUksRUFBRSxPQUFPO29CQUNiLE1BQU0sRUFBRSxLQUFLO2lCQUNkO2dCQUNEO29CQUNFLElBQUksRUFBRSxZQUFZO29CQUNsQixJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDO2lCQUM5QjthQUNGO1NBQ0YsQ0FBQTtRQUVELE1BQU0sZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUE7UUFFakUsTUFBTSxVQUFVLEdBQUcsTUFBTSxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDOUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDOUMsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsaUNBQWlDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0MsTUFBTSxXQUFXLEdBQVk7WUFDM0IsSUFBSSxFQUFFLGNBQWM7WUFDcEIsU0FBUyxFQUFFO2dCQUNUO29CQUNFLElBQUksRUFBRSxlQUFlO29CQUNyQixJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO29CQUNoQyxNQUFNLEVBQUU7d0JBQ04sTUFBTSxFQUFFOzRCQUNOLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFOzRCQUMvQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTt5QkFDakM7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGLENBQUE7UUFFRCxNQUFNLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFBO1FBRWpFLE1BQU0sVUFBVSxHQUFHLE1BQU0sUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQzlDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzlDLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2hELE1BQU0sVUFBVSxHQUFHLHlCQUF5QixDQUFBO1FBQzVDLE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRS9DLE1BQU0sV0FBVyxHQUFZO1lBQzNCLElBQUksRUFBRSxjQUFjO1lBQ3BCLFNBQVMsRUFBRTtnQkFDVDtvQkFDRSxJQUFJLEVBQUUsZUFBZTtvQkFDckIsSUFBSSxFQUFFLE9BQU87b0JBQ2IsTUFBTSxFQUFFLEtBQUs7b0JBQ2IsT0FBTyxFQUFFO3dCQUNQLFNBQVMsRUFBRSxHQUFHO3FCQUNmO2lCQUNGO2FBQ0Y7U0FDRixDQUFBO1FBRUQsTUFBTSxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQTtRQUVqRSxNQUFNLFVBQVUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUM5QyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM5QyxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxvREFBb0QsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNsRSxNQUFNLGVBQWUsR0FBWTtZQUMvQixJQUFJLEVBQUUsY0FBYztZQUNwQixLQUFLLEVBQUUsY0FBYztZQUNyQixXQUFXLEVBQUUsZ0JBQWdCO1lBQzdCLFNBQVMsRUFBRTtnQkFDVDtvQkFDRSxJQUFJLEVBQUUsZUFBZTtvQkFDckIsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztpQkFDakM7YUFDRjtTQUNGLENBQUE7UUFFRCxNQUFNLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFBO1FBQ3JFLE1BQU0sZUFBZSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFN0QsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQ3JDLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ2pELE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ2xELE1BQU0sQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFDMUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDakQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQ2xFLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2xFLE1BQU0sZUFBZSxHQUFZO1lBQy9CLElBQUksRUFBRSxjQUFjO1lBQ3BCLEtBQUssRUFBRSxjQUFjO1lBQ3JCLFdBQVcsRUFBRSxnQkFBZ0I7WUFDN0IsT0FBTyxFQUFFLE9BQU87WUFDaEIsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQztZQUM3QixTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsSUFBSSxFQUFFLGVBQWU7b0JBQ3JCLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO2lCQUNsQjthQUNGO1NBQ0YsQ0FBQTtRQUVELE1BQU0sZ0JBQWdCLENBQUMsZUFBZSxFQUFFLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUE7UUFDckUsTUFBTSxlQUFlLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUU3RCxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUNqRCxNQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUNsRCxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUM3QyxNQUFNLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFBO0lBQy9ELENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzFELE1BQU0sZUFBZSxHQUFZO1lBQy9CLElBQUksRUFBRSxjQUFjO1lBQ3BCLFNBQVMsRUFBRTtnQkFDVDtvQkFDRSxJQUFJLEVBQUUsZUFBZTtvQkFDckIsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztvQkFDaEMsTUFBTSxFQUFFO3dCQUNOLE1BQU0sRUFBRTs0QkFDTixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTs0QkFDL0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7eUJBQ2pDO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRixDQUFBO1FBRUQsTUFBTSxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQTtRQUNyRSxNQUFNLGVBQWUsR0FBRyxNQUFNLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRTdELE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFBO1FBQ25ELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUM1QixNQUFNLENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLFFBQVEsSUFBSSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDbkUsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksUUFBUSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ3JELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3JDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQzNDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQy9DLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxvREFBb0QsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNsRSxNQUFNLFVBQVUsR0FBRyx5QkFBeUIsQ0FBQTtRQUM1QyxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUUvQyxNQUFNLGVBQWUsR0FBWTtZQUMvQixJQUFJLEVBQUUsY0FBYztZQUNwQixTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsSUFBSSxFQUFFLGVBQWU7b0JBQ3JCLElBQUksRUFBRSxPQUFPO29CQUNiLE1BQU0sRUFBRSxLQUFLO2lCQUNkO2FBQ0Y7U0FDRixDQUFBO1FBRUQsTUFBTSxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQTtRQUNyRSxNQUFNLGVBQWUsR0FBRyxNQUFNLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRTdELE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2pELE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUNoRSxNQUFNLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDMUQsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsaURBQWlELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0QsTUFBTSxXQUFXLEdBQVk7WUFDM0IsSUFBSSxFQUFFLGNBQWM7WUFDcEIsU0FBUyxFQUFFO2dCQUNUO29CQUNFLElBQUksRUFBRSxlQUFlO29CQUNyQixJQUFJLEVBQUUsRUFBRTtpQkFDVDthQUNGO1NBQ0YsQ0FBQTtRQUVELE1BQU0sYUFBYSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7UUFDMUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUU1RCxNQUFNLE1BQU0sQ0FDVixnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FDN0QsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDckIsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsd0NBQXdDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdEQsTUFBTSxXQUFXLEdBQVk7WUFDM0IsSUFBSSxFQUFFLGNBQWM7WUFDcEIsU0FBUyxFQUFFO2dCQUNUO29CQUNFLElBQUksRUFBRSxlQUFlO29CQUNyQixJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztpQkFDbEI7YUFDRjtTQUNGLENBQUE7UUFFRCxNQUFNLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFBO1FBQ2pFLE1BQU0sZUFBZSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFN0QsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLGFBQWEsQ0FBQztZQUNwQyxJQUFJLEVBQUUsY0FBYztZQUNwQixTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsSUFBSSxFQUFFLGVBQWU7aUJBQ3RCO2FBQ0Y7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxrREFBa0QsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNoRSxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQTtRQUN0QyxNQUFNLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQTtRQUNyQyxNQUFNLFFBQVEsR0FBRyxNQUFNLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUNqRCxNQUFNLFFBQVEsR0FBRyxNQUFNLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUVqRCxNQUFNLGVBQWUsR0FBWTtZQUMvQixJQUFJLEVBQUUsY0FBYztZQUNwQixTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsSUFBSSxFQUFFLFlBQVk7b0JBQ2xCLElBQUksRUFBRSxRQUFRO29CQUNkLE1BQU0sRUFBRSxLQUFLO2lCQUNkO2dCQUNEO29CQUNFLElBQUksRUFBRSxZQUFZO29CQUNsQixJQUFJLEVBQUUsUUFBUTtvQkFDZCxNQUFNLEVBQUUsS0FBSztpQkFDZDthQUNGO1NBQ0YsQ0FBQTtRQUVELE1BQU0sZ0JBQWdCLENBQUMsZUFBZSxFQUFFLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUE7UUFDckUsTUFBTSxlQUFlLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUU3RCxNQUFNLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNqRCxNQUFNLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDN0QsTUFBTSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBQy9ELENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB0eXBlIHsgUGFja2FnZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB7IGJlZm9yZUVhY2gsIGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyBnZXRUZW1wRmlsZVBhdGgsIHdyaXRlVGVtcEZpbGUgfSBmcm9tIFwiLi4vLi4vLi4vZmlsZS9pbmRleC50c1wiXG5pbXBvcnQgeyBsb2FkUGFja2FnZUZyb21aaXAgfSBmcm9tIFwiLi9sb2FkLnRzXCJcbmltcG9ydCB7IHNhdmVQYWNrYWdlVG9aaXAgfSBmcm9tIFwiLi9zYXZlLnRzXCJcblxuZGVzY3JpYmUoXCJzYXZlUGFja2FnZVRvWmlwXCIsICgpID0+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>;