@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
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @frictionless-ts/dataset
2
+
3
+ frictionless-ts is a fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames. It supports various formats like CSV, JSON, and Parquet and integrates with data platforms such as CKAN, Zenodo, and GitHub. For more information, please read the [project's documentation](https://frictionlessdata.github.io/frictionless-ts/).
@@ -0,0 +1,4 @@
1
+ export declare function copyFile(options: {
2
+ sourcePath: string;
3
+ targetPath: string;
4
+ }): Promise<void>;
@@ -0,0 +1,7 @@
1
+ import { loadFileStream } from "../stream/load.js";
2
+ import { saveFileStream } from "../stream/save.js";
3
+ export async function copyFile(options) {
4
+ const stream = await loadFileStream(options.sourcePath);
5
+ await saveFileStream(stream, { path: options.targetPath });
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29weS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2ZpbGUvY29weS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRWxELE1BQU0sQ0FBQyxLQUFLLFVBQVUsUUFBUSxDQUFDLE9BRzlCO0lBQ0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxjQUFjLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3ZELE1BQU0sY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQTtBQUM1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9hZEZpbGVTdHJlYW0gfSBmcm9tIFwiLi4vc3RyZWFtL2xvYWQudHNcIlxuaW1wb3J0IHsgc2F2ZUZpbGVTdHJlYW0gfSBmcm9tIFwiLi4vc3RyZWFtL3NhdmUudHNcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29weUZpbGUob3B0aW9uczoge1xuICBzb3VyY2VQYXRoOiBzdHJpbmdcbiAgdGFyZ2V0UGF0aDogc3RyaW5nXG59KSB7XG4gIGNvbnN0IHN0cmVhbSA9IGF3YWl0IGxvYWRGaWxlU3RyZWFtKG9wdGlvbnMuc291cmNlUGF0aClcbiAgYXdhaXQgc2F2ZUZpbGVTdHJlYW0oc3RyZWFtLCB7IHBhdGg6IG9wdGlvbnMudGFyZ2V0UGF0aCB9KVxufVxuIl19
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,104 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import { temporaryDirectory } from "tempy";
4
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
5
+ import { copyFile } from "./copy.js";
6
+ import { writeTempFile } from "./temp.js";
7
+ describe("copyFile", () => {
8
+ let testDir;
9
+ beforeEach(() => {
10
+ testDir = temporaryDirectory();
11
+ });
12
+ afterEach(async () => {
13
+ try {
14
+ await fs.rm(testDir, { recursive: true, force: true });
15
+ }
16
+ catch (error) {
17
+ if (error instanceof Error && !error.message.includes("ENOENT")) {
18
+ console.error(`Failed to clean up test directory: ${testDir}`, error);
19
+ }
20
+ }
21
+ });
22
+ it("should copy file from source to target", async () => {
23
+ const sourcePath = await writeTempFile("test content");
24
+ const targetPath = path.join(testDir, "target.txt");
25
+ await copyFile({ sourcePath, targetPath });
26
+ const fileExists = await fs
27
+ .stat(targetPath)
28
+ .then(() => true)
29
+ .catch(() => false);
30
+ expect(fileExists).toBe(true);
31
+ const content = await fs.readFile(targetPath, "utf-8");
32
+ expect(content).toBe("test content");
33
+ });
34
+ it("should copy file with exact content", async () => {
35
+ const content = "Hello, World! This is a test file.";
36
+ const sourcePath = await writeTempFile(content);
37
+ const targetPath = path.join(testDir, "copy.txt");
38
+ await copyFile({ sourcePath, targetPath });
39
+ const copiedContent = await fs.readFile(targetPath, "utf-8");
40
+ expect(copiedContent).toBe(content);
41
+ });
42
+ it("should copy binary file", async () => {
43
+ const binaryData = Buffer.from([0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10]);
44
+ const sourcePath = await writeTempFile(binaryData);
45
+ const targetPath = path.join(testDir, "binary.bin");
46
+ await copyFile({ sourcePath, targetPath });
47
+ const copiedData = await fs.readFile(targetPath);
48
+ expect(Buffer.compare(copiedData, binaryData)).toBe(0);
49
+ });
50
+ it("should copy empty file", async () => {
51
+ const sourcePath = await writeTempFile("");
52
+ const targetPath = path.join(testDir, "empty.txt");
53
+ await copyFile({ sourcePath, targetPath });
54
+ const content = await fs.readFile(targetPath, "utf-8");
55
+ expect(content).toBe("");
56
+ });
57
+ it("should copy large file", async () => {
58
+ const largeContent = "x".repeat(100000);
59
+ const sourcePath = await writeTempFile(largeContent);
60
+ const targetPath = path.join(testDir, "large.txt");
61
+ await copyFile({ sourcePath, targetPath });
62
+ const copiedContent = await fs.readFile(targetPath, "utf-8");
63
+ expect(copiedContent).toBe(largeContent);
64
+ expect(copiedContent.length).toBe(100000);
65
+ });
66
+ it("should copy file with special characters", async () => {
67
+ const content = "Special characters: é, ñ, ü, ö, à, 中文, 日本語";
68
+ const sourcePath = await writeTempFile(content);
69
+ const targetPath = path.join(testDir, "special.txt");
70
+ await copyFile({ sourcePath, targetPath });
71
+ const copiedContent = await fs.readFile(targetPath, "utf-8");
72
+ expect(copiedContent).toBe(content);
73
+ });
74
+ it("should copy file to nested directory", async () => {
75
+ const sourcePath = await writeTempFile("nested content");
76
+ const targetPath = path.join(testDir, "nested", "dir", "file.txt");
77
+ await copyFile({ sourcePath, targetPath });
78
+ const fileExists = await fs
79
+ .stat(targetPath)
80
+ .then(() => true)
81
+ .catch(() => false);
82
+ expect(fileExists).toBe(true);
83
+ const content = await fs.readFile(targetPath, "utf-8");
84
+ expect(content).toBe("nested content");
85
+ });
86
+ it("should copy json file", async () => {
87
+ const jsonContent = JSON.stringify({ name: "test", value: 123 });
88
+ const sourcePath = await writeTempFile(jsonContent);
89
+ const targetPath = path.join(testDir, "data.json");
90
+ await copyFile({ sourcePath, targetPath });
91
+ const copiedContent = await fs.readFile(targetPath, "utf-8");
92
+ expect(copiedContent).toBe(jsonContent);
93
+ expect(JSON.parse(copiedContent)).toEqual({ name: "test", value: 123 });
94
+ });
95
+ it("should copy file with newlines", async () => {
96
+ const content = "Line 1\nLine 2\nLine 3\n";
97
+ const sourcePath = await writeTempFile(content);
98
+ const targetPath = path.join(testDir, "multiline.txt");
99
+ await copyFile({ sourcePath, targetPath });
100
+ const copiedContent = await fs.readFile(targetPath, "utf-8");
101
+ expect(copiedContent).toBe(content);
102
+ });
103
+ });
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29weS5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vZmlsZS9jb3B5LnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUN0QyxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDcEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBRXpDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO0lBQ3hCLElBQUksT0FBZSxDQUFBO0lBRW5CLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxPQUFPLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQTtJQUNoQyxDQUFDLENBQUMsQ0FBQTtJQUVGLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNuQixJQUFJLENBQUM7WUFDSCxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUN4RCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksS0FBSyxZQUFZLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hFLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLE9BQU8sRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBQ3ZFLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFRixF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QUUxQyxNQUFNLGFBQWEsR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQzVELE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDdkMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO0lBQ3pFLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGdDQUFnQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzlDLE1BQU0sT0FBTyxHQUFHLDBCQUEwQixDQUFBO1FBQzFDLE1BQU0sVUFBVSxHQUFHLE1BQU0sYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQy9DLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFBO1FBRXRELE1BQU0sUUFBUSxDQUFDLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUE7UUFFMUMsTUFBTSxhQUFhLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUM1RCxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3JDLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgdGVtcG9yYXJ5RGlyZWN0b3J5IH0gZnJvbSBcInRlbXB5XCJcbmltcG9ydCB7IGFmdGVyRWFjaCwgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGNvcHlGaWxlIH0gZnJvbSBcIi4vY29weS50c1wiXG5pbXBvcnQgeyB3cml0ZVRlbXBGaWxlIH0gZnJvbSBcIi4vdGVtcC50c1wiXG5cbmRlc2NyaWJlKFwiY29weUZpbGVcIiwgKCkgPT4ge1xuICBsZXQgdGVzdERpcjogc3RyaW5nXG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgdGVzdERpciA9IHRlbXBvcmFyeURpcmVjdG9yeSgpXG4gIH0pXG5cbiAgYWZ0ZXJFYWNoKGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMucm0odGVzdERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICFlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiRU5PRU5UXCIpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjbGVhbiB1cCB0ZXN0IGRpcmVjdG9yeTogJHt0ZXN0RGlyfWAsIGVycm9yKVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICBpdChcInNob3VsZCBjb3B5IGZpbGUgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcInRlc3QgY29udGVudFwiKVxuICAgIGNvbnN0IHRhcmdldFBhdGggPSBwYXRoLmpvaW4odGVzdERpciwgXCJ0YXJnZXQudHh0XCIpXG5cbiAgICBhd2FpdCBjb3B5RmlsZSh7IHNvdXJjZVBhdGgsIHRhcmdldFBhdGggfSlcblxuICAgIGNvbnN0IGZpbGVFeGlzdHMgPSBhd2FpdCBmc1xuICAgICAgLnN0YXQodGFyZ2V0UGF0aClcbiAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAuY2F0Y2goKCkgPT4gZmFsc2UpXG4gICAgZXhwZWN0KGZpbGVFeGlzdHMpLnRvQmUodHJ1ZSlcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZSh0YXJnZXRQYXRoLCBcInV0Zi04XCIpXG4gICAgZXhwZWN0KGNvbnRlbnQpLnRvQmUoXCJ0ZXN0IGNvbnRlbnRcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBjb3B5IGZpbGUgd2l0aCBleGFjdCBjb250ZW50XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjb250ZW50ID0gXCJIZWxsbywgV29ybGQhIFRoaXMgaXMgYSB0ZXN0IGZpbGUuXCJcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShjb250ZW50KVxuICAgIGNvbnN0IHRhcmdldFBhdGggPSBwYXRoLmpvaW4odGVzdERpciwgXCJjb3B5LnR4dFwiKVxuXG4gICAgYXdhaXQgY29weUZpbGUoeyBzb3VyY2VQYXRoLCB0YXJnZXRQYXRoIH0pXG5cbiAgICBjb25zdCBjb3BpZWRDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUodGFyZ2V0UGF0aCwgXCJ1dGYtOFwiKVxuICAgIGV4cGVjdChjb3BpZWRDb250ZW50KS50b0JlKGNvbnRlbnQpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgY29weSBiaW5hcnkgZmlsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYmluYXJ5RGF0YSA9IEJ1ZmZlci5mcm9tKFsweGZmLCAweGQ4LCAweGZmLCAweGUwLCAweDAwLCAweDEwXSlcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShiaW5hcnlEYXRhKVxuICAgIGNvbnN0IHRhcmdldFBhdGggPSBwYXRoLmpvaW4odGVzdERpciwgXCJiaW5hcnkuYmluXCIpXG5cbiAgICBhd2FpdCBjb3B5RmlsZSh7IHNvdXJjZVBhdGgsIHRhcmdldFBhdGggfSlcblxuICAgIGNvbnN0IGNvcGllZERhdGEgPSBhd2FpdCBmcy5yZWFkRmlsZSh0YXJnZXRQYXRoKVxuICAgIGV4cGVjdChCdWZmZXIuY29tcGFyZShjb3BpZWREYXRhLCBiaW5hcnlEYXRhKSkudG9CZSgwKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGNvcHkgZW1wdHkgZmlsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc291cmNlUGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJcIilcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5qb2luKHRlc3REaXIsIFwiZW1wdHkudHh0XCIpXG5cbiAgICBhd2FpdCBjb3B5RmlsZSh7IHNvdXJjZVBhdGgsIHRhcmdldFBhdGggfSlcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZSh0YXJnZXRQYXRoLCBcInV0Zi04XCIpXG4gICAgZXhwZWN0KGNvbnRlbnQpLnRvQmUoXCJcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBjb3B5IGxhcmdlIGZpbGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxhcmdlQ29udGVudCA9IFwieFwiLnJlcGVhdCgxMDAwMDApXG4gICAgY29uc3Qgc291cmNlUGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUobGFyZ2VDb250ZW50KVxuICAgIGNvbnN0IHRhcmdldFBhdGggPSBwYXRoLmpvaW4odGVzdERpciwgXCJsYXJnZS50eHRcIilcblxuICAgIGF3YWl0IGNvcHlGaWxlKHsgc291cmNlUGF0aCwgdGFyZ2V0UGF0aCB9KVxuXG4gICAgY29uc3QgY29waWVkQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHRhcmdldFBhdGgsIFwidXRmLThcIilcbiAgICBleHBlY3QoY29waWVkQ29udGVudCkudG9CZShsYXJnZUNvbnRlbnQpXG4gICAgZXhwZWN0KGNvcGllZENvbnRlbnQubGVuZ3RoKS50b0JlKDEwMDAwMClcbiAgfSlcblxuICBpdChcInNob3VsZCBjb3B5IGZpbGUgd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBcIlNwZWNpYWwgY2hhcmFjdGVyczogw6ksIMOxLCDDvCwgw7YsIMOgLCDkuK3mlocsIOaXpeacrOiqnlwiXG4gICAgY29uc3Qgc291cmNlUGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoY29udGVudClcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5qb2luKHRlc3REaXIsIFwic3BlY2lhbC50eHRcIilcblxuICAgIGF3YWl0IGNvcHlGaWxlKHsgc291cmNlUGF0aCwgdGFyZ2V0UGF0aCB9KVxuXG4gICAgY29uc3QgY29waWVkQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHRhcmdldFBhdGgsIFwidXRmLThcIilcbiAgICBleHBlY3QoY29waWVkQ29udGVudCkudG9CZShjb250ZW50KVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGNvcHkgZmlsZSB0byBuZXN0ZWQgZGlyZWN0b3J5XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcIm5lc3RlZCBjb250ZW50XCIpXG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGguam9pbih0ZXN0RGlyLCBcIm5lc3RlZFwiLCBcImRpclwiLCBcImZpbGUudHh0XCIpXG5cbiAgICBhd2FpdCBjb3B5RmlsZSh7IHNvdXJjZVBhdGgsIHRhcmdldFBhdGggfSlcblxuICAgIGNvbnN0IGZpbGVFeGlzdHMgPSBhd2FpdCBmc1xuICAgICAgLnN0YXQodGFyZ2V0UGF0aClcbiAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAuY2F0Y2goKCkgPT4gZmFsc2UpXG4gICAgZXhwZWN0KGZpbGVFeGlzdHMpLnRvQmUodHJ1ZSlcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZSh0YXJnZXRQYXRoLCBcInV0Zi04XCIpXG4gICAgZXhwZWN0KGNvbnRlbnQpLnRvQmUoXCJuZXN0ZWQgY29udGVudFwiKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGNvcHkganNvbiBmaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBqc29uQ29udGVudCA9IEpTT04uc3RyaW5naWZ5KHsgbmFtZTogXCJ0ZXN0XCIsIHZhbHVlOiAxMjMgfSlcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShqc29uQ29udGVudClcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5qb2luKHRlc3REaXIsIFwiZGF0YS5qc29uXCIpXG5cbiAgICBhd2FpdCBjb3B5RmlsZSh7IHNvdXJjZVBhdGgsIHRhcmdldFBhdGggfSlcblxuICAgIGNvbnN0IGNvcGllZENvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZSh0YXJnZXRQYXRoLCBcInV0Zi04XCIpXG4gICAgZXhwZWN0KGNvcGllZENvbnRlbnQpLnRvQmUoanNvbkNvbnRlbnQpXG4gICAgZXhwZWN0KEpTT04ucGFyc2UoY29waWVkQ29udGVudCkpLnRvRXF1YWwoeyBuYW1lOiBcInRlc3RcIiwgdmFsdWU6IDEyMyB9KVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGNvcHkgZmlsZSB3aXRoIG5ld2xpbmVzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjb250ZW50ID0gXCJMaW5lIDFcXG5MaW5lIDJcXG5MaW5lIDNcXG5cIlxuICAgIGNvbnN0IHNvdXJjZVBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKGNvbnRlbnQpXG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGguam9pbih0ZXN0RGlyLCBcIm11bHRpbGluZS50eHRcIilcblxuICAgIGF3YWl0IGNvcHlGaWxlKHsgc291cmNlUGF0aCwgdGFyZ2V0UGF0aCB9KVxuXG4gICAgY29uc3QgY29waWVkQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHRhcmdldFBhdGgsIFwidXRmLThcIilcbiAgICBleHBlY3QoY29waWVkQ29udGVudCkudG9CZShjb250ZW50KVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1,7 @@
1
+ import type { HashType } from "./infer.ts";
2
+ export declare function describeFile(path: string, options?: {
3
+ hashType?: HashType;
4
+ }): Promise<{
5
+ bytes: number;
6
+ hash: string;
7
+ }>;
@@ -0,0 +1,9 @@
1
+ import { prefetchFile } from "./fetch.js";
2
+ import { inferBytes, inferHash } from "./infer.js";
3
+ export async function describeFile(path, options) {
4
+ const localPath = await prefetchFile(path);
5
+ const bytes = await inferBytes({ path: localPath });
6
+ const hash = await inferHash({ path: localPath }, { hashType: options?.hashType });
7
+ return { bytes, hash };
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpYmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9maWxlL2Rlc2NyaWJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFHbEQsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBQ2hDLElBQVksRUFDWixPQUFpQztJQUVqQyxNQUFNLFNBQVMsR0FBRyxNQUFNLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUUxQyxNQUFNLEtBQUssR0FBRyxNQUFNLFVBQVUsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBQ25ELE1BQU0sSUFBSSxHQUFHLE1BQU0sU0FBUyxDQUMxQixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFDbkIsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUNoQyxDQUFBO0lBRUQsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQTtBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJlZmV0Y2hGaWxlIH0gZnJvbSBcIi4vZmV0Y2gudHNcIlxuaW1wb3J0IHsgaW5mZXJCeXRlcywgaW5mZXJIYXNoIH0gZnJvbSBcIi4vaW5mZXIudHNcIlxuaW1wb3J0IHR5cGUgeyBIYXNoVHlwZSB9IGZyb20gXCIuL2luZmVyLnRzXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlc2NyaWJlRmlsZShcbiAgcGF0aDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBoYXNoVHlwZT86IEhhc2hUeXBlIH0sXG4pIHtcbiAgY29uc3QgbG9jYWxQYXRoID0gYXdhaXQgcHJlZmV0Y2hGaWxlKHBhdGgpXG5cbiAgY29uc3QgYnl0ZXMgPSBhd2FpdCBpbmZlckJ5dGVzKHsgcGF0aDogbG9jYWxQYXRoIH0pXG4gIGNvbnN0IGhhc2ggPSBhd2FpdCBpbmZlckhhc2goXG4gICAgeyBwYXRoOiBsb2NhbFBhdGggfSxcbiAgICB7IGhhc2hUeXBlOiBvcHRpb25zPy5oYXNoVHlwZSB9LFxuICApXG5cbiAgcmV0dXJuIHsgYnl0ZXMsIGhhc2ggfVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export declare function prefetchFiles(path?: string | string[]): Promise<string[]>;
2
+ export declare function prefetchFile(path: string): Promise<string>;
@@ -0,0 +1,21 @@
1
+ import os from "node:os";
2
+ import { isRemotePath } from "@frictionless-ts/metadata";
3
+ import pAll from "p-all";
4
+ import { copyFile } from "./copy.js";
5
+ import { getTempFilePath } from "./temp.js";
6
+ export async function prefetchFiles(path) {
7
+ if (!path)
8
+ return [];
9
+ const paths = Array.isArray(path) ? path : [path];
10
+ const concurrency = os.cpus().length;
11
+ const newPaths = await pAll(paths.map(path => () => prefetchFile(path)), { concurrency });
12
+ return newPaths;
13
+ }
14
+ export async function prefetchFile(path) {
15
+ if (!isRemotePath(path))
16
+ return path;
17
+ const newPath = getTempFilePath();
18
+ await copyFile({ sourcePath: path, targetPath: newPath });
19
+ return newPath;
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmV0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9maWxlL2ZldGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN4QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFDeEQsT0FBTyxJQUFJLE1BQU0sT0FBTyxDQUFBO0FBQ3hCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDcEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUUzQyxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FBQyxJQUF3QjtJQUMxRCxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sRUFBRSxDQUFBO0lBRXBCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNqRCxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFBO0lBRXBDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUN6QixLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQzNDLEVBQUUsV0FBVyxFQUFFLENBQ2hCLENBQUE7SUFFRCxPQUFPLFFBQVEsQ0FBQTtBQUNqQixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBQUMsSUFBWTtJQUM3QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLGVBQWUsRUFBRSxDQUFBO0lBQ2pDLE1BQU0sUUFBUSxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtJQUN6RCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCJcbmltcG9ydCB7IGlzUmVtb3RlUGF0aCB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCBwQWxsIGZyb20gXCJwLWFsbFwiXG5pbXBvcnQgeyBjb3B5RmlsZSB9IGZyb20gXCIuL2NvcHkudHNcIlxuaW1wb3J0IHsgZ2V0VGVtcEZpbGVQYXRoIH0gZnJvbSBcIi4vdGVtcC50c1wiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVmZXRjaEZpbGVzKHBhdGg/OiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICBpZiAoIXBhdGgpIHJldHVybiBbXVxuXG4gIGNvbnN0IHBhdGhzID0gQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGggOiBbcGF0aF1cbiAgY29uc3QgY29uY3VycmVuY3kgPSBvcy5jcHVzKCkubGVuZ3RoXG5cbiAgY29uc3QgbmV3UGF0aHMgPSBhd2FpdCBwQWxsKFxuICAgIHBhdGhzLm1hcChwYXRoID0+ICgpID0+IHByZWZldGNoRmlsZShwYXRoKSksXG4gICAgeyBjb25jdXJyZW5jeSB9LFxuICApXG5cbiAgcmV0dXJuIG5ld1BhdGhzXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVmZXRjaEZpbGUocGF0aDogc3RyaW5nKSB7XG4gIGlmICghaXNSZW1vdGVQYXRoKHBhdGgpKSByZXR1cm4gcGF0aFxuICBjb25zdCBuZXdQYXRoID0gZ2V0VGVtcEZpbGVQYXRoKClcbiAgYXdhaXQgY29weUZpbGUoeyBzb3VyY2VQYXRoOiBwYXRoLCB0YXJnZXRQYXRoOiBuZXdQYXRoIH0pXG4gIHJldHVybiBuZXdQYXRoXG59XG4iXX0=
@@ -0,0 +1,9 @@
1
+ export { loadFile } from "./load.ts";
2
+ export { copyFile } from "./copy.ts";
3
+ export { saveFile } from "./save.ts";
4
+ export { getTempFilePath, writeTempFile } from "./temp.ts";
5
+ export { assertLocalPathVacant, isLocalPathExist } from "./path.ts";
6
+ export { prefetchFile, prefetchFiles } from "./fetch.ts";
7
+ export { inferEncoding, inferBytes, inferHash } from "./infer.ts";
8
+ export { describeFile } from "./describe.ts";
9
+ export { validateFile } from "./validate.ts";
@@ -0,0 +1,10 @@
1
+ export { loadFile } from "./load.js";
2
+ export { copyFile } from "./copy.js";
3
+ export { saveFile } from "./save.js";
4
+ export { getTempFilePath, writeTempFile } from "./temp.js";
5
+ export { assertLocalPathVacant, isLocalPathExist } from "./path.js";
6
+ export { prefetchFile, prefetchFiles } from "./fetch.js";
7
+ export { inferEncoding, inferBytes, inferHash } from "./infer.js";
8
+ export { describeFile } from "./describe.js";
9
+ export { validateFile } from "./validate.js";
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9maWxlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDcEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQzFELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDakUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgbG9hZEZpbGUgfSBmcm9tIFwiLi9sb2FkLnRzXCJcbmV4cG9ydCB7IGNvcHlGaWxlIH0gZnJvbSBcIi4vY29weS50c1wiXG5leHBvcnQgeyBzYXZlRmlsZSB9IGZyb20gXCIuL3NhdmUudHNcIlxuZXhwb3J0IHsgZ2V0VGVtcEZpbGVQYXRoLCB3cml0ZVRlbXBGaWxlIH0gZnJvbSBcIi4vdGVtcC50c1wiXG5leHBvcnQgeyBhc3NlcnRMb2NhbFBhdGhWYWNhbnQsIGlzTG9jYWxQYXRoRXhpc3QgfSBmcm9tIFwiLi9wYXRoLnRzXCJcbmV4cG9ydCB7IHByZWZldGNoRmlsZSwgcHJlZmV0Y2hGaWxlcyB9IGZyb20gXCIuL2ZldGNoLnRzXCJcbmV4cG9ydCB7IGluZmVyRW5jb2RpbmcsIGluZmVyQnl0ZXMsIGluZmVySGFzaCB9IGZyb20gXCIuL2luZmVyLnRzXCJcbmV4cG9ydCB7IGRlc2NyaWJlRmlsZSB9IGZyb20gXCIuL2Rlc2NyaWJlLnRzXCJcbmV4cG9ydCB7IHZhbGlkYXRlRmlsZSB9IGZyb20gXCIuL3ZhbGlkYXRlLnRzXCJcbiJdfQ==
@@ -0,0 +1,10 @@
1
+ import type { Resource } from "@frictionless-ts/metadata";
2
+ export type HashType = "md5" | "sha1" | "sha256" | "sha512";
3
+ export declare function inferBytes(resource: Partial<Resource>): Promise<number>;
4
+ export declare function inferHash(resource: Partial<Resource>, options?: {
5
+ hashType?: HashType;
6
+ }): Promise<string>;
7
+ export declare function inferEncoding(resource: Partial<Resource>, options?: {
8
+ sampleBytes?: number;
9
+ confidencePercent?: number;
10
+ }): Promise<string | undefined>;
@@ -0,0 +1,48 @@
1
+ import { stat } from "node:fs/promises";
2
+ import chardet from "chardet";
3
+ import * as hasha from "hasha";
4
+ import { isBinaryFile } from "isbinaryfile";
5
+ import pMap from "p-map";
6
+ import { concatFileStreams } from "../stream/concat.js";
7
+ import { loadFileStream } from "../stream/index.js";
8
+ import { prefetchFiles } from "./fetch.js";
9
+ import { loadFile } from "./load.js";
10
+ export async function inferBytes(resource) {
11
+ const localPaths = await prefetchFiles(resource.path);
12
+ let bytes = 0;
13
+ for (const localPath of localPaths) {
14
+ const result = await stat(localPath);
15
+ bytes += result.size;
16
+ }
17
+ return bytes;
18
+ }
19
+ export async function inferHash(resource, options) {
20
+ const algorithm = options?.hashType ?? "sha256";
21
+ const localPaths = await prefetchFiles(resource.path);
22
+ const streams = await pMap(localPaths, async (path) => loadFileStream(path));
23
+ const stream = concatFileStreams(streams);
24
+ const hash = await hasha.hash(stream, { algorithm });
25
+ return `${algorithm}:${hash}`;
26
+ }
27
+ export async function inferEncoding(resource, options) {
28
+ const maxBytes = options?.sampleBytes ?? 10_000;
29
+ const confidencePercent = options?.confidencePercent ?? 80;
30
+ const firstPath = Array.isArray(resource.path)
31
+ ? resource.path[0]
32
+ : resource.path;
33
+ if (!firstPath) {
34
+ return undefined;
35
+ }
36
+ const buffer = await loadFile(firstPath, { maxBytes });
37
+ const isBinary = await isBinaryFile(buffer);
38
+ if (!isBinary) {
39
+ const matches = chardet.analyse(buffer);
40
+ for (const match of matches) {
41
+ if (match.confidence >= confidencePercent) {
42
+ return match.name.toLowerCase();
43
+ }
44
+ }
45
+ }
46
+ return undefined;
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9maWxlL2luZmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUV2QyxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUE7QUFDN0IsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUE7QUFDOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUMzQyxPQUFPLElBQUksTUFBTSxPQUFPLENBQUE7QUFDeEIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDMUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUlwQyxNQUFNLENBQUMsS0FBSyxVQUFVLFVBQVUsQ0FBQyxRQUEyQjtJQUMxRCxNQUFNLFVBQVUsR0FBRyxNQUFNLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFckQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFBO0lBQ2IsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNuQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNwQyxLQUFLLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQTtJQUN0QixDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxTQUFTLENBQzdCLFFBQTJCLEVBQzNCLE9BQWlDO0lBRWpDLE1BQU0sU0FBUyxHQUFHLE9BQU8sRUFBRSxRQUFRLElBQUksUUFBUSxDQUFBO0lBQy9DLE1BQU0sVUFBVSxHQUFHLE1BQU0sYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUVyRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFDLElBQUksRUFBQyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDMUUsTUFBTSxNQUFNLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUE7SUFFekMsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUE7SUFDcEQsT0FBTyxHQUFHLFNBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtBQUMvQixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxhQUFhLENBQ2pDLFFBQTJCLEVBQzNCLE9BQThEO0lBRTlELE1BQU0sUUFBUSxHQUFHLE9BQU8sRUFBRSxXQUFXLElBQUksTUFBTSxDQUFBO0lBQy9DLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxFQUFFLGlCQUFpQixJQUFJLEVBQUUsQ0FBQTtJQUUxRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDNUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFBO0lBRWpCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNmLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQ3RELE1BQU0sUUFBUSxHQUFHLE1BQU0sWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTNDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDdkMsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM1QixJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksaUJBQWlCLEVBQUUsQ0FBQztnQkFDMUMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO1lBQ2pDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzdGF0IH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCBjaGFyZGV0IGZyb20gXCJjaGFyZGV0XCJcbmltcG9ydCAqIGFzIGhhc2hhIGZyb20gXCJoYXNoYVwiXG5pbXBvcnQgeyBpc0JpbmFyeUZpbGUgfSBmcm9tIFwiaXNiaW5hcnlmaWxlXCJcbmltcG9ydCBwTWFwIGZyb20gXCJwLW1hcFwiXG5pbXBvcnQgeyBjb25jYXRGaWxlU3RyZWFtcyB9IGZyb20gXCIuLi9zdHJlYW0vY29uY2F0LnRzXCJcbmltcG9ydCB7IGxvYWRGaWxlU3RyZWFtIH0gZnJvbSBcIi4uL3N0cmVhbS9pbmRleC50c1wiXG5pbXBvcnQgeyBwcmVmZXRjaEZpbGVzIH0gZnJvbSBcIi4vZmV0Y2gudHNcIlxuaW1wb3J0IHsgbG9hZEZpbGUgfSBmcm9tIFwiLi9sb2FkLnRzXCJcblxuZXhwb3J0IHR5cGUgSGFzaFR5cGUgPSBcIm1kNVwiIHwgXCJzaGExXCIgfCBcInNoYTI1NlwiIHwgXCJzaGE1MTJcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5mZXJCeXRlcyhyZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4pIHtcbiAgY29uc3QgbG9jYWxQYXRocyA9IGF3YWl0IHByZWZldGNoRmlsZXMocmVzb3VyY2UucGF0aClcblxuICBsZXQgYnl0ZXMgPSAwXG4gIGZvciAoY29uc3QgbG9jYWxQYXRoIG9mIGxvY2FsUGF0aHMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGF0KGxvY2FsUGF0aClcbiAgICBieXRlcyArPSByZXN1bHQuc2l6ZVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbmZlckhhc2goXG4gIHJlc291cmNlOiBQYXJ0aWFsPFJlc291cmNlPixcbiAgb3B0aW9ucz86IHsgaGFzaFR5cGU/OiBIYXNoVHlwZSB9LFxuKSB7XG4gIGNvbnN0IGFsZ29yaXRobSA9IG9wdGlvbnM/Lmhhc2hUeXBlID8/IFwic2hhMjU2XCJcbiAgY29uc3QgbG9jYWxQYXRocyA9IGF3YWl0IHByZWZldGNoRmlsZXMocmVzb3VyY2UucGF0aClcblxuICBjb25zdCBzdHJlYW1zID0gYXdhaXQgcE1hcChsb2NhbFBhdGhzLCBhc3luYyBwYXRoID0+IGxvYWRGaWxlU3RyZWFtKHBhdGgpKVxuICBjb25zdCBzdHJlYW0gPSBjb25jYXRGaWxlU3RyZWFtcyhzdHJlYW1zKVxuXG4gIGNvbnN0IGhhc2ggPSBhd2FpdCBoYXNoYS5oYXNoKHN0cmVhbSwgeyBhbGdvcml0aG0gfSlcbiAgcmV0dXJuIGAke2FsZ29yaXRobX06JHtoYXNofWBcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluZmVyRW5jb2RpbmcoXG4gIHJlc291cmNlOiBQYXJ0aWFsPFJlc291cmNlPixcbiAgb3B0aW9ucz86IHsgc2FtcGxlQnl0ZXM/OiBudW1iZXI7IGNvbmZpZGVuY2VQZXJjZW50PzogbnVtYmVyIH0sXG4pIHtcbiAgY29uc3QgbWF4Qnl0ZXMgPSBvcHRpb25zPy5zYW1wbGVCeXRlcyA/PyAxMF8wMDBcbiAgY29uc3QgY29uZmlkZW5jZVBlcmNlbnQgPSBvcHRpb25zPy5jb25maWRlbmNlUGVyY2VudCA/PyA4MFxuXG4gIGNvbnN0IGZpcnN0UGF0aCA9IEFycmF5LmlzQXJyYXkocmVzb3VyY2UucGF0aClcbiAgICA/IHJlc291cmNlLnBhdGhbMF1cbiAgICA6IHJlc291cmNlLnBhdGhcblxuICBpZiAoIWZpcnN0UGF0aCkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGxvYWRGaWxlKGZpcnN0UGF0aCwgeyBtYXhCeXRlcyB9KVxuICBjb25zdCBpc0JpbmFyeSA9IGF3YWl0IGlzQmluYXJ5RmlsZShidWZmZXIpXG5cbiAgaWYgKCFpc0JpbmFyeSkge1xuICAgIGNvbnN0IG1hdGNoZXMgPSBjaGFyZGV0LmFuYWx5c2UoYnVmZmVyKVxuICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgaWYgKG1hdGNoLmNvbmZpZGVuY2UgPj0gY29uZmlkZW5jZVBlcmNlbnQpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,141 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import * as fetchModule from "./fetch.js";
3
+ import { inferBytes, inferEncoding, inferHash } from "./infer.js";
4
+ import { writeTempFile } from "./temp.js";
5
+ vi.mock("./fetch.ts", () => ({
6
+ prefetchFiles: vi.fn(),
7
+ }));
8
+ describe("inferHash", () => {
9
+ let mockPrefetchFiles;
10
+ let tempFilePath;
11
+ beforeEach(async () => {
12
+ mockPrefetchFiles = vi.mocked(fetchModule.prefetchFiles);
13
+ tempFilePath = await writeTempFile("Hello, World!");
14
+ vi.clearAllMocks();
15
+ });
16
+ it("should compute sha256 hash by default", async () => {
17
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
18
+ const result = await inferHash({ path: "https://example.com/file.txt" });
19
+ expect(mockPrefetchFiles).toHaveBeenCalledWith("https://example.com/file.txt");
20
+ expect(result).toMatch(/^sha256:[a-f0-9]{64}$/);
21
+ });
22
+ it("should compute md5 hash when specified", async () => {
23
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
24
+ const result = await inferHash({ path: "https://example.com/file.txt" }, {
25
+ hashType: "md5",
26
+ });
27
+ expect(mockPrefetchFiles).toHaveBeenCalledWith("https://example.com/file.txt");
28
+ expect(result).toMatch(/^md5:[a-f0-9]{32}$/);
29
+ });
30
+ it("should compute sha1 hash when specified", async () => {
31
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
32
+ const result = await inferHash({ path: "https://example.com/file.txt" }, {
33
+ hashType: "sha1",
34
+ });
35
+ expect(mockPrefetchFiles).toHaveBeenCalledWith("https://example.com/file.txt");
36
+ expect(result).toMatch(/^sha1:[a-f0-9]{40}$/);
37
+ });
38
+ it("should compute sha512 hash when specified", async () => {
39
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
40
+ const result = await inferHash({ path: "https://example.com/file.txt" }, {
41
+ hashType: "sha512",
42
+ });
43
+ expect(mockPrefetchFiles).toHaveBeenCalledWith("https://example.com/file.txt");
44
+ expect(result).toMatch(/^sha512:[a-f0-9]{128}$/);
45
+ });
46
+ it("should compute consistent hashes for same content", async () => {
47
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
48
+ const result1 = await inferHash({ path: "https://example.com/file.txt" });
49
+ const result2 = await inferHash({ path: "https://example.com/file.txt" });
50
+ expect(result1).toBe(result2);
51
+ });
52
+ });
53
+ describe("inferBytes", () => {
54
+ let mockPrefetchFiles;
55
+ beforeEach(() => {
56
+ mockPrefetchFiles = vi.mocked(fetchModule.prefetchFiles);
57
+ vi.clearAllMocks();
58
+ });
59
+ it("should return file size in bytes", async () => {
60
+ const tempFilePath = await writeTempFile("Hello, World!");
61
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
62
+ const result = await inferBytes({ path: "https://example.com/file.txt" });
63
+ expect(mockPrefetchFiles).toHaveBeenCalledWith("https://example.com/file.txt");
64
+ expect(result).toBe(13);
65
+ });
66
+ it("should handle empty files", async () => {
67
+ const tempFilePath = await writeTempFile("");
68
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
69
+ const result = await inferBytes({ path: "https://example.com/empty.txt" });
70
+ expect(result).toBe(0);
71
+ });
72
+ it("should handle larger files", async () => {
73
+ const tempFilePath = await writeTempFile("x".repeat(10000));
74
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
75
+ const result = await inferBytes({ path: "https://example.com/large.txt" });
76
+ expect(result).toBe(10000);
77
+ });
78
+ it("should handle binary data", async () => {
79
+ const tempFilePath = await writeTempFile(Buffer.from([0xff, 0xd8, 0xff, 0xe0]));
80
+ mockPrefetchFiles.mockResolvedValue([tempFilePath]);
81
+ const result = await inferBytes({ path: "https://example.com/file.bin" });
82
+ expect(mockPrefetchFiles).toHaveBeenCalledWith("https://example.com/file.bin");
83
+ expect(result).toBe(4);
84
+ });
85
+ });
86
+ describe("inferEncoding", () => {
87
+ it("should detect utf-8 encoding", async () => {
88
+ const tempFilePath = await writeTempFile("Hello, World! This is UTF-8 text.");
89
+ const result = await inferEncoding({ path: tempFilePath });
90
+ expect(result).toBeDefined();
91
+ expect(["utf-8", "utf8", "ascii"]).toContain(result);
92
+ });
93
+ it("should return undefined for binary files", async () => {
94
+ const tempFilePath = await writeTempFile(Buffer.from([0xff, 0xd8, 0xff, 0xe0, 0x00]));
95
+ const result = await inferEncoding({ path: tempFilePath });
96
+ expect(result).toBeUndefined();
97
+ });
98
+ it("should use custom sample bytes", async () => {
99
+ const tempFilePath = await writeTempFile("This is a test file with UTF-8 content.");
100
+ const result = await inferEncoding({ path: tempFilePath }, { sampleBytes: 20 });
101
+ expect(result).toBeDefined();
102
+ });
103
+ it("should use custom confidence threshold", async () => {
104
+ const tempFilePath = await writeTempFile("Sample text content");
105
+ const result = await inferEncoding({ path: tempFilePath }, {
106
+ confidencePercent: 50,
107
+ });
108
+ expect(result).toBeDefined();
109
+ });
110
+ it("should handle large text files", async () => {
111
+ const tempFilePath = await writeTempFile("Hello World! ".repeat(1000));
112
+ const result = await inferEncoding({ path: tempFilePath });
113
+ expect(result).toBeDefined();
114
+ expect(["utf-8", "utf8", "ascii"]).toContain(result);
115
+ });
116
+ it("should return encoding in lowercase", async () => {
117
+ const tempFilePath = await writeTempFile("Test content for encoding detection");
118
+ const result = await inferEncoding({ path: tempFilePath });
119
+ if (result) {
120
+ expect(result).toBe(result.toLowerCase());
121
+ }
122
+ });
123
+ it("should handle empty files", async () => {
124
+ const tempFilePath = await writeTempFile("");
125
+ const result = await inferEncoding({ path: tempFilePath });
126
+ expect([undefined, "utf-8", "utf8", "ascii"]).toContain(result);
127
+ });
128
+ it("should handle files with special characters", async () => {
129
+ const tempFilePath = await writeTempFile("Special: é, ñ, ü, ö, à");
130
+ const result = await inferEncoding({ path: tempFilePath });
131
+ expect(result).toBeDefined();
132
+ });
133
+ it("should detect encoding with low confidence threshold", async () => {
134
+ const tempFilePath = await writeTempFile("Simple text");
135
+ const result = await inferEncoding({ path: tempFilePath }, {
136
+ confidencePercent: 30,
137
+ });
138
+ expect(result).toBeDefined();
139
+ });
140
+ });
141
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mZXIuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2ZpbGUvaW5mZXIuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3RCxPQUFPLEtBQUssV0FBVyxNQUFNLFlBQVksQ0FBQTtBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDakUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUV6QyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzNCLGFBQWEsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO0NBQ3ZCLENBQUMsQ0FBQyxDQUFBO0FBRUgsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7SUFDekIsSUFBSSxpQkFBMkMsQ0FBQTtJQUMvQyxJQUFJLFlBQW9CLENBQUE7SUFFeEIsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ3BCLGlCQUFpQixHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQ3hELFlBQVksR0FBRyxNQUFNLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUNuRCxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUE7SUFDcEIsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsdUNBQXVDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDckQsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFBO1FBRW5ELE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLDhCQUE4QixFQUFFLENBQUMsQ0FBQTtRQUV4RSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxvQkFBb0IsQ0FDNUMsOEJBQThCLENBQy9CLENBQUE7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUE7SUFDakQsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsd0NBQXdDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdEQsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFBO1FBRW5ELE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUM1QixFQUFFLElBQUksRUFBRSw4QkFBOEIsRUFBRSxFQUN4QztZQUNFLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQ0YsQ0FBQTtRQUVELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLG9CQUFvQixDQUM1Qyw4QkFBOEIsQ0FDL0IsQ0FBQTtRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtJQUM5QyxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RCxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUE7UUFFbkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQzVCLEVBQUUsSUFBSSxFQUFFLDhCQUE4QixFQUFFLEVBQ3hDO1lBQ0UsUUFBUSxFQUFFLE1BQU07U0FDakIsQ0FDRixDQUFBO1FBRUQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsb0JBQW9CLENBQzVDLDhCQUE4QixDQUMvQixDQUFBO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO0lBQy9DLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3pELGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQTtRQUVuRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FDNUIsRUFBRSxJQUFJLEVBQUUsOEJBQThCLEVBQUUsRUFDeEM7WUFDRSxRQUFRLEVBQUUsUUFBUTtTQUNuQixDQUNGLENBQUE7UUFFRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxvQkFBb0IsQ0FDNUMsOEJBQThCLENBQy9CLENBQUE7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUE7SUFDbEQsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsbURBQW1ELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDakUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFBO1FBRW5ELE1BQU0sT0FBTyxHQUFHLE1BQU0sU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLDhCQUE4QixFQUFFLENBQUMsQ0FBQTtRQUN6RSxNQUFNLE9BQU8sR0FBRyxNQUFNLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSw4QkFBOEIsRUFBRSxDQUFDLENBQUE7UUFFekUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUMvQixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBO0FBRUYsUUFBUSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUU7SUFDMUIsSUFBSSxpQkFBMkMsQ0FBQTtJQUUvQyxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsaUJBQWlCLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDeEQsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQ3BCLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2hELE1BQU0sWUFBWSxHQUFHLE1BQU0sYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBQ3pELGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQTtRQUVuRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FBQyxFQUFFLElBQUksRUFBRSw4QkFBOEIsRUFBRSxDQUFDLENBQUE7UUFFekUsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsb0JBQW9CLENBQzVDLDhCQUE4QixDQUMvQixDQUFBO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUN6QixDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQywyQkFBMkIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN6QyxNQUFNLFlBQVksR0FBRyxNQUFNLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUM1QyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUE7UUFFbkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsRUFBRSxJQUFJLEVBQUUsK0JBQStCLEVBQUUsQ0FBQyxDQUFBO1FBRTFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDeEIsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDMUMsTUFBTSxZQUFZLEdBQUcsTUFBTSxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQzNELGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQTtRQUVuRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FBQyxFQUFFLElBQUksRUFBRSwrQkFBK0IsRUFBRSxDQUFDLENBQUE7UUFFMUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM1QixDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQywyQkFBMkIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN6QyxNQUFNLFlBQVksR0FBRyxNQUFNLGFBQWEsQ0FDdEMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQ3RDLENBQUE7UUFDRCxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUE7UUFFbkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsRUFBRSxJQUFJLEVBQUUsOEJBQThCLEVBQUUsQ0FBQyxDQUFBO1FBRXpFLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLG9CQUFvQixDQUM1Qyw4QkFBOEIsQ0FDL0IsQ0FBQTtRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDeEIsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQTtBQUVGLFFBQVEsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO0lBQzdCLEVBQUUsQ0FBQyw4QkFBOEIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUM1QyxNQUFNLFlBQVksR0FBRyxNQUFNLGFBQWEsQ0FDdEMsbUNBQW1DLENBQ3BDLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFBO1FBRTFELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUM1QixNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3RELENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3hELE1BQU0sWUFBWSxHQUFHLE1BQU0sYUFBYSxDQUN0QyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQzVDLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFBO1FBRTFELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUNoQyxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxLQUFLLElBQUksRUFBRTtRQUM5QyxNQUFNLFlBQVksR0FBRyxNQUFNLGFBQWEsQ0FDdEMseUNBQXlDLENBQzFDLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGFBQWEsQ0FDaEMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEVBQ3RCLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUNwQixDQUFBO1FBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQzlCLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3RELE1BQU0sWUFBWSxHQUFHLE1BQU0sYUFBYSxDQUFDLHFCQUFxQixDQUFDLENBQUE7UUFFL0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxhQUFhLENBQ2hDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxFQUN0QjtZQUNFLGlCQUFpQixFQUFFLEVBQUU7U0FDdEIsQ0FDRixDQUFBO1FBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQzlCLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGdDQUFnQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzlDLE1BQU0sWUFBWSxHQUFHLE1BQU0sYUFBYSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUV0RSxNQUFNLE1BQU0sR0FBRyxNQUFNLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFBO1FBRTFELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUM1QixNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3RELENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHFDQUFxQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ25ELE1BQU0sWUFBWSxHQUFHLE1BQU0sYUFBYSxDQUN0QyxxQ0FBcUMsQ0FDdEMsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sYUFBYSxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUE7UUFFMUQsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUE7UUFDM0MsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDJCQUEyQixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLE1BQU0sYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRTVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sYUFBYSxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUE7UUFFMUQsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDakUsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsNkNBQTZDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDM0QsTUFBTSxZQUFZLEdBQUcsTUFBTSxhQUFhLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtRQUVsRSxNQUFNLE1BQU0sR0FBRyxNQUFNLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFBO1FBRTFELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUM5QixDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxzREFBc0QsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNwRSxNQUFNLFlBQVksR0FBRyxNQUFNLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUV2RCxNQUFNLE1BQU0sR0FBRyxNQUFNLGFBQWEsQ0FDaEMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEVBQ3RCO1lBQ0UsaUJBQWlCLEVBQUUsRUFBRTtTQUN0QixDQUNGLENBQUE7UUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDOUIsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJlZm9yZUVhY2gsIGRlc2NyaWJlLCBleHBlY3QsIGl0LCB2aSB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0ICogYXMgZmV0Y2hNb2R1bGUgZnJvbSBcIi4vZmV0Y2gudHNcIlxuaW1wb3J0IHsgaW5mZXJCeXRlcywgaW5mZXJFbmNvZGluZywgaW5mZXJIYXNoIH0gZnJvbSBcIi4vaW5mZXIudHNcIlxuaW1wb3J0IHsgd3JpdGVUZW1wRmlsZSB9IGZyb20gXCIuL3RlbXAudHNcIlxuXG52aS5tb2NrKFwiLi9mZXRjaC50c1wiLCAoKSA9PiAoe1xuICBwcmVmZXRjaEZpbGVzOiB2aS5mbigpLFxufSkpXG5cbmRlc2NyaWJlKFwiaW5mZXJIYXNoXCIsICgpID0+IHtcbiAgbGV0IG1vY2tQcmVmZXRjaEZpbGVzOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj5cbiAgbGV0IHRlbXBGaWxlUGF0aDogc3RyaW5nXG5cbiAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgbW9ja1ByZWZldGNoRmlsZXMgPSB2aS5tb2NrZWQoZmV0Y2hNb2R1bGUucHJlZmV0Y2hGaWxlcylcbiAgICB0ZW1wRmlsZVBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiSGVsbG8sIFdvcmxkIVwiKVxuICAgIHZpLmNsZWFyQWxsTW9ja3MoKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGNvbXB1dGUgc2hhMjU2IGhhc2ggYnkgZGVmYXVsdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja1ByZWZldGNoRmlsZXMubW9ja1Jlc29sdmVkVmFsdWUoW3RlbXBGaWxlUGF0aF0pXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbmZlckhhc2goeyBwYXRoOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vZmlsZS50eHRcIiB9KVxuXG4gICAgZXhwZWN0KG1vY2tQcmVmZXRjaEZpbGVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9maWxlLnR4dFwiLFxuICAgIClcbiAgICBleHBlY3QocmVzdWx0KS50b01hdGNoKC9ec2hhMjU2OlthLWYwLTldezY0fSQvKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGNvbXB1dGUgbWQ1IGhhc2ggd2hlbiBzcGVjaWZpZWRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tQcmVmZXRjaEZpbGVzLm1vY2tSZXNvbHZlZFZhbHVlKFt0ZW1wRmlsZVBhdGhdKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJIYXNoKFxuICAgICAgeyBwYXRoOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vZmlsZS50eHRcIiB9LFxuICAgICAge1xuICAgICAgICBoYXNoVHlwZTogXCJtZDVcIixcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgZXhwZWN0KG1vY2tQcmVmZXRjaEZpbGVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9maWxlLnR4dFwiLFxuICAgIClcbiAgICBleHBlY3QocmVzdWx0KS50b01hdGNoKC9ebWQ1OlthLWYwLTldezMyfSQvKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGNvbXB1dGUgc2hhMSBoYXNoIHdoZW4gc3BlY2lmaWVkXCIsIGFzeW5jICgpID0+IHtcbiAgICBtb2NrUHJlZmV0Y2hGaWxlcy5tb2NrUmVzb2x2ZWRWYWx1ZShbdGVtcEZpbGVQYXRoXSlcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGluZmVySGFzaChcbiAgICAgIHsgcGF0aDogXCJodHRwczovL2V4YW1wbGUuY29tL2ZpbGUudHh0XCIgfSxcbiAgICAgIHtcbiAgICAgICAgaGFzaFR5cGU6IFwic2hhMVwiLFxuICAgICAgfSxcbiAgICApXG5cbiAgICBleHBlY3QobW9ja1ByZWZldGNoRmlsZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgXCJodHRwczovL2V4YW1wbGUuY29tL2ZpbGUudHh0XCIsXG4gICAgKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvTWF0Y2goL15zaGExOlthLWYwLTldezQwfSQvKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGNvbXB1dGUgc2hhNTEyIGhhc2ggd2hlbiBzcGVjaWZpZWRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tQcmVmZXRjaEZpbGVzLm1vY2tSZXNvbHZlZFZhbHVlKFt0ZW1wRmlsZVBhdGhdKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJIYXNoKFxuICAgICAgeyBwYXRoOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vZmlsZS50eHRcIiB9LFxuICAgICAge1xuICAgICAgICBoYXNoVHlwZTogXCJzaGE1MTJcIixcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgZXhwZWN0KG1vY2tQcmVmZXRjaEZpbGVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9maWxlLnR4dFwiLFxuICAgIClcbiAgICBleHBlY3QocmVzdWx0KS50b01hdGNoKC9ec2hhNTEyOlthLWYwLTldezEyOH0kLylcbiAgfSlcblxuICBpdChcInNob3VsZCBjb21wdXRlIGNvbnNpc3RlbnQgaGFzaGVzIGZvciBzYW1lIGNvbnRlbnRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tQcmVmZXRjaEZpbGVzLm1vY2tSZXNvbHZlZFZhbHVlKFt0ZW1wRmlsZVBhdGhdKVxuXG4gICAgY29uc3QgcmVzdWx0MSA9IGF3YWl0IGluZmVySGFzaCh7IHBhdGg6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9maWxlLnR4dFwiIH0pXG4gICAgY29uc3QgcmVzdWx0MiA9IGF3YWl0IGluZmVySGFzaCh7IHBhdGg6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9maWxlLnR4dFwiIH0pXG5cbiAgICBleHBlY3QocmVzdWx0MSkudG9CZShyZXN1bHQyKVxuICB9KVxufSlcblxuZGVzY3JpYmUoXCJpbmZlckJ5dGVzXCIsICgpID0+IHtcbiAgbGV0IG1vY2tQcmVmZXRjaEZpbGVzOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj5cblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBtb2NrUHJlZmV0Y2hGaWxlcyA9IHZpLm1vY2tlZChmZXRjaE1vZHVsZS5wcmVmZXRjaEZpbGVzKVxuICAgIHZpLmNsZWFyQWxsTW9ja3MoKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHJldHVybiBmaWxlIHNpemUgaW4gYnl0ZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRlbXBGaWxlUGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJIZWxsbywgV29ybGQhXCIpXG4gICAgbW9ja1ByZWZldGNoRmlsZXMubW9ja1Jlc29sdmVkVmFsdWUoW3RlbXBGaWxlUGF0aF0pXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbmZlckJ5dGVzKHsgcGF0aDogXCJodHRwczovL2V4YW1wbGUuY29tL2ZpbGUudHh0XCIgfSlcblxuICAgIGV4cGVjdChtb2NrUHJlZmV0Y2hGaWxlcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICBcImh0dHBzOi8vZXhhbXBsZS5jb20vZmlsZS50eHRcIixcbiAgICApXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZSgxMylcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgZW1wdHkgZmlsZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRlbXBGaWxlUGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJcIilcbiAgICBtb2NrUHJlZmV0Y2hGaWxlcy5tb2NrUmVzb2x2ZWRWYWx1ZShbdGVtcEZpbGVQYXRoXSlcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGluZmVyQnl0ZXMoeyBwYXRoOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vZW1wdHkudHh0XCIgfSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoMClcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgbGFyZ2VyIGZpbGVzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0ZW1wRmlsZVBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwieFwiLnJlcGVhdCgxMDAwMCkpXG4gICAgbW9ja1ByZWZldGNoRmlsZXMubW9ja1Jlc29sdmVkVmFsdWUoW3RlbXBGaWxlUGF0aF0pXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbmZlckJ5dGVzKHsgcGF0aDogXCJodHRwczovL2V4YW1wbGUuY29tL2xhcmdlLnR4dFwiIH0pXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0JlKDEwMDAwKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBiaW5hcnkgZGF0YVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGVtcEZpbGVQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcbiAgICAgIEJ1ZmZlci5mcm9tKFsweGZmLCAweGQ4LCAweGZmLCAweGUwXSksXG4gICAgKVxuICAgIG1vY2tQcmVmZXRjaEZpbGVzLm1vY2tSZXNvbHZlZFZhbHVlKFt0ZW1wRmlsZVBhdGhdKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJCeXRlcyh7IHBhdGg6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9maWxlLmJpblwiIH0pXG5cbiAgICBleHBlY3QobW9ja1ByZWZldGNoRmlsZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgXCJodHRwczovL2V4YW1wbGUuY29tL2ZpbGUuYmluXCIsXG4gICAgKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoNClcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKFwiaW5mZXJFbmNvZGluZ1wiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIGRldGVjdCB1dGYtOCBlbmNvZGluZ1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGVtcEZpbGVQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcbiAgICAgIFwiSGVsbG8sIFdvcmxkISBUaGlzIGlzIFVURi04IHRleHQuXCIsXG4gICAgKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJFbmNvZGluZyh7IHBhdGg6IHRlbXBGaWxlUGF0aCB9KVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChbXCJ1dGYtOFwiLCBcInV0ZjhcIiwgXCJhc2NpaVwiXSkudG9Db250YWluKHJlc3VsdClcbiAgfSlcblxuICBpdChcInNob3VsZCByZXR1cm4gdW5kZWZpbmVkIGZvciBiaW5hcnkgZmlsZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRlbXBGaWxlUGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXG4gICAgICBCdWZmZXIuZnJvbShbMHhmZiwgMHhkOCwgMHhmZiwgMHhlMCwgMHgwMF0pLFxuICAgIClcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGluZmVyRW5jb2RpbmcoeyBwYXRoOiB0ZW1wRmlsZVBhdGggfSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmVVbmRlZmluZWQoKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHVzZSBjdXN0b20gc2FtcGxlIGJ5dGVzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0ZW1wRmlsZVBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFxuICAgICAgXCJUaGlzIGlzIGEgdGVzdCBmaWxlIHdpdGggVVRGLTggY29udGVudC5cIixcbiAgICApXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbmZlckVuY29kaW5nKFxuICAgICAgeyBwYXRoOiB0ZW1wRmlsZVBhdGggfSxcbiAgICAgIHsgc2FtcGxlQnl0ZXM6IDIwIH0sXG4gICAgKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHVzZSBjdXN0b20gY29uZmlkZW5jZSB0aHJlc2hvbGRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRlbXBGaWxlUGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJTYW1wbGUgdGV4dCBjb250ZW50XCIpXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbmZlckVuY29kaW5nKFxuICAgICAgeyBwYXRoOiB0ZW1wRmlsZVBhdGggfSxcbiAgICAgIHtcbiAgICAgICAgY29uZmlkZW5jZVBlcmNlbnQ6IDUwLFxuICAgICAgfSxcbiAgICApXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0JlRGVmaW5lZCgpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIGxhcmdlIHRleHQgZmlsZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRlbXBGaWxlUGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJIZWxsbyBXb3JsZCEgXCIucmVwZWF0KDEwMDApKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJFbmNvZGluZyh7IHBhdGg6IHRlbXBGaWxlUGF0aCB9KVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChbXCJ1dGYtOFwiLCBcInV0ZjhcIiwgXCJhc2NpaVwiXSkudG9Db250YWluKHJlc3VsdClcbiAgfSlcblxuICBpdChcInNob3VsZCByZXR1cm4gZW5jb2RpbmcgaW4gbG93ZXJjYXNlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0ZW1wRmlsZVBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFxuICAgICAgXCJUZXN0IGNvbnRlbnQgZm9yIGVuY29kaW5nIGRldGVjdGlvblwiLFxuICAgIClcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGluZmVyRW5jb2RpbmcoeyBwYXRoOiB0ZW1wRmlsZVBhdGggfSlcblxuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUocmVzdWx0LnRvTG93ZXJDYXNlKCkpXG4gICAgfVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBlbXB0eSBmaWxlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGVtcEZpbGVQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcIlwiKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJFbmNvZGluZyh7IHBhdGg6IHRlbXBGaWxlUGF0aCB9KVxuXG4gICAgZXhwZWN0KFt1bmRlZmluZWQsIFwidXRmLThcIiwgXCJ1dGY4XCIsIFwiYXNjaWlcIl0pLnRvQ29udGFpbihyZXN1bHQpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIGZpbGVzIHdpdGggc3BlY2lhbCBjaGFyYWN0ZXJzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0ZW1wRmlsZVBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiU3BlY2lhbDogw6ksIMOxLCDDvCwgw7YsIMOgXCIpXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbmZlckVuY29kaW5nKHsgcGF0aDogdGVtcEZpbGVQYXRoIH0pXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0JlRGVmaW5lZCgpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgZGV0ZWN0IGVuY29kaW5nIHdpdGggbG93IGNvbmZpZGVuY2UgdGhyZXNob2xkXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0ZW1wRmlsZVBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiU2ltcGxlIHRleHRcIilcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGluZmVyRW5jb2RpbmcoXG4gICAgICB7IHBhdGg6IHRlbXBGaWxlUGF0aCB9LFxuICAgICAge1xuICAgICAgICBjb25maWRlbmNlUGVyY2VudDogMzAsXG4gICAgICB9LFxuICAgIClcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmVEZWZpbmVkKClcbiAgfSlcbn0pXG4iXX0=
@@ -0,0 +1,3 @@
1
+ export declare function loadFile(path: string, options?: {
2
+ maxBytes?: number;
3
+ }): Promise<Buffer<ArrayBufferLike>>;
@@ -0,0 +1,7 @@
1
+ import { buffer } from "node:stream/consumers";
2
+ import { loadFileStream } from "../stream/index.js";
3
+ export async function loadFile(path, options) {
4
+ const stream = await loadFileStream(path, options);
5
+ return await buffer(stream);
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2ZpbGUvbG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBRW5ELE1BQU0sQ0FBQyxLQUFLLFVBQVUsUUFBUSxDQUFDLElBQVksRUFBRSxPQUErQjtJQUMxRSxNQUFNLE1BQU0sR0FBRyxNQUFNLGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDbEQsT0FBTyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSBcIm5vZGU6c3RyZWFtL2NvbnN1bWVyc1wiXG5pbXBvcnQgeyBsb2FkRmlsZVN0cmVhbSB9IGZyb20gXCIuLi9zdHJlYW0vaW5kZXgudHNcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEZpbGUocGF0aDogc3RyaW5nLCBvcHRpb25zPzogeyBtYXhCeXRlcz86IG51bWJlciB9KSB7XG4gIGNvbnN0IHN0cmVhbSA9IGF3YWl0IGxvYWRGaWxlU3RyZWFtKHBhdGgsIG9wdGlvbnMpXG4gIHJldHVybiBhd2FpdCBidWZmZXIoc3RyZWFtKVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export declare function isLocalPathExist(path: string): Promise<boolean>;
2
+ export declare function assertLocalPathVacant(path: string): Promise<void>;
@@ -0,0 +1,17 @@
1
+ import { access } from "node:fs/promises";
2
+ export async function isLocalPathExist(path) {
3
+ try {
4
+ await access(path);
5
+ return true;
6
+ }
7
+ catch (error) {
8
+ return false;
9
+ }
10
+ }
11
+ export async function assertLocalPathVacant(path) {
12
+ const isExist = await isLocalPathExist(path);
13
+ if (isExist) {
14
+ throw new Error(`Path "${path}" already exists`);
15
+ }
16
+ }
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2ZpbGUvcGF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFFekMsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxJQUFZO0lBQ2pELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2xCLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxxQkFBcUIsQ0FBQyxJQUFZO0lBQ3RELE1BQU0sT0FBTyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFNUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLGtCQUFrQixDQUFDLENBQUE7SUFDbEQsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhY2Nlc3MgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0xvY2FsUGF0aEV4aXN0KHBhdGg6IHN0cmluZykge1xuICB0cnkge1xuICAgIGF3YWl0IGFjY2VzcyhwYXRoKVxuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydExvY2FsUGF0aFZhY2FudChwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgaXNFeGlzdCA9IGF3YWl0IGlzTG9jYWxQYXRoRXhpc3QocGF0aClcblxuICBpZiAoaXNFeGlzdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCBcIiR7cGF0aH1cIiBhbHJlYWR5IGV4aXN0c2ApXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export declare function saveFile(path: string, buffer: Buffer, options?: {
2
+ overwrite?: boolean;
3
+ }): Promise<void>;
@@ -0,0 +1,7 @@
1
+ import { Readable } from "node:stream";
2
+ import { saveFileStream } from "../stream/index.js";
3
+ export async function saveFile(path, buffer, options) {
4
+ const { overwrite } = options ?? {};
5
+ await saveFileStream(Readable.from(buffer), { path, overwrite });
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2ZpbGUvc2F2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3RDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUVuRCxNQUFNLENBQUMsS0FBSyxVQUFVLFFBQVEsQ0FDNUIsSUFBWSxFQUNaLE1BQWMsRUFDZCxPQUFpQztJQUVqQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQTtJQUVuQyxNQUFNLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUE7QUFDbEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSBcIm5vZGU6c3RyZWFtXCJcbmltcG9ydCB7IHNhdmVGaWxlU3RyZWFtIH0gZnJvbSBcIi4uL3N0cmVhbS9pbmRleC50c1wiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlRmlsZShcbiAgcGF0aDogc3RyaW5nLFxuICBidWZmZXI6IEJ1ZmZlcixcbiAgb3B0aW9ucz86IHsgb3ZlcndyaXRlPzogYm9vbGVhbiB9LFxuKSB7XG4gIGNvbnN0IHsgb3ZlcndyaXRlIH0gPSBvcHRpb25zID8/IHt9XG5cbiAgYXdhaXQgc2F2ZUZpbGVTdHJlYW0oUmVhZGFibGUuZnJvbShidWZmZXIpLCB7IHBhdGgsIG92ZXJ3cml0ZSB9KVxufVxuIl19
@@ -0,0 +1,11 @@
1
+ import type { Buffer } from "node:buffer";
2
+ export declare function writeTempFile(content: string | Buffer, options?: {
3
+ persist?: boolean;
4
+ filename?: string;
5
+ format?: string;
6
+ }): Promise<string>;
7
+ export declare function getTempFilePath(options?: {
8
+ persist?: boolean;
9
+ filename?: string;
10
+ format?: string;
11
+ }): string;
@@ -0,0 +1,23 @@
1
+ import { unlinkSync } from "node:fs";
2
+ import { writeFile } from "node:fs/promises";
3
+ import exitHook from "exit-hook";
4
+ import { temporaryFile } from "tempy";
5
+ export async function writeTempFile(content, options) {
6
+ const path = getTempFilePath(options);
7
+ await writeFile(path, content);
8
+ return path;
9
+ }
10
+ export function getTempFilePath(options) {
11
+ const { filename, format } = options ?? {};
12
+ const path = temporaryFile(filename ? { name: filename } : { extension: format });
13
+ if (!options?.persist) {
14
+ exitHook(() => {
15
+ try {
16
+ unlinkSync(path);
17
+ }
18
+ catch { }
19
+ });
20
+ }
21
+ return path;
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2ZpbGUvdGVtcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUM1QyxPQUFPLFFBQVEsTUFBTSxXQUFXLENBQUE7QUFDaEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE9BQU8sQ0FBQTtBQUVyQyxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FDakMsT0FBd0IsRUFDeEIsT0FBbUU7SUFFbkUsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3JDLE1BQU0sU0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUM5QixPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFDLE9BSS9CO0lBQ0MsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFBO0lBRTFDLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FDeEIsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQ3RELENBQUE7SUFFRCxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3RCLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUM7Z0JBQ0gsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ2xCLENBQUM7WUFBQyxNQUFNLENBQUMsQ0FBQSxDQUFDO1FBQ1osQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCdWZmZXIgfSBmcm9tIFwibm9kZTpidWZmZXJcIlxuaW1wb3J0IHsgdW5saW5rU3luYyB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCBleGl0SG9vayBmcm9tIFwiZXhpdC1ob29rXCJcbmltcG9ydCB7IHRlbXBvcmFyeUZpbGUgfSBmcm9tIFwidGVtcHlcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVUZW1wRmlsZShcbiAgY29udGVudDogc3RyaW5nIHwgQnVmZmVyLFxuICBvcHRpb25zPzogeyBwZXJzaXN0PzogYm9vbGVhbjsgZmlsZW5hbWU/OiBzdHJpbmc7IGZvcm1hdD86IHN0cmluZyB9LFxuKSB7XG4gIGNvbnN0IHBhdGggPSBnZXRUZW1wRmlsZVBhdGgob3B0aW9ucylcbiAgYXdhaXQgd3JpdGVGaWxlKHBhdGgsIGNvbnRlbnQpXG4gIHJldHVybiBwYXRoXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW1wRmlsZVBhdGgob3B0aW9ucz86IHtcbiAgcGVyc2lzdD86IGJvb2xlYW5cbiAgZmlsZW5hbWU/OiBzdHJpbmdcbiAgZm9ybWF0Pzogc3RyaW5nXG59KSB7XG4gIGNvbnN0IHsgZmlsZW5hbWUsIGZvcm1hdCB9ID0gb3B0aW9ucyA/PyB7fVxuXG4gIGNvbnN0IHBhdGggPSB0ZW1wb3JhcnlGaWxlKFxuICAgIGZpbGVuYW1lID8geyBuYW1lOiBmaWxlbmFtZSB9IDogeyBleHRlbnNpb246IGZvcm1hdCB9LFxuICApXG5cbiAgaWYgKCFvcHRpb25zPy5wZXJzaXN0KSB7XG4gICAgZXhpdEhvb2soKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdW5saW5rU3luYyhwYXRoKVxuICAgICAgfSBjYXRjaCB7fVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gcGF0aFxufVxuIl19
@@ -0,0 +1,6 @@
1
+ import type { FileError } from "@frictionless-ts/metadata";
2
+ import type { Resource } from "@frictionless-ts/metadata";
3
+ export declare function validateFile(resource: Partial<Resource>): Promise<{
4
+ errors: FileError[];
5
+ valid: boolean;
6
+ }>;