@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,47 @@
1
+ import { createReport } from "@frictionless-ts/metadata";
2
+ import { prefetchFiles } from "./fetch.js";
3
+ import { inferBytes, inferEncoding, inferHash } from "./infer.js";
4
+ export async function validateFile(resource) {
5
+ const errors = [];
6
+ const localPaths = await prefetchFiles(resource.path);
7
+ if (resource.bytes) {
8
+ const bytes = resource.bytes;
9
+ const actualBytes = await inferBytes({ path: localPaths });
10
+ if (bytes !== actualBytes) {
11
+ errors.push({
12
+ type: "file/bytes",
13
+ bytes,
14
+ actualBytes,
15
+ });
16
+ }
17
+ }
18
+ if (resource.hash) {
19
+ const [hashValue, hashType = "md5"] = resource.hash.split(":").toReversed();
20
+ const hash = `${hashType}:${hashValue}`;
21
+ const actualHash = await inferHash({ path: localPaths }, {
22
+ hashType: hashType,
23
+ });
24
+ if (hash !== actualHash) {
25
+ errors.push({
26
+ type: "file/hash",
27
+ hash,
28
+ actualHash,
29
+ });
30
+ }
31
+ }
32
+ if (resource.encoding) {
33
+ const encoding = resource.encoding;
34
+ const actualEncoding = await inferEncoding({ path: localPaths });
35
+ if (actualEncoding) {
36
+ if (encoding !== actualEncoding) {
37
+ errors.push({
38
+ type: "file/encoding",
39
+ encoding,
40
+ actualEncoding,
41
+ });
42
+ }
43
+ }
44
+ }
45
+ return createReport(errors);
46
+ }
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9maWxlL3ZhbGlkYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUV4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQzFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUVqRSxNQUFNLENBQUMsS0FBSyxVQUFVLFlBQVksQ0FBQyxRQUEyQjtJQUM1RCxNQUFNLE1BQU0sR0FBZ0IsRUFBRSxDQUFBO0lBQzlCLE1BQU0sVUFBVSxHQUFHLE1BQU0sYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUVyRCxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFBO1FBQzVCLE1BQU0sV0FBVyxHQUFHLE1BQU0sVUFBVSxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUE7UUFFMUQsSUFBSSxLQUFLLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDVixJQUFJLEVBQUUsWUFBWTtnQkFDbEIsS0FBSztnQkFDTCxXQUFXO2FBQ1osQ0FBQyxDQUFBO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixNQUFNLENBQUMsU0FBUyxFQUFFLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUUzRSxNQUFNLElBQUksR0FBRyxHQUFHLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQTtRQUN2QyxNQUFNLFVBQVUsR0FBRyxNQUFNLFNBQVMsQ0FDaEMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQ3BCO1lBQ0UsUUFBUSxFQUFFLFFBQWU7U0FDMUIsQ0FDRixDQUFBO1FBRUQsSUFBSSxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDVixJQUFJLEVBQUUsV0FBVztnQkFDakIsSUFBSTtnQkFDSixVQUFVO2FBQ1gsQ0FBQyxDQUFBO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0QixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFBO1FBQ2xDLE1BQU0sY0FBYyxHQUFHLE1BQU0sYUFBYSxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUE7UUFFaEUsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixJQUFJLFFBQVEsS0FBSyxjQUFjLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDVixJQUFJLEVBQUUsZUFBZTtvQkFDckIsUUFBUTtvQkFDUixjQUFjO2lCQUNmLENBQUMsQ0FBQTtZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZpbGVFcnJvciB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB7IGNyZWF0ZVJlcG9ydCB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2UgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgeyBwcmVmZXRjaEZpbGVzIH0gZnJvbSBcIi4vZmV0Y2gudHNcIlxuaW1wb3J0IHsgaW5mZXJCeXRlcywgaW5mZXJFbmNvZGluZywgaW5mZXJIYXNoIH0gZnJvbSBcIi4vaW5mZXIudHNcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVGaWxlKHJlc291cmNlOiBQYXJ0aWFsPFJlc291cmNlPikge1xuICBjb25zdCBlcnJvcnM6IEZpbGVFcnJvcltdID0gW11cbiAgY29uc3QgbG9jYWxQYXRocyA9IGF3YWl0IHByZWZldGNoRmlsZXMocmVzb3VyY2UucGF0aClcblxuICBpZiAocmVzb3VyY2UuYnl0ZXMpIHtcbiAgICBjb25zdCBieXRlcyA9IHJlc291cmNlLmJ5dGVzXG4gICAgY29uc3QgYWN0dWFsQnl0ZXMgPSBhd2FpdCBpbmZlckJ5dGVzKHsgcGF0aDogbG9jYWxQYXRocyB9KVxuXG4gICAgaWYgKGJ5dGVzICE9PSBhY3R1YWxCeXRlcykge1xuICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICB0eXBlOiBcImZpbGUvYnl0ZXNcIixcbiAgICAgICAgYnl0ZXMsXG4gICAgICAgIGFjdHVhbEJ5dGVzLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBpZiAocmVzb3VyY2UuaGFzaCkge1xuICAgIGNvbnN0IFtoYXNoVmFsdWUsIGhhc2hUeXBlID0gXCJtZDVcIl0gPSByZXNvdXJjZS5oYXNoLnNwbGl0KFwiOlwiKS50b1JldmVyc2VkKClcblxuICAgIGNvbnN0IGhhc2ggPSBgJHtoYXNoVHlwZX06JHtoYXNoVmFsdWV9YFxuICAgIGNvbnN0IGFjdHVhbEhhc2ggPSBhd2FpdCBpbmZlckhhc2goXG4gICAgICB7IHBhdGg6IGxvY2FsUGF0aHMgfSxcbiAgICAgIHtcbiAgICAgICAgaGFzaFR5cGU6IGhhc2hUeXBlIGFzIGFueSxcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgaWYgKGhhc2ggIT09IGFjdHVhbEhhc2gpIHtcbiAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgdHlwZTogXCJmaWxlL2hhc2hcIixcbiAgICAgICAgaGFzaCxcbiAgICAgICAgYWN0dWFsSGFzaCxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaWYgKHJlc291cmNlLmVuY29kaW5nKSB7XG4gICAgY29uc3QgZW5jb2RpbmcgPSByZXNvdXJjZS5lbmNvZGluZ1xuICAgIGNvbnN0IGFjdHVhbEVuY29kaW5nID0gYXdhaXQgaW5mZXJFbmNvZGluZyh7IHBhdGg6IGxvY2FsUGF0aHMgfSlcblxuICAgIGlmIChhY3R1YWxFbmNvZGluZykge1xuICAgICAgaWYgKGVuY29kaW5nICE9PSBhY3R1YWxFbmNvZGluZykge1xuICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgdHlwZTogXCJmaWxlL2VuY29kaW5nXCIsXG4gICAgICAgICAgZW5jb2RpbmcsXG4gICAgICAgICAgYWN0dWFsRW5jb2RpbmcsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVJlcG9ydChlcnJvcnMpXG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,180 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import * as fetchModule from "./fetch.js";
3
+ import { inferHash } from "./infer.js";
4
+ import { writeTempFile } from "./temp.js";
5
+ import { validateFile } from "./validate.js";
6
+ vi.mock("./fetch.ts", () => ({
7
+ prefetchFiles: vi.fn(),
8
+ }));
9
+ describe("validateFile", () => {
10
+ let mockPrefetchFiles;
11
+ beforeEach(() => {
12
+ mockPrefetchFiles = vi.mocked(fetchModule.prefetchFiles);
13
+ vi.clearAllMocks();
14
+ });
15
+ it("should return valid report when no validation options provided", async () => {
16
+ const tempFilePath = await writeTempFile("Hello, World!");
17
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
18
+ const report = await validateFile({ path: "https://example.com/file.txt" });
19
+ expect(mockPrefetchFiles).toHaveBeenCalledWith("https://example.com/file.txt");
20
+ expect(report).toEqual({ valid: true, errors: [] });
21
+ });
22
+ it("should validate bytes successfully when they match", async () => {
23
+ const tempFilePath = await writeTempFile("Hello, World!");
24
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
25
+ const report = await validateFile({
26
+ path: "https://example.com/file.txt",
27
+ bytes: 13,
28
+ });
29
+ expect(report).toEqual({ valid: true, errors: [] });
30
+ });
31
+ it("should return error when bytes do not match", async () => {
32
+ const tempFilePath = await writeTempFile("Hello, World!");
33
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
34
+ const report = await validateFile({
35
+ path: "https://example.com/file.txt",
36
+ bytes: 1024,
37
+ });
38
+ expect(report.valid).toBe(false);
39
+ expect(report.errors).toHaveLength(1);
40
+ expect(report.errors[0]).toEqual({
41
+ type: "file/bytes",
42
+ bytes: 1024,
43
+ actualBytes: 13,
44
+ });
45
+ });
46
+ it("should validate hash successfully when it matches", async () => {
47
+ const tempFilePath = await writeTempFile("Hello, World!");
48
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
49
+ const actualHash = await inferHash({ path: tempFilePath }, { hashType: "md5" });
50
+ const report = await validateFile({
51
+ path: "https://example.com/file.txt",
52
+ hash: actualHash,
53
+ });
54
+ expect(report).toEqual({ valid: true, errors: [] });
55
+ });
56
+ it("should return error when hash does not match", async () => {
57
+ const tempFilePath = await writeTempFile("Hello, World!");
58
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
59
+ const actualHash = await inferHash({ path: tempFilePath }, { hashType: "md5" });
60
+ const report = await validateFile({
61
+ path: "https://example.com/file.txt",
62
+ hash: "md5:wronghash",
63
+ });
64
+ expect(report.valid).toBe(false);
65
+ expect(report.errors).toHaveLength(1);
66
+ expect(report.errors[0]).toEqual({
67
+ type: "file/hash",
68
+ hash: "md5:wronghash",
69
+ actualHash,
70
+ });
71
+ });
72
+ it("should validate sha256 hash", async () => {
73
+ const tempFilePath = await writeTempFile("Hello, World!");
74
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
75
+ const actualHash = await inferHash({ path: tempFilePath }, { hashType: "sha256" });
76
+ const report = await validateFile({
77
+ path: "https://example.com/file.txt",
78
+ hash: actualHash,
79
+ });
80
+ expect(report).toEqual({ valid: true, errors: [] });
81
+ });
82
+ it("should validate sha1 hash", async () => {
83
+ const tempFilePath = await writeTempFile("Hello, World!");
84
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
85
+ const actualHash = await inferHash({ path: tempFilePath }, { hashType: "sha1" });
86
+ const report = await validateFile({
87
+ path: "https://example.com/file.txt",
88
+ hash: actualHash,
89
+ });
90
+ expect(report).toEqual({ valid: true, errors: [] });
91
+ });
92
+ it("should validate sha512 hash", async () => {
93
+ const tempFilePath = await writeTempFile("Hello, World!");
94
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
95
+ const actualHash = await inferHash({ path: tempFilePath }, { hashType: "sha512" });
96
+ const report = await validateFile({
97
+ path: "https://example.com/file.txt",
98
+ hash: actualHash,
99
+ });
100
+ expect(report).toEqual({ valid: true, errors: [] });
101
+ });
102
+ it("should validate both bytes and hash when both match", async () => {
103
+ const tempFilePath = await writeTempFile("Hello, World!");
104
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
105
+ const actualHash = await inferHash({ path: tempFilePath }, { hashType: "md5" });
106
+ const report = await validateFile({
107
+ path: "https://example.com/file.txt",
108
+ bytes: 13,
109
+ hash: actualHash,
110
+ });
111
+ expect(report).toEqual({ valid: true, errors: [] });
112
+ });
113
+ it("should return multiple errors when both bytes and hash do not match", async () => {
114
+ const tempFilePath = await writeTempFile("Hello, World!");
115
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
116
+ const actualHash = await inferHash({ path: tempFilePath }, { hashType: "md5" });
117
+ const report = await validateFile({
118
+ path: "https://example.com/file.txt",
119
+ bytes: 1024,
120
+ hash: "md5:wronghash",
121
+ });
122
+ expect(report.valid).toBe(false);
123
+ expect(report.errors).toHaveLength(2);
124
+ expect(report.errors[0]).toEqual({
125
+ type: "file/bytes",
126
+ bytes: 1024,
127
+ actualBytes: 13,
128
+ });
129
+ expect(report.errors[1]).toEqual({
130
+ type: "file/hash",
131
+ hash: "md5:wronghash",
132
+ actualHash,
133
+ });
134
+ });
135
+ it("should return error when only bytes mismatch", async () => {
136
+ const tempFilePath = await writeTempFile("Hello, World!");
137
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
138
+ const actualHash = await inferHash({ path: tempFilePath }, { hashType: "md5" });
139
+ const report = await validateFile({
140
+ path: "https://example.com/file.txt",
141
+ bytes: 1024,
142
+ hash: actualHash,
143
+ });
144
+ expect(report.valid).toBe(false);
145
+ expect(report.errors).toHaveLength(1);
146
+ expect(report.errors[0]?.type).toBe("file/bytes");
147
+ });
148
+ it("should return error when only hash mismatch", async () => {
149
+ const tempFilePath = await writeTempFile("Hello, World!");
150
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
151
+ const report = await validateFile({
152
+ path: "https://example.com/file.txt",
153
+ bytes: 13,
154
+ hash: "md5:wronghash",
155
+ });
156
+ expect(report.valid).toBe(false);
157
+ expect(report.errors).toHaveLength(1);
158
+ expect(report.errors[0]?.type).toBe("file/hash");
159
+ });
160
+ it("should handle local file paths", async () => {
161
+ const tempFilePath = await writeTempFile("x".repeat(2048));
162
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
163
+ const report = await validateFile({
164
+ path: "/local/path/file.txt",
165
+ bytes: 2048,
166
+ });
167
+ expect(mockPrefetchFiles).toHaveBeenCalledWith("/local/path/file.txt");
168
+ expect(report).toEqual({ valid: true, errors: [] });
169
+ });
170
+ it("should handle empty file validation", async () => {
171
+ const tempFilePath = await writeTempFile("");
172
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
173
+ const report = await validateFile({
174
+ path: "https://example.com/empty.txt",
175
+ bytes: 0,
176
+ });
177
+ expect(report).toEqual({ valid: true, errors: [] });
178
+ });
179
+ });
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2ZpbGUvdmFsaWRhdGUuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3RCxPQUFPLEtBQUssV0FBVyxNQUFNLFlBQVksQ0FBQTtBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3RDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUU1QyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzNCLGFBQWEsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO0NBQ3ZCLENBQUMsQ0FBQyxDQUFBO0FBRUgsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDNUIsSUFBSSxpQkFBMkMsQ0FBQTtJQUUvQyxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsaUJBQWlCLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDeEQsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQ3BCLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGdFQUFnRSxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzlFLE1BQU0sWUFBWSxHQUFHLE1BQU0sYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBQ3pELGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQTtRQUVuRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFlBQVksQ0FBQyxFQUFFLElBQUksRUFBRSw4QkFBOEIsRUFBRSxDQUFDLENBQUE7UUFFM0UsTUFB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QyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDckQsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMscUNBQXFDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbkQsTUFBTSxZQUFZLEdBQUcsTUFBTSxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDNUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFBO1FBRW5ELE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDO1lBQ2hDLElBQUksRUFBRSwrQkFBK0I7WUFDckMsS0FBSyxFQUFFLENBQUM7U0FDVCxDQUFDLENBQUE7UUFFRixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNyRCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgKiBhcyBmZXRjaE1vZHVsZSBmcm9tIFwiLi9mZXRjaC50c1wiXG5pbXBvcnQgeyBpbmZlckhhc2ggfSBmcm9tIFwiLi9pbmZlci50c1wiXG5pbXBvcnQgeyB3cml0ZVRlbXBGaWxlIH0gZnJvbSBcIi4vdGVtcC50c1wiXG5pbXBvcnQgeyB2YWxpZGF0ZUZpbGUgfSBmcm9tIFwiLi92YWxpZGF0ZS50c1wiXG5cbnZpLm1vY2soXCIuL2ZldGNoLnRzXCIsICgpID0+ICh7XG4gIHByZWZldGNoRmlsZXM6IHZpLmZuKCksXG59KSlcblxuZGVzY3JpYmUoXCJ2YWxpZGF0ZUZpbGVcIiwgKCkgPT4ge1xuICBsZXQgbW9ja1ByZWZldGNoRmlsZXM6IFJldHVyblR5cGU8dHlwZW9mIHZpLmZuPlxuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIG1vY2tQcmVmZXRjaEZpbGVzID0gdmkubW9ja2VkKGZldGNoTW9kdWxlLnByZWZldGNoRmlsZXMpXG4gICAgdmkuY2xlYXJBbGxNb2NrcygpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcmV0dXJuIHZhbGlkIHJlcG9ydCB3aGVuIG5vIHZhbGlkYXRpb24gb3B0aW9ucyBwcm92aWRlZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGVtcEZpbGVQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcIkhlbGxvLCBXb3JsZCFcIilcbiAgICBtb2NrUHJlZmV0Y2hGaWxlcy5tb2NrUmVzb2x2ZWRWYWx1ZShbdGVtcEZpbGVQYXRoXSlcblxuICAgIGNvbnN0IHJlcG9ydCA9IGF3YWl0IHZhbGlkYXRlRmlsZSh7IHBhdGg6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9maWxlLnR4dFwiIH0pXG5cbiAgICBleHBlY3QobW9ja1ByZWZldGNoRmlsZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgXCJodHRwczovL2V4YW1wbGUuY29tL2ZpbGUudHh0XCIsXG4gICAgKVxuICAgIGV4cGVjdChyZXBvcnQpLnRvRXF1YWwoeyB2YWxpZDogdHJ1ZSwgZXJyb3JzOiBbXSB9KVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHZhbGlkYXRlIGJ5dGVzIHN1Y2Nlc3NmdWxseSB3aGVuIHRoZXkgbWF0Y2hcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRlbXBGaWxlUGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJIZWxsbywgV29ybGQhXCIpXG4gICAgbW9ja1ByZWZldGNoRmlsZXMubW9ja1Jlc29sdmVkVmFsdWUoW3RlbXBGaWxlUGF0aF0pXG5cbiAgICBjb25zdCByZXBvcnQgPSBhd2FpdCB2YWxpZGF0ZUZpbGUoe1xuICAgICAgcGF0aDogXCJodHRwczovL2V4YW1wbGUuY29tL2ZpbGUudHh0XCIsXG4gICAgICBieXRlczogMTMsXG4gICAgfSlcblxuICAgIGV4cGVjdChyZXBvcnQpLnRvRXF1YWwoeyB2YWxpZDogdHJ1ZSwgZXJyb3JzOiBbXSB9KVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHJldHVybiBlcnJvciB3aGVuIGJ5dGVzIGRvIG5vdCBtYXRjaFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGVtcEZpbGVQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcIkhlbGxvLCBXb3JsZCFcIilcbiAgICBtb2NrUHJlZmV0Y2hGaWxlcy5tb2NrUmVzb2x2ZWRWYWx1ZShbdGVtcEZpbGVQYXRoXSlcblxuICAgIGNvbnN0IHJlcG9ydCA9IGF3YWl0IHZhbGlkYXRlRmlsZSh7XG4gICAgICBwYXRoOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vZmlsZS50eHRcIixcbiAgICAgIGJ5dGVzOiAxMDI0LFxuICAgIH0pXG5cbiAgICBleHBlY3QocmVwb3J0LnZhbGlkKS50b0JlKGZhbHNlKVxuICAgIGV4cGVjdChyZXBvcnQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMSlcbiAgICBleHBlY3QocmVwb3J0LmVycm9yc1swXSkudG9FcXVhbCh7XG4gICAgICB0eXBlOiBcImZpbGUvYnl0ZXNcIixcbiAgICAgIGJ5dGVzOiAxMDI0LFxuICAgICAgYWN0dWFsQnl0ZXM6IDEzLFxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgdmFsaWRhdGUgaGFzaCBzdWNjZXNzZnVsbHkgd2hlbiBpdCBtYXRjaGVzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0ZW1wRmlsZVBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiSGVsbG8sIFdvcmxkIVwiKVxuICAgIG1vY2tQcmVmZXRjaEZpbGVzLm1vY2tSZXNvbHZlZFZhbHVlKFt0ZW1wRmlsZVBhdGhdKVxuXG4gICAgY29uc3QgYWN0dWFsSGFzaCA9IGF3YWl0IGluZmVySGFzaChcbiAgICAgIHsgcGF0aDogdGVtcEZpbGVQYXRoIH0sXG4gICAgICB7IGhhc2hUeXBlOiBcIm1kNVwiIH0sXG4gICAgKVxuXG4gICAgY29uc3QgcmVwb3J0ID0gYXdhaXQgdmFsaWRhdGVGaWxlKHtcbiAgICAgIHBhdGg6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9maWxlLnR4dFwiLFxuICAgICAgaGFzaDogYWN0dWFsSGFzaCxcbiAgICB9KVxuXG4gICAgZXhwZWN0KHJlcG9ydCkudG9FcXVhbCh7IHZhbGlkOiB0cnVlLCBlcnJvcnM6IFtdIH0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcmV0dXJuIGVycm9yIHdoZW4gaGFzaCBkb2VzIG5vdCBtYXRjaFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGVtcEZpbGVQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcIkhlbGxvLCBXb3JsZCFcIilcbiAgICBtb2NrUHJlZmV0Y2hGaWxlcy5tb2NrUmVzb2x2ZWRWYWx1ZShbdGVtcEZpbGVQYXRoXSlcblxuICAgIGNvbnN0IGFjdHVhbEhhc2ggPSBhd2FpdCBpbmZlckhhc2goXG4gICAgICB7IHBhdGg6IHRlbXBGaWxlUGF0aCB9LFxuICAgICAgeyBoYXNoVHlwZTogXCJtZDVcIiB9LFxuICAgIClcblxuICAgIGNvbnN0IHJlcG9ydCA9IGF3YWl0IHZhbGlkYXRlRmlsZSh7XG4gICAgICBwYXRoOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vZmlsZS50eHRcIixcbiAgICAgIGhhc2g6IFwibWQ1Ondyb25naGFzaFwiLFxuICAgIH0pXG5cbiAgICBleHBlY3QocmVwb3J0LnZhbGlkKS50b0JlKGZhbHNlKVxuICAgIGV4cGVjdChyZXBvcnQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMSlcbiAgICBleHBlY3QocmVwb3J0LmVycm9yc1swXSkudG9FcXVhbCh7XG4gICAgICB0eXBlOiBcImZpbGUvaGFzaFwiLFxuICAgICAgaGFzaDogXCJtZDU6d3JvbmdoYXNoXCIsXG4gICAgICBhY3R1YWxIYXNoLFxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgdmFsaWRhdGUgc2hhMjU2IGhhc2hcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRlbXBGaWxlUGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJIZWxsbywgV29ybGQhXCIpXG4gICAgbW9ja1ByZWZldGNoRmlsZXMubW9ja1Jlc29sdmVkVmFsdWUoW3RlbXBGaWxlUGF0aF0pXG5cbiAgICBjb25zdCBhY3R1YWxIYXNoID0gYXdhaXQgaW5mZXJIYXNoKFxuICAgICAgeyBwYXRoOiB0ZW1wRmlsZVBhdGggfSxcbiAgICAgIHsgaGFzaFR5cGU6IFwic2hhMjU2XCIgfSxcbiAgICApXG5cbiAgICBjb25zdCByZXBvcnQgPSBhd2FpdCB2YWxpZGF0ZUZpbGUoe1xuICAgICAgcGF0aDogXCJodHRwczovL2V4YW1wbGUuY29tL2ZpbGUudHh0XCIsXG4gICAgICBoYXNoOiBhY3R1YWxIYXNoLFxuICAgIH0pXG5cbiAgICBleHBlY3QocmVwb3J0KS50b0VxdWFsKHsgdmFsaWQ6IHRydWUsIGVycm9yczogW10gfSlcbiAgfSlcblxuICBpdChcInNob3VsZCB2YWxpZGF0ZSBzaGExIGhhc2hcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRlbXBGaWxlUGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJIZWxsbywgV29ybGQhXCIpXG4gICAgbW9ja1ByZWZldGNoRmlsZXMubW9ja1Jlc29sdmVkVmFsdWUoW3RlbXBGaWxlUGF0aF0pXG5cbiAgICBjb25zdCBhY3R1YWxIYXNoID0gYXdhaXQgaW5mZXJIYXNoKFxuICAgICAgeyBwYXRoOiB0ZW1wRmlsZVBhdGggfSxcbiAgICAgIHsgaGFzaFR5cGU6IFwic2hhMVwiIH0sXG4gICAgKVxuXG4gICAgY29uc3QgcmVwb3J0ID0gYXdhaXQgdmFsaWRhdGVGaWxlKHtcbiAgICAgIHBhdGg6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9maWxlLnR4dFwiLFxuICAgICAgaGFzaDogYWN0dWFsSGFzaCxcbiAgICB9KVxuXG4gICAgZXhwZWN0KHJlcG9ydCkudG9FcXVhbCh7IHZhbGlkOiB0cnVlLCBlcnJvcnM6IFtdIH0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgdmFsaWRhdGUgc2hhNTEyIGhhc2hcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRlbXBGaWxlUGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJIZWxsbywgV29ybGQhXCIpXG4gICAgbW9ja1ByZWZldGNoRmlsZXMubW9ja1Jlc29sdmVkVmFsdWUoW3RlbXBGaWxlUGF0aF0pXG5cbiAgICBjb25zdCBhY3R1YWxIYXNoID0gYXdhaXQgaW5mZXJIYXNoKFxuICAgICAgeyBwYXRoOiB0ZW1wRmlsZVBhdGggfSxcbiAgICAgIHsgaGFzaFR5cGU6IFwic2hhNTEyXCIgfSxcbiAgICApXG5cbiAgICBjb25zdCByZXBvcnQgPSBhd2FpdCB2YWxpZGF0ZUZpbGUoe1xuICAgICAgcGF0aDogXCJodHRwczovL2V4YW1wbGUuY29tL2ZpbGUudHh0XCIsXG4gICAgICBoYXNoOiBhY3R1YWxIYXNoLFxuICAgIH0pXG5cbiAgICBleHBlY3QocmVwb3J0KS50b0VxdWFsKHsgdmFsaWQ6IHRydWUsIGVycm9yczogW10gfSlcbiAgfSlcblxuICBpdChcInNob3VsZCB2YWxpZGF0ZSBib3RoIGJ5dGVzIGFuZCBoYXNoIHdoZW4gYm90aCBtYXRjaFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGVtcEZpbGVQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcIkhlbGxvLCBXb3JsZCFcIilcbiAgICBtb2NrUHJlZmV0Y2hGaWxlcy5tb2NrUmVzb2x2ZWRWYWx1ZShbdGVtcEZpbGVQYXRoXSlcblxuICAgIGNvbnN0IGFjdHVhbEhhc2ggPSBhd2FpdCBpbmZlckhhc2goXG4gICAgICB7IHBhdGg6IHRlbXBGaWxlUGF0aCB9LFxuICAgICAgeyBoYXNoVHlwZTogXCJtZDVcIiB9LFxuICAgIClcblxuICAgIGNvbnN0IHJlcG9ydCA9IGF3YWl0IHZhbGlkYXRlRmlsZSh7XG4gICAgICBwYXRoOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vZmlsZS50eHRcIixcbiAgICAgIGJ5dGVzOiAxMyxcbiAgICAgIGhhc2g6IGFjdHVhbEhhc2gsXG4gICAgfSlcblxuICAgIGV4cGVjdChyZXBvcnQpLnRvRXF1YWwoeyB2YWxpZDogdHJ1ZSwgZXJyb3JzOiBbXSB9KVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHJldHVybiBtdWx0aXBsZSBlcnJvcnMgd2hlbiBib3RoIGJ5dGVzIGFuZCBoYXNoIGRvIG5vdCBtYXRjaFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGVtcEZpbGVQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcIkhlbGxvLCBXb3JsZCFcIilcbiAgICBtb2NrUHJlZmV0Y2hGaWxlcy5tb2NrUmVzb2x2ZWRWYWx1ZShbdGVtcEZpbGVQYXRoXSlcblxuICAgIGNvbnN0IGFjdHVhbEhhc2ggPSBhd2FpdCBpbmZlckhhc2goXG4gICAgICB7IHBhdGg6IHRlbXBGaWxlUGF0aCB9LFxuICAgICAgeyBoYXNoVHlwZTogXCJtZDVcIiB9LFxuICAgIClcblxuICAgIGNvbnN0IHJlcG9ydCA9IGF3YWl0IHZhbGlkYXRlRmlsZSh7XG4gICAgICBwYXRoOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vZmlsZS50eHRcIixcbiAgICAgIGJ5dGVzOiAxMDI0LFxuICAgICAgaGFzaDogXCJtZDU6d3JvbmdoYXNoXCIsXG4gICAgfSlcblxuICAgIGV4cGVjdChyZXBvcnQudmFsaWQpLnRvQmUoZmFsc2UpXG4gICAgZXhwZWN0KHJlcG9ydC5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgyKVxuICAgIGV4cGVjdChyZXBvcnQuZXJyb3JzWzBdKS50b0VxdWFsKHtcbiAgICAgIHR5cGU6IFwiZmlsZS9ieXRlc1wiLFxuICAgICAgYnl0ZXM6IDEwMjQsXG4gICAgICBhY3R1YWxCeXRlczogMTMsXG4gICAgfSlcbiAgICBleHBlY3QocmVwb3J0LmVycm9yc1sxXSkudG9FcXVhbCh7XG4gICAgICB0eXBlOiBcImZpbGUvaGFzaFwiLFxuICAgICAgaGFzaDogXCJtZDU6d3JvbmdoYXNoXCIsXG4gICAgICBhY3R1YWxIYXNoLFxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcmV0dXJuIGVycm9yIHdoZW4gb25seSBieXRlcyBtaXNtYXRjaFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGVtcEZpbGVQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcIkhlbGxvLCBXb3JsZCFcIilcbiAgICBtb2NrUHJlZmV0Y2hGaWxlcy5tb2NrUmVzb2x2ZWRWYWx1ZShbdGVtcEZpbGVQYXRoXSlcblxuICAgIGNvbnN0IGFjdHVhbEhhc2ggPSBhd2FpdCBpbmZlckhhc2goXG4gICAgICB7IHBhdGg6IHRlbXBGaWxlUGF0aCB9LFxuICAgICAgeyBoYXNoVHlwZTogXCJtZDVcIiB9LFxuICAgIClcblxuICAgIGNvbnN0IHJlcG9ydCA9IGF3YWl0IHZhbGlkYXRlRmlsZSh7XG4gICAgICBwYXRoOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vZmlsZS50eHRcIixcbiAgICAgIGJ5dGVzOiAxMDI0LFxuICAgICAgaGFzaDogYWN0dWFsSGFzaCxcbiAgICB9KVxuXG4gICAgZXhwZWN0KHJlcG9ydC52YWxpZCkudG9CZShmYWxzZSlcbiAgICBleHBlY3QocmVwb3J0LmVycm9ycykudG9IYXZlTGVuZ3RoKDEpXG4gICAgZXhwZWN0KHJlcG9ydC5lcnJvcnNbMF0/LnR5cGUpLnRvQmUoXCJmaWxlL2J5dGVzXCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcmV0dXJuIGVycm9yIHdoZW4gb25seSBoYXNoIG1pc21hdGNoXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0ZW1wRmlsZVBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiSGVsbG8sIFdvcmxkIVwiKVxuICAgIG1vY2tQcmVmZXRjaEZpbGVzLm1vY2tSZXNvbHZlZFZhbHVlKFt0ZW1wRmlsZVBhdGhdKVxuXG4gICAgY29uc3QgcmVwb3J0ID0gYXdhaXQgdmFsaWRhdGVGaWxlKHtcbiAgICAgIHBhdGg6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9maWxlLnR4dFwiLFxuICAgICAgYnl0ZXM6IDEzLFxuICAgICAgaGFzaDogXCJtZDU6d3JvbmdoYXNoXCIsXG4gICAgfSlcblxuICAgIGV4cGVjdChyZXBvcnQudmFsaWQpLnRvQmUoZmFsc2UpXG4gICAgZXhwZWN0KHJlcG9ydC5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgxKVxuICAgIGV4cGVjdChyZXBvcnQuZXJyb3JzWzBdPy50eXBlKS50b0JlKFwiZmlsZS9oYXNoXCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIGxvY2FsIGZpbGUgcGF0aHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRlbXBGaWxlUGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJ4XCIucmVwZWF0KDIwNDgpKVxuICAgIG1vY2tQcmVmZXRjaEZpbGVzLm1vY2tSZXNvbHZlZFZhbHVlKFt0ZW1wRmlsZVBhdGhdKVxuXG4gICAgY29uc3QgcmVwb3J0ID0gYXdhaXQgdmFsaWRhdGVGaWxlKHtcbiAgICAgIHBhdGg6IFwiL2xvY2FsL3BhdGgvZmlsZS50eHRcIixcbiAgICAgIGJ5dGVzOiAyMDQ4LFxuICAgIH0pXG5cbiAgICBleHBlY3QobW9ja1ByZWZldGNoRmlsZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFwiL2xvY2FsL3BhdGgvZmlsZS50eHRcIilcbiAgICBleHBlY3QocmVwb3J0KS50b0VxdWFsKHsgdmFsaWQ6IHRydWUsIGVycm9yczogW10gfSlcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgZW1wdHkgZmlsZSB2YWxpZGF0aW9uXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0ZW1wRmlsZVBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiXCIpXG4gICAgbW9ja1ByZWZldGNoRmlsZXMubW9ja1Jlc29sdmVkVmFsdWUoW3RlbXBGaWxlUGF0aF0pXG5cbiAgICBjb25zdCByZXBvcnQgPSBhd2FpdCB2YWxpZGF0ZUZpbGUoe1xuICAgICAgcGF0aDogXCJodHRwczovL2V4YW1wbGUuY29tL2VtcHR5LnR4dFwiLFxuICAgICAgYnl0ZXM6IDAsXG4gICAgfSlcblxuICAgIGV4cGVjdChyZXBvcnQpLnRvRXF1YWwoeyB2YWxpZDogdHJ1ZSwgZXJyb3JzOiBbXSB9KVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1 @@
1
+ export declare function createFolder(path: string): Promise<void>;
@@ -0,0 +1,5 @@
1
+ import { mkdir } from "node:fs/promises";
2
+ export async function createFolder(path) {
3
+ await mkdir(path, { recursive: true });
4
+ }
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vZm9sZGVyL2NyZWF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFFeEMsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBQUMsSUFBWTtJQUM3QyxNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWtkaXIgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVGb2xkZXIocGF0aDogc3RyaW5nKSB7XG4gIGF3YWl0IG1rZGlyKHBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export { createFolder } from "./create.ts";
2
+ export { getTempFolderPath } from "./temp.ts";
@@ -0,0 +1,3 @@
1
+ export { createFolder } from "./create.js";
2
+ export { getTempFolderPath } from "./temp.js";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9mb2xkZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxXQUFXLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBjcmVhdGVGb2xkZXIgfSBmcm9tIFwiLi9jcmVhdGUudHNcIlxuZXhwb3J0IHsgZ2V0VGVtcEZvbGRlclBhdGggfSBmcm9tIFwiLi90ZW1wLnRzXCJcbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export declare function getTempFolderPath(options?: {
2
+ persist?: boolean;
3
+ }): string;
@@ -0,0 +1,16 @@
1
+ import { rmSync } from "node:fs";
2
+ import exitHook from "exit-hook";
3
+ import { temporaryDirectory } from "tempy";
4
+ export function getTempFolderPath(options) {
5
+ const path = temporaryDirectory();
6
+ if (!options?.persist) {
7
+ exitHook(() => {
8
+ try {
9
+ rmSync(path, { recursive: true, force: true });
10
+ }
11
+ catch { }
12
+ });
13
+ }
14
+ return path;
15
+ }
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2ZvbGRlci90ZW1wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDaEMsT0FBTyxRQUFRLE1BQU0sV0FBVyxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLE9BQU8sQ0FBQTtBQUUxQyxNQUFNLFVBQVUsaUJBQWlCLENBQUMsT0FBK0I7SUFDL0QsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQTtJQUVqQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3RCLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7WUFDaEQsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBybVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgZXhpdEhvb2sgZnJvbSBcImV4aXQtaG9va1wiXG5pbXBvcnQgeyB0ZW1wb3JhcnlEaXJlY3RvcnkgfSBmcm9tIFwidGVtcHlcIlxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcEZvbGRlclBhdGgob3B0aW9ucz86IHsgcGVyc2lzdD86IGJvb2xlYW4gfSkge1xuICBjb25zdCBwYXRoID0gdGVtcG9yYXJ5RGlyZWN0b3J5KClcblxuICBpZiAoIW9wdGlvbnM/LnBlcnNpc3QpIHtcbiAgICBleGl0SG9vaygoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBybVN5bmMocGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG4gICAgICB9IGNhdGNoIHt9XG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBwYXRoXG59XG4iXX0=
@@ -0,0 +1,36 @@
1
+ export type { DatasetPlugin } from "./plugin.ts";
2
+ export type { SavePackageOptions } from "./plugin.ts";
3
+ export { CkanPlugin } from "./plugins/ckan/index.ts";
4
+ export { DatahubPlugin } from "./plugins/datahub/index.ts";
5
+ export { DescriptorPlugin } from "./plugins/descriptor/index.ts";
6
+ export { FolderPlugin } from "./plugins/folder/index.ts";
7
+ export { GithubPlugin } from "./plugins/github/index.ts";
8
+ export { ZenodoPlugin } from "./plugins/zenodo/index.ts";
9
+ export { ZipPlugin } from "./plugins/zip/index.ts";
10
+ export { assertLocalPathVacant } from "./file/index.ts";
11
+ export { copyFile } from "./file/index.ts";
12
+ export { describeFile } from "./file/index.ts";
13
+ export { getTempFilePath } from "./file/index.ts";
14
+ export { getTempFolderPath } from "./folder/index.ts";
15
+ export { inferBytes } from "./file/index.ts";
16
+ export { inferEncoding } from "./file/index.ts";
17
+ export { inferHash } from "./file/index.ts";
18
+ export { isLocalPathExist } from "./file/index.ts";
19
+ export { loadFile } from "./file/index.ts";
20
+ export { loadFileStream } from "./stream/index.ts";
21
+ export { loadPackageFromCkan } from "./plugins/ckan/index.ts";
22
+ export { loadPackageFromDatahub } from "./plugins/datahub/index.ts";
23
+ export { loadPackageFromFolder } from "./plugins/folder/index.ts";
24
+ export { loadPackageFromGithub } from "./plugins/github/index.ts";
25
+ export { loadPackageFromZenodo } from "./plugins/zenodo/index.ts";
26
+ export { loadPackageFromZip } from "./plugins/zip/index.ts";
27
+ export { prefetchFile } from "./file/index.ts";
28
+ export { prefetchFiles } from "./file/index.ts";
29
+ export { saveFile } from "./file/index.ts";
30
+ export { savePackageToCkan } from "./plugins/ckan/index.ts";
31
+ export { savePackageToFolder } from "./plugins/folder/index.ts";
32
+ export { savePackageToGithub } from "./plugins/github/index.ts";
33
+ export { savePackageToZenodo } from "./plugins/zenodo/index.ts";
34
+ export { savePackageToZip } from "./plugins/zip/index.ts";
35
+ export { validateFile } from "./file/index.ts";
36
+ export { writeTempFile } from "./file/index.ts";
package/build/index.js ADDED
@@ -0,0 +1,35 @@
1
+ export { CkanPlugin } from "./plugins/ckan/index.js";
2
+ export { DatahubPlugin } from "./plugins/datahub/index.js";
3
+ export { DescriptorPlugin } from "./plugins/descriptor/index.js";
4
+ export { FolderPlugin } from "./plugins/folder/index.js";
5
+ export { GithubPlugin } from "./plugins/github/index.js";
6
+ export { ZenodoPlugin } from "./plugins/zenodo/index.js";
7
+ export { ZipPlugin } from "./plugins/zip/index.js";
8
+ export { assertLocalPathVacant } from "./file/index.js";
9
+ export { copyFile } from "./file/index.js";
10
+ export { describeFile } from "./file/index.js";
11
+ export { getTempFilePath } from "./file/index.js";
12
+ export { getTempFolderPath } from "./folder/index.js";
13
+ export { inferBytes } from "./file/index.js";
14
+ export { inferEncoding } from "./file/index.js";
15
+ export { inferHash } from "./file/index.js";
16
+ export { isLocalPathExist } from "./file/index.js";
17
+ export { loadFile } from "./file/index.js";
18
+ export { loadFileStream } from "./stream/index.js";
19
+ export { loadPackageFromCkan } from "./plugins/ckan/index.js";
20
+ export { loadPackageFromDatahub } from "./plugins/datahub/index.js";
21
+ export { loadPackageFromFolder } from "./plugins/folder/index.js";
22
+ export { loadPackageFromGithub } from "./plugins/github/index.js";
23
+ export { loadPackageFromZenodo } from "./plugins/zenodo/index.js";
24
+ export { loadPackageFromZip } from "./plugins/zip/index.js";
25
+ export { prefetchFile } from "./file/index.js";
26
+ export { prefetchFiles } from "./file/index.js";
27
+ export { saveFile } from "./file/index.js";
28
+ export { savePackageToCkan } from "./plugins/ckan/index.js";
29
+ export { savePackageToFolder } from "./plugins/folder/index.js";
30
+ export { savePackageToGithub } from "./plugins/github/index.js";
31
+ export { savePackageToZenodo } from "./plugins/zenodo/index.js";
32
+ export { savePackageToZip } from "./plugins/zip/index.js";
33
+ export { validateFile } from "./file/index.js";
34
+ export { writeTempFile } from "./file/index.js";
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBQzFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBQ2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUVsRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDMUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDMUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ2xELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBQzdELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBQ25FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ2pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ2pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBQzNELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQy9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB7IERhdGFzZXRQbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW4udHNcIlxuZXhwb3J0IHR5cGUgeyBTYXZlUGFja2FnZU9wdGlvbnMgfSBmcm9tIFwiLi9wbHVnaW4udHNcIlxuXG5leHBvcnQgeyBDa2FuUGx1Z2luIH0gZnJvbSBcIi4vcGx1Z2lucy9ja2FuL2luZGV4LnRzXCJcbmV4cG9ydCB7IERhdGFodWJQbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW5zL2RhdGFodWIvaW5kZXgudHNcIlxuZXhwb3J0IHsgRGVzY3JpcHRvclBsdWdpbiB9IGZyb20gXCIuL3BsdWdpbnMvZGVzY3JpcHRvci9pbmRleC50c1wiXG5leHBvcnQgeyBGb2xkZXJQbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW5zL2ZvbGRlci9pbmRleC50c1wiXG5leHBvcnQgeyBHaXRodWJQbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW5zL2dpdGh1Yi9pbmRleC50c1wiXG5leHBvcnQgeyBaZW5vZG9QbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW5zL3plbm9kby9pbmRleC50c1wiXG5leHBvcnQgeyBaaXBQbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW5zL3ppcC9pbmRleC50c1wiXG5cbmV4cG9ydCB7IGFzc2VydExvY2FsUGF0aFZhY2FudCB9IGZyb20gXCIuL2ZpbGUvaW5kZXgudHNcIlxuZXhwb3J0IHsgY29weUZpbGUgfSBmcm9tIFwiLi9maWxlL2luZGV4LnRzXCJcbmV4cG9ydCB7IGRlc2NyaWJlRmlsZSB9IGZyb20gXCIuL2ZpbGUvaW5kZXgudHNcIlxuZXhwb3J0IHsgZ2V0VGVtcEZpbGVQYXRoIH0gZnJvbSBcIi4vZmlsZS9pbmRleC50c1wiXG5leHBvcnQgeyBnZXRUZW1wRm9sZGVyUGF0aCB9IGZyb20gXCIuL2ZvbGRlci9pbmRleC50c1wiXG5leHBvcnQgeyBpbmZlckJ5dGVzIH0gZnJvbSBcIi4vZmlsZS9pbmRleC50c1wiXG5leHBvcnQgeyBpbmZlckVuY29kaW5nIH0gZnJvbSBcIi4vZmlsZS9pbmRleC50c1wiXG5leHBvcnQgeyBpbmZlckhhc2ggfSBmcm9tIFwiLi9maWxlL2luZGV4LnRzXCJcbmV4cG9ydCB7IGlzTG9jYWxQYXRoRXhpc3QgfSBmcm9tIFwiLi9maWxlL2luZGV4LnRzXCJcbmV4cG9ydCB7IGxvYWRGaWxlIH0gZnJvbSBcIi4vZmlsZS9pbmRleC50c1wiXG5leHBvcnQgeyBsb2FkRmlsZVN0cmVhbSB9IGZyb20gXCIuL3N0cmVhbS9pbmRleC50c1wiXG5leHBvcnQgeyBsb2FkUGFja2FnZUZyb21Da2FuIH0gZnJvbSBcIi4vcGx1Z2lucy9ja2FuL2luZGV4LnRzXCJcbmV4cG9ydCB7IGxvYWRQYWNrYWdlRnJvbURhdGFodWIgfSBmcm9tIFwiLi9wbHVnaW5zL2RhdGFodWIvaW5kZXgudHNcIlxuZXhwb3J0IHsgbG9hZFBhY2thZ2VGcm9tRm9sZGVyIH0gZnJvbSBcIi4vcGx1Z2lucy9mb2xkZXIvaW5kZXgudHNcIlxuZXhwb3J0IHsgbG9hZFBhY2thZ2VGcm9tR2l0aHViIH0gZnJvbSBcIi4vcGx1Z2lucy9naXRodWIvaW5kZXgudHNcIlxuZXhwb3J0IHsgbG9hZFBhY2thZ2VGcm9tWmVub2RvIH0gZnJvbSBcIi4vcGx1Z2lucy96ZW5vZG8vaW5kZXgudHNcIlxuZXhwb3J0IHsgbG9hZFBhY2thZ2VGcm9tWmlwIH0gZnJvbSBcIi4vcGx1Z2lucy96aXAvaW5kZXgudHNcIlxuZXhwb3J0IHsgcHJlZmV0Y2hGaWxlIH0gZnJvbSBcIi4vZmlsZS9pbmRleC50c1wiXG5leHBvcnQgeyBwcmVmZXRjaEZpbGVzIH0gZnJvbSBcIi4vZmlsZS9pbmRleC50c1wiXG5leHBvcnQgeyBzYXZlRmlsZSB9IGZyb20gXCIuL2ZpbGUvaW5kZXgudHNcIlxuZXhwb3J0IHsgc2F2ZVBhY2thZ2VUb0NrYW4gfSBmcm9tIFwiLi9wbHVnaW5zL2NrYW4vaW5kZXgudHNcIlxuZXhwb3J0IHsgc2F2ZVBhY2thZ2VUb0ZvbGRlciB9IGZyb20gXCIuL3BsdWdpbnMvZm9sZGVyL2luZGV4LnRzXCJcbmV4cG9ydCB7IHNhdmVQYWNrYWdlVG9HaXRodWIgfSBmcm9tIFwiLi9wbHVnaW5zL2dpdGh1Yi9pbmRleC50c1wiXG5leHBvcnQgeyBzYXZlUGFja2FnZVRvWmVub2RvIH0gZnJvbSBcIi4vcGx1Z2lucy96ZW5vZG8vaW5kZXgudHNcIlxuZXhwb3J0IHsgc2F2ZVBhY2thZ2VUb1ppcCB9IGZyb20gXCIuL3BsdWdpbnMvemlwL2luZGV4LnRzXCJcbmV4cG9ydCB7IHZhbGlkYXRlRmlsZSB9IGZyb20gXCIuL2ZpbGUvaW5kZXgudHNcIlxuZXhwb3J0IHsgd3JpdGVUZW1wRmlsZSB9IGZyb20gXCIuL2ZpbGUvaW5kZXgudHNcIlxuIl19
@@ -0,0 +1,2 @@
1
+ export { getPackageBasepath } from "./path.ts";
2
+ export { mergePackages } from "./merge.ts";
@@ -0,0 +1,3 @@
1
+ export { getPackageBasepath } from "./path.js";
2
+ export { mergePackages } from "./merge.js";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9wYWNrYWdlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZ2V0UGFja2FnZUJhc2VwYXRoIH0gZnJvbSBcIi4vcGF0aC50c1wiXG5leHBvcnQgeyBtZXJnZVBhY2thZ2VzIH0gZnJvbSBcIi4vbWVyZ2UudHNcIlxuIl19
@@ -0,0 +1,23 @@
1
+ import type { Package } from "@frictionless-ts/metadata";
2
+ /**
3
+ * Merges a system data package into a user data package if provided
4
+ */
5
+ export declare function mergePackages(options: {
6
+ systemPackage: Package;
7
+ userPackagePath?: string;
8
+ }): Promise<{
9
+ [x: `${string}:${string}`]: any;
10
+ $schema?: string;
11
+ resources: import("@frictionless-ts/metadata").Resource[];
12
+ name?: string;
13
+ title?: string;
14
+ description?: string;
15
+ homepage?: string;
16
+ version?: string;
17
+ licenses?: import("@frictionless-ts/metadata").License[];
18
+ contributors?: import("@frictionless-ts/metadata").Contributor[];
19
+ sources?: import("@frictionless-ts/metadata").Source[];
20
+ keywords?: string[];
21
+ created?: string;
22
+ image?: string;
23
+ }>;
@@ -0,0 +1,12 @@
1
+ import { loadPackageDescriptor } from "@frictionless-ts/metadata";
2
+ /**
3
+ * Merges a system data package into a user data package if provided
4
+ */
5
+ export async function mergePackages(options) {
6
+ const systemPackage = options.systemPackage;
7
+ const userPackage = options.userPackagePath
8
+ ? await loadPackageDescriptor(options.userPackagePath)
9
+ : undefined;
10
+ return { ...systemPackage, ...userPackage };
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9wYWNrYWdlL21lcmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBRWpFOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxhQUFhLENBQUMsT0FHbkM7SUFDQyxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFBO0lBRTNDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxlQUFlO1FBQ3pDLENBQUMsQ0FBQyxNQUFNLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7UUFDdEQsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUViLE9BQU8sRUFBRSxHQUFHLGFBQWEsRUFBRSxHQUFHLFdBQVcsRUFBRSxDQUFBO0FBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFBhY2thZ2UgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgeyBsb2FkUGFja2FnZURlc2NyaXB0b3IgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5cbi8qKlxuICogTWVyZ2VzIGEgc3lzdGVtIGRhdGEgcGFja2FnZSBpbnRvIGEgdXNlciBkYXRhIHBhY2thZ2UgaWYgcHJvdmlkZWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1lcmdlUGFja2FnZXMob3B0aW9uczoge1xuICBzeXN0ZW1QYWNrYWdlOiBQYWNrYWdlXG4gIHVzZXJQYWNrYWdlUGF0aD86IHN0cmluZ1xufSkge1xuICBjb25zdCBzeXN0ZW1QYWNrYWdlID0gb3B0aW9ucy5zeXN0ZW1QYWNrYWdlXG5cbiAgY29uc3QgdXNlclBhY2thZ2UgPSBvcHRpb25zLnVzZXJQYWNrYWdlUGF0aFxuICAgID8gYXdhaXQgbG9hZFBhY2thZ2VEZXNjcmlwdG9yKG9wdGlvbnMudXNlclBhY2thZ2VQYXRoKVxuICAgIDogdW5kZWZpbmVkXG5cbiAgcmV0dXJuIHsgLi4uc3lzdGVtUGFja2FnZSwgLi4udXNlclBhY2thZ2UgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ import { type Package } from "@frictionless-ts/metadata";
2
+ export declare function getPackageBasepath(dataPackage: Package): string | undefined;
3
+ export declare function getCommonLocalBasepath(paths: string[]): string | undefined;
@@ -0,0 +1,43 @@
1
+ import { join, relative, resolve, sep } from "node:path";
2
+ import { getBasepath, isRemotePath, } from "@frictionless-ts/metadata";
3
+ export function getPackageBasepath(dataPackage) {
4
+ const paths = [];
5
+ for (const resource of dataPackage.resources) {
6
+ if (!resource.path) {
7
+ continue;
8
+ }
9
+ const resourcePaths = Array.isArray(resource.path)
10
+ ? resource.path
11
+ : [resource.path];
12
+ paths.push(...resourcePaths);
13
+ }
14
+ return getCommonLocalBasepath(paths);
15
+ }
16
+ export function getCommonLocalBasepath(paths) {
17
+ const absoluteBasepaths = paths
18
+ .filter(path => !isRemotePath(path))
19
+ .map(path => resolve(getBasepath(path)));
20
+ if (!absoluteBasepaths.length) {
21
+ return undefined;
22
+ }
23
+ // On Unix it split the root fs as an empty segment
24
+ const segmentTable = absoluteBasepaths.map(path => path.split(sep).map(segment => segment || "/"));
25
+ let column = 0;
26
+ const segments = [];
27
+ while (true) {
28
+ const segmentColumn = segmentTable.map(segments => segments[column]);
29
+ const uniqueSegments = new Set(segmentColumn);
30
+ if (uniqueSegments.size !== 1)
31
+ break;
32
+ if (!segmentColumn[0])
33
+ break;
34
+ column++;
35
+ segments.push(segmentColumn[0]);
36
+ }
37
+ if (!segments.length) {
38
+ throw new Error("Cannot find common basepath");
39
+ }
40
+ const basepath = relative(process.cwd(), join(...segments));
41
+ return basepath;
42
+ }
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3BhY2thZ2UvcGF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3hELE9BQU8sRUFFTCxXQUFXLEVBQ1gsWUFBWSxHQUNiLE1BQU0sMkJBQTJCLENBQUE7QUFFbEMsTUFBTSxVQUFVLGtCQUFrQixDQUFDLFdBQW9CO0lBQ3JELE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQTtJQUUxQixLQUFLLE1BQU0sUUFBUSxJQUFJLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25CLFNBQVE7UUFDVixDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ2hELENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSTtZQUNmLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUVuQixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUE7SUFDOUIsQ0FBQztJQUVELE9BQU8sc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDdEMsQ0FBQztBQUVELE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxLQUFlO0lBQ3BELE1BQU0saUJBQWlCLEdBQUcsS0FBSztTQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUUxQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDOUIsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLENBQy9DLENBQUE7SUFFRCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUE7SUFDZCxNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUE7SUFFN0IsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUNwRSxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUU3QyxJQUFJLGNBQWMsQ0FBQyxJQUFJLEtBQUssQ0FBQztZQUFFLE1BQUs7UUFDcEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFBRSxNQUFLO1FBRTVCLE1BQU0sRUFBRSxDQUFBO1FBQ1IsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNqQyxDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUE7SUFDaEQsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQTtJQUMzRCxPQUFPLFFBQVEsQ0FBQTtBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgam9pbiwgcmVsYXRpdmUsIHJlc29sdmUsIHNlcCB9IGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHtcbiAgdHlwZSBQYWNrYWdlLFxuICBnZXRCYXNlcGF0aCxcbiAgaXNSZW1vdGVQYXRoLFxufSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlQmFzZXBhdGgoZGF0YVBhY2thZ2U6IFBhY2thZ2UpIHtcbiAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW11cblxuICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIGRhdGFQYWNrYWdlLnJlc291cmNlcykge1xuICAgIGlmICghcmVzb3VyY2UucGF0aCkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZVBhdGhzID0gQXJyYXkuaXNBcnJheShyZXNvdXJjZS5wYXRoKVxuICAgICAgPyByZXNvdXJjZS5wYXRoXG4gICAgICA6IFtyZXNvdXJjZS5wYXRoXVxuXG4gICAgcGF0aHMucHVzaCguLi5yZXNvdXJjZVBhdGhzKVxuICB9XG5cbiAgcmV0dXJuIGdldENvbW1vbkxvY2FsQmFzZXBhdGgocGF0aHMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21tb25Mb2NhbEJhc2VwYXRoKHBhdGhzOiBzdHJpbmdbXSkge1xuICBjb25zdCBhYnNvbHV0ZUJhc2VwYXRocyA9IHBhdGhzXG4gICAgLmZpbHRlcihwYXRoID0+ICFpc1JlbW90ZVBhdGgocGF0aCkpXG4gICAgLm1hcChwYXRoID0+IHJlc29sdmUoZ2V0QmFzZXBhdGgocGF0aCkpKVxuXG4gIGlmICghYWJzb2x1dGVCYXNlcGF0aHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLy8gT24gVW5peCBpdCBzcGxpdCB0aGUgcm9vdCBmcyBhcyBhbiBlbXB0eSBzZWdtZW50XG4gIGNvbnN0IHNlZ21lbnRUYWJsZSA9IGFic29sdXRlQmFzZXBhdGhzLm1hcChwYXRoID0+XG4gICAgcGF0aC5zcGxpdChzZXApLm1hcChzZWdtZW50ID0+IHNlZ21lbnQgfHwgXCIvXCIpLFxuICApXG5cbiAgbGV0IGNvbHVtbiA9IDBcbiAgY29uc3Qgc2VnbWVudHM6IHN0cmluZ1tdID0gW11cblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHNlZ21lbnRDb2x1bW4gPSBzZWdtZW50VGFibGUubWFwKHNlZ21lbnRzID0+IHNlZ21lbnRzW2NvbHVtbl0pXG4gICAgY29uc3QgdW5pcXVlU2VnbWVudHMgPSBuZXcgU2V0KHNlZ21lbnRDb2x1bW4pXG5cbiAgICBpZiAodW5pcXVlU2VnbWVudHMuc2l6ZSAhPT0gMSkgYnJlYWtcbiAgICBpZiAoIXNlZ21lbnRDb2x1bW5bMF0pIGJyZWFrXG5cbiAgICBjb2x1bW4rK1xuICAgIHNlZ21lbnRzLnB1c2goc2VnbWVudENvbHVtblswXSlcbiAgfVxuXG4gIGlmICghc2VnbWVudHMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgY29tbW9uIGJhc2VwYXRoXCIpXG4gIH1cblxuICBjb25zdCBiYXNlcGF0aCA9IHJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGpvaW4oLi4uc2VnbWVudHMpKVxuICByZXR1cm4gYmFzZXBhdGhcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,56 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { getCommonLocalBasepath } from "./path.js";
3
+ describe("getCommonLocalBasepath", () => {
4
+ it.each([
5
+ {
6
+ description: "same directory different files",
7
+ paths: ["data/table1.csv", "data/table2.csv"],
8
+ basepath: "data",
9
+ },
10
+ {
11
+ description: "nested directories",
12
+ paths: [
13
+ "data/nested/file1.csv",
14
+ "data/nested/file2.csv",
15
+ "data/file3.csv",
16
+ ],
17
+ basepath: "data",
18
+ },
19
+ {
20
+ description: "single path",
21
+ paths: ["data/file.csv"],
22
+ basepath: "data",
23
+ },
24
+ {
25
+ description: "root level files",
26
+ paths: ["file1.csv", "file2.csv"],
27
+ basepath: "",
28
+ },
29
+ {
30
+ description: "different top-level directories",
31
+ paths: ["data1/file1.csv", "data2/file2.csv"],
32
+ basepath: "",
33
+ },
34
+ {
35
+ description: "empty paths array",
36
+ paths: [],
37
+ basepath: undefined,
38
+ },
39
+ {
40
+ description: "some path are remote",
41
+ paths: ["https://example.com/table.csv", "data/table.csv"],
42
+ basepath: "data",
43
+ },
44
+ {
45
+ description: "all paths are remote",
46
+ paths: [
47
+ "https://example.com/table1.csv",
48
+ "https://example.com/table2.csv",
49
+ ],
50
+ basepath: undefined,
51
+ },
52
+ ])("$description", ({ paths, basepath }) => {
53
+ expect(getCommonLocalBasepath(paths)).toEqual(basepath);
54
+ });
55
+ });
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vcGFja2FnZS9wYXRoLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUVsRCxRQUFRLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFO0lBQ3RDLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDTjtZQUNFLFdBQVcsRUFBRSxnQ0FBZ0M7WUFDN0MsS0FBSyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7WUFDN0MsUUFBUSxFQUFFLE1BQU07U0FDakI7UUFDRDtZQUNFLFdBQVcsRUFBRSxvQkFBb0I7WUFDakMsS0FBSyxFQUFFO2dCQUNMLHVCQUF1QjtnQkFDdkIsdUJBQXVCO2dCQUN2QixnQkFBZ0I7YUFDakI7WUFDRCxRQUFRLEVBQUUsTUFBTTtTQUNqQjtRQUNEO1lBQ0UsV0FBVyxFQUFFLGFBQWE7WUFDMUIsS0FBSyxFQUFFLENBQUMsZUFBZSxDQUFDO1lBQ3hCLFFBQVEsRUFBRSxNQUFNO1NBQ2pCO1FBQ0Q7WUFDRSxXQUFXLEVBQUUsa0JBQWtCO1lBQy9CLEtBQUssRUFBRSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7WUFDakMsUUFBUSxFQUFFLEVBQUU7U0FDYjtRQUNEO1lBQ0UsV0FBVyxFQUFFLGlDQUFpQztZQUM5QyxLQUFLLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQztZQUM3QyxRQUFRLEVBQUUsRUFBRTtTQUNiO1FBQ0Q7WUFDRSxXQUFXLEVBQUUsbUJBQW1CO1lBQ2hDLEtBQUssRUFBRSxFQUFFO1lBQ1QsUUFBUSxFQUFFLFNBQVM7U0FDcEI7UUFDRDtZQUNFLFdBQVcsRUFBRSxzQkFBc0I7WUFDbkMsS0FBSyxFQUFFLENBQUMsK0JBQStCLEVBQUUsZ0JBQWdCLENBQUM7WUFDMUQsUUFBUSxFQUFFLE1BQU07U0FDakI7UUFDRDtZQUNFLFdBQVcsRUFBRSxzQkFBc0I7WUFDbkMsS0FBSyxFQUFFO2dCQUNMLGdDQUFnQztnQkFDaEMsZ0NBQWdDO2FBQ2pDO1lBQ0QsUUFBUSxFQUFFLFNBQVM7U0FDcEI7S0FDRixDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtRQUN6QyxNQUFNLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDekQsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyBnZXRDb21tb25Mb2NhbEJhc2VwYXRoIH0gZnJvbSBcIi4vcGF0aC50c1wiXG5cbmRlc2NyaWJlKFwiZ2V0Q29tbW9uTG9jYWxCYXNlcGF0aFwiLCAoKSA9PiB7XG4gIGl0LmVhY2goW1xuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcInNhbWUgZGlyZWN0b3J5IGRpZmZlcmVudCBmaWxlc1wiLFxuICAgICAgcGF0aHM6IFtcImRhdGEvdGFibGUxLmNzdlwiLCBcImRhdGEvdGFibGUyLmNzdlwiXSxcbiAgICAgIGJhc2VwYXRoOiBcImRhdGFcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIm5lc3RlZCBkaXJlY3Rvcmllc1wiLFxuICAgICAgcGF0aHM6IFtcbiAgICAgICAgXCJkYXRhL25lc3RlZC9maWxlMS5jc3ZcIixcbiAgICAgICAgXCJkYXRhL25lc3RlZC9maWxlMi5jc3ZcIixcbiAgICAgICAgXCJkYXRhL2ZpbGUzLmNzdlwiLFxuICAgICAgXSxcbiAgICAgIGJhc2VwYXRoOiBcImRhdGFcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcInNpbmdsZSBwYXRoXCIsXG4gICAgICBwYXRoczogW1wiZGF0YS9maWxlLmNzdlwiXSxcbiAgICAgIGJhc2VwYXRoOiBcImRhdGFcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcInJvb3QgbGV2ZWwgZmlsZXNcIixcbiAgICAgIHBhdGhzOiBbXCJmaWxlMS5jc3ZcIiwgXCJmaWxlMi5jc3ZcIl0sXG4gICAgICBiYXNlcGF0aDogXCJcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcImRpZmZlcmVudCB0b3AtbGV2ZWwgZGlyZWN0b3JpZXNcIixcbiAgICAgIHBhdGhzOiBbXCJkYXRhMS9maWxlMS5jc3ZcIiwgXCJkYXRhMi9maWxlMi5jc3ZcIl0sXG4gICAgICBiYXNlcGF0aDogXCJcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcImVtcHR5IHBhdGhzIGFycmF5XCIsXG4gICAgICBwYXRoczogW10sXG4gICAgICBiYXNlcGF0aDogdW5kZWZpbmVkLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246IFwic29tZSBwYXRoIGFyZSByZW1vdGVcIixcbiAgICAgIHBhdGhzOiBbXCJodHRwczovL2V4YW1wbGUuY29tL3RhYmxlLmNzdlwiLCBcImRhdGEvdGFibGUuY3N2XCJdLFxuICAgICAgYmFzZXBhdGg6IFwiZGF0YVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246IFwiYWxsIHBhdGhzIGFyZSByZW1vdGVcIixcbiAgICAgIHBhdGhzOiBbXG4gICAgICAgIFwiaHR0cHM6Ly9leGFtcGxlLmNvbS90YWJsZTEuY3N2XCIsXG4gICAgICAgIFwiaHR0cHM6Ly9leGFtcGxlLmNvbS90YWJsZTIuY3N2XCIsXG4gICAgICBdLFxuICAgICAgYmFzZXBhdGg6IHVuZGVmaW5lZCxcbiAgICB9LFxuICBdKShcIiRkZXNjcmlwdGlvblwiLCAoeyBwYXRocywgYmFzZXBhdGggfSkgPT4ge1xuICAgIGV4cGVjdChnZXRDb21tb25Mb2NhbEJhc2VwYXRoKHBhdGhzKSkudG9FcXVhbChiYXNlcGF0aClcbiAgfSlcbn0pXG4iXX0=
@@ -0,0 +1,11 @@
1
+ import type { Package } from "@frictionless-ts/metadata";
2
+ export type SavePackageOptions = {
3
+ target: string;
4
+ withRemote?: boolean;
5
+ };
6
+ export interface DatasetPlugin {
7
+ loadPackage?(source: string): Promise<Package | undefined>;
8
+ savePackage?(dataPackage: Package, options: SavePackageOptions): Promise<{
9
+ path?: string;
10
+ } | undefined>;
11
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFBhY2thZ2UgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5cbmV4cG9ydCB0eXBlIFNhdmVQYWNrYWdlT3B0aW9ucyA9IHtcbiAgdGFyZ2V0OiBzdHJpbmdcbiAgd2l0aFJlbW90ZT86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhc2V0UGx1Z2luIHtcbiAgbG9hZFBhY2thZ2U/KHNvdXJjZTogc3RyaW5nKTogUHJvbWlzZTxQYWNrYWdlIHwgdW5kZWZpbmVkPlxuXG4gIHNhdmVQYWNrYWdlPyhcbiAgICBkYXRhUGFja2FnZTogUGFja2FnZSxcbiAgICBvcHRpb25zOiBTYXZlUGFja2FnZU9wdGlvbnMsXG4gICk6IFByb21pc2U8eyBwYXRoPzogc3RyaW5nIH0gfCB1bmRlZmluZWQ+XG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export { makeCkanApiRequest } from "./request.ts";
@@ -0,0 +1,2 @@
1
+ export { makeCkanApiRequest } from "./request.js";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wbHVnaW5zL2NrYW4vY2thbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBtYWtlQ2thbkFwaVJlcXVlc3QgfSBmcm9tIFwiLi9yZXF1ZXN0LnRzXCJcbiJdfQ==
@@ -0,0 +1,11 @@
1
+ import type { Descriptor } from "@frictionless-ts/metadata";
2
+ export declare function makeCkanApiRequest<T = Descriptor>(options: {
3
+ ckanUrl: string;
4
+ action: string;
5
+ payload: Descriptor;
6
+ upload?: {
7
+ name: string;
8
+ data: Blob;
9
+ };
10
+ apiKey?: string;
11
+ }): Promise<T>;