@frictionless-ts/dataset 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/build/file/copy.d.ts +4 -0
- package/build/file/copy.js +7 -0
- package/build/file/copy.spec.d.ts +1 -0
- package/build/file/copy.spec.js +104 -0
- package/build/file/describe.d.ts +7 -0
- package/build/file/describe.js +9 -0
- package/build/file/fetch.d.ts +2 -0
- package/build/file/fetch.js +21 -0
- package/build/file/index.d.ts +9 -0
- package/build/file/index.js +10 -0
- package/build/file/infer.d.ts +10 -0
- package/build/file/infer.js +48 -0
- package/build/file/infer.spec.d.ts +1 -0
- package/build/file/infer.spec.js +141 -0
- package/build/file/load.d.ts +3 -0
- package/build/file/load.js +7 -0
- package/build/file/path.d.ts +2 -0
- package/build/file/path.js +17 -0
- package/build/file/save.d.ts +3 -0
- package/build/file/save.js +7 -0
- package/build/file/temp.d.ts +11 -0
- package/build/file/temp.js +23 -0
- package/build/file/validate.d.ts +6 -0
- package/build/file/validate.js +47 -0
- package/build/file/validate.spec.d.ts +1 -0
- package/build/file/validate.spec.js +180 -0
- package/build/folder/create.d.ts +1 -0
- package/build/folder/create.js +5 -0
- package/build/folder/index.d.ts +2 -0
- package/build/folder/index.js +3 -0
- package/build/folder/temp.d.ts +3 -0
- package/build/folder/temp.js +16 -0
- package/build/index.d.ts +36 -0
- package/build/index.js +35 -0
- package/build/package/index.d.ts +2 -0
- package/build/package/index.js +3 -0
- package/build/package/merge.d.ts +23 -0
- package/build/package/merge.js +12 -0
- package/build/package/path.d.ts +3 -0
- package/build/package/path.js +43 -0
- package/build/package/path.spec.d.ts +1 -0
- package/build/package/path.spec.js +56 -0
- package/build/plugin.d.ts +11 -0
- package/build/plugin.js +2 -0
- package/build/plugins/ckan/ckan/index.d.ts +1 -0
- package/build/plugins/ckan/ckan/index.js +2 -0
- package/build/plugins/ckan/ckan/request.d.ts +11 -0
- package/build/plugins/ckan/ckan/request.js +35 -0
- package/build/plugins/ckan/index.d.ts +4 -0
- package/build/plugins/ckan/index.js +5 -0
- package/build/plugins/ckan/package/Organization.d.ts +21 -0
- package/build/plugins/ckan/package/Organization.js +2 -0
- package/build/plugins/ckan/package/Package.d.ts +76 -0
- package/build/plugins/ckan/package/Package.js +2 -0
- package/build/plugins/ckan/package/Tag.d.ts +17 -0
- package/build/plugins/ckan/package/Tag.js +2 -0
- package/build/plugins/ckan/package/convert/fromCkan.d.ts +3 -0
- package/build/plugins/ckan/package/convert/fromCkan.js +63 -0
- package/build/plugins/ckan/package/convert/fromCkan.spec.d.ts +1 -0
- package/build/plugins/ckan/package/convert/fromCkan.spec.js +80 -0
- package/build/plugins/ckan/package/convert/toCkan.d.ts +22 -0
- package/build/plugins/ckan/package/convert/toCkan.js +51 -0
- package/build/plugins/ckan/package/convert/toCkan.spec.d.ts +1 -0
- package/build/plugins/ckan/package/convert/toCkan.spec.js +153 -0
- package/build/plugins/ckan/package/fixtures/ckan-package.json +308 -0
- package/build/plugins/ckan/package/index.d.ts +7 -0
- package/build/plugins/ckan/package/index.js +5 -0
- package/build/plugins/ckan/package/load.d.ts +21 -0
- package/build/plugins/ckan/package/load.js +74 -0
- package/build/plugins/ckan/package/load.spec.d.ts +1 -0
- package/build/plugins/ckan/package/load.spec.js +11 -0
- package/build/plugins/ckan/package/save.d.ts +10 -0
- package/build/plugins/ckan/package/save.js +83 -0
- package/build/plugins/ckan/package/save.spec.d.ts +1 -0
- package/build/plugins/ckan/package/save.spec.js +319 -0
- package/build/plugins/ckan/plugin.d.ts +19 -0
- package/build/plugins/ckan/plugin.js +18 -0
- package/build/plugins/ckan/plugin.spec.d.ts +1 -0
- package/build/plugins/ckan/plugin.spec.js +83 -0
- package/build/plugins/ckan/resource/Resource.d.ts +56 -0
- package/build/plugins/ckan/resource/Resource.js +2 -0
- package/build/plugins/ckan/resource/convert/fromCkan.d.ts +3 -0
- package/build/plugins/ckan/resource/convert/fromCkan.js +39 -0
- package/build/plugins/ckan/resource/convert/toCkan.d.ts +3 -0
- package/build/plugins/ckan/resource/convert/toCkan.js +20 -0
- package/build/plugins/ckan/resource/index.d.ts +3 -0
- package/build/plugins/ckan/resource/index.js +3 -0
- package/build/plugins/ckan/schema/Field.d.ts +34 -0
- package/build/plugins/ckan/schema/Field.js +2 -0
- package/build/plugins/ckan/schema/Schema.d.ts +10 -0
- package/build/plugins/ckan/schema/Schema.js +2 -0
- package/build/plugins/ckan/schema/convert/fixtures/ckan-schema.json +115 -0
- package/build/plugins/ckan/schema/convert/fromCkan.d.ts +3 -0
- package/build/plugins/ckan/schema/convert/fromCkan.js +47 -0
- package/build/plugins/ckan/schema/convert/fromCkan.spec.d.ts +1 -0
- package/build/plugins/ckan/schema/convert/fromCkan.spec.js +157 -0
- package/build/plugins/ckan/schema/convert/toCkan.d.ts +3 -0
- package/build/plugins/ckan/schema/convert/toCkan.js +50 -0
- package/build/plugins/ckan/schema/convert/toCkan.spec.d.ts +1 -0
- package/build/plugins/ckan/schema/convert/toCkan.spec.js +278 -0
- package/build/plugins/ckan/schema/index.d.ts +4 -0
- package/build/plugins/ckan/schema/index.js +3 -0
- package/build/plugins/datahub/index.d.ts +2 -0
- package/build/plugins/datahub/index.js +3 -0
- package/build/plugins/datahub/package/index.d.ts +1 -0
- package/build/plugins/datahub/package/index.js +2 -0
- package/build/plugins/datahub/package/load.d.ts +1 -0
- package/build/plugins/datahub/package/load.js +9 -0
- package/build/plugins/datahub/package/load.spec.d.ts +1 -0
- package/build/plugins/datahub/package/load.spec.js +11 -0
- package/build/plugins/datahub/plugin.d.ts +4 -0
- package/build/plugins/datahub/plugin.js +18 -0
- package/build/plugins/datahub/plugin.spec.d.ts +1 -0
- package/build/plugins/datahub/plugin.spec.js +78 -0
- package/build/plugins/descriptor/index.d.ts +1 -0
- package/build/plugins/descriptor/index.js +2 -0
- package/build/plugins/descriptor/plugin.d.ts +11 -0
- package/build/plugins/descriptor/plugin.js +29 -0
- package/build/plugins/descriptor/plugin.spec.d.ts +1 -0
- package/build/plugins/descriptor/plugin.spec.js +169 -0
- package/build/plugins/folder/index.d.ts +2 -0
- package/build/plugins/folder/index.js +3 -0
- package/build/plugins/folder/package/index.d.ts +2 -0
- package/build/plugins/folder/package/index.js +3 -0
- package/build/plugins/folder/package/load.d.ts +1 -0
- package/build/plugins/folder/package/load.js +6 -0
- package/build/plugins/folder/package/load.spec.d.ts +1 -0
- package/build/plugins/folder/package/load.spec.js +175 -0
- package/build/plugins/folder/package/save.d.ts +7 -0
- package/build/plugins/folder/package/save.js +35 -0
- package/build/plugins/folder/package/save.spec.d.ts +1 -0
- package/build/plugins/folder/package/save.spec.js +328 -0
- package/build/plugins/folder/plugin.d.ts +4 -0
- package/build/plugins/folder/plugin.js +19 -0
- package/build/plugins/folder/plugin.spec.d.ts +1 -0
- package/build/plugins/folder/plugin.spec.js +53 -0
- package/build/plugins/github/github/index.d.ts +1 -0
- package/build/plugins/github/github/index.js +2 -0
- package/build/plugins/github/github/path.d.ts +1 -0
- package/build/plugins/github/github/path.js +4 -0
- package/build/plugins/github/github/request.d.ts +15 -0
- package/build/plugins/github/github/request.js +43 -0
- package/build/plugins/github/index.d.ts +3 -0
- package/build/plugins/github/index.js +4 -0
- package/build/plugins/github/package/License.d.ts +21 -0
- package/build/plugins/github/package/License.js +2 -0
- package/build/plugins/github/package/Owner.d.ts +25 -0
- package/build/plugins/github/package/Owner.js +2 -0
- package/build/plugins/github/package/Package.d.ts +87 -0
- package/build/plugins/github/package/Package.js +2 -0
- package/build/plugins/github/package/convert/fromGithub.d.ts +3 -0
- package/build/plugins/github/package/convert/fromGithub.js +50 -0
- package/build/plugins/github/package/index.d.ts +6 -0
- package/build/plugins/github/package/index.js +4 -0
- package/build/plugins/github/package/load.d.ts +23 -0
- package/build/plugins/github/package/load.js +48 -0
- package/build/plugins/github/package/load.spec.d.ts +1 -0
- package/build/plugins/github/package/load.spec.js +15 -0
- package/build/plugins/github/package/save.d.ts +14 -0
- package/build/plugins/github/package/save.js +69 -0
- package/build/plugins/github/package/save.spec.d.ts +1 -0
- package/build/plugins/github/package/save.spec.js +566 -0
- package/build/plugins/github/plugin.d.ts +19 -0
- package/build/plugins/github/plugin.js +18 -0
- package/build/plugins/github/plugin.spec.d.ts +1 -0
- package/build/plugins/github/plugin.spec.js +73 -0
- package/build/plugins/github/resource/Resource.d.ts +29 -0
- package/build/plugins/github/resource/Resource.js +2 -0
- package/build/plugins/github/resource/convert/fromGithub.d.ts +5 -0
- package/build/plugins/github/resource/convert/fromGithub.js +24 -0
- package/build/plugins/github/resource/convert/toGithub.d.ts +3 -0
- package/build/plugins/github/resource/convert/toGithub.js +10 -0
- package/build/plugins/github/resource/index.d.ts +3 -0
- package/build/plugins/github/resource/index.js +3 -0
- package/build/plugins/zenodo/index.d.ts +3 -0
- package/build/plugins/zenodo/index.js +4 -0
- package/build/plugins/zenodo/package/Creator.d.ts +20 -0
- package/build/plugins/zenodo/package/Creator.js +2 -0
- package/build/plugins/zenodo/package/Package.d.ts +94 -0
- package/build/plugins/zenodo/package/Package.js +2 -0
- package/build/plugins/zenodo/package/convert/fromZenodo.d.ts +3 -0
- package/build/plugins/zenodo/package/convert/fromZenodo.js +43 -0
- package/build/plugins/zenodo/package/convert/toZenodo.d.ts +3 -0
- package/build/plugins/zenodo/package/convert/toZenodo.js +79 -0
- package/build/plugins/zenodo/package/index.d.ts +6 -0
- package/build/plugins/zenodo/package/index.js +5 -0
- package/build/plugins/zenodo/package/load.d.ts +23 -0
- package/build/plugins/zenodo/package/load.js +45 -0
- package/build/plugins/zenodo/package/load.spec.d.ts +1 -0
- package/build/plugins/zenodo/package/load.spec.js +15 -0
- package/build/plugins/zenodo/package/save.d.ts +13 -0
- package/build/plugins/zenodo/package/save.js +74 -0
- package/build/plugins/zenodo/package/save.spec.d.ts +1 -0
- package/build/plugins/zenodo/package/save.spec.js +524 -0
- package/build/plugins/zenodo/plugin.d.ts +19 -0
- package/build/plugins/zenodo/plugin.js +18 -0
- package/build/plugins/zenodo/plugin.spec.d.ts +1 -0
- package/build/plugins/zenodo/plugin.spec.js +78 -0
- package/build/plugins/zenodo/resource/Resource.d.ts +27 -0
- package/build/plugins/zenodo/resource/Resource.js +2 -0
- package/build/plugins/zenodo/resource/convert/fromZenodo.d.ts +10 -0
- package/build/plugins/zenodo/resource/convert/fromZenodo.js +18 -0
- package/build/plugins/zenodo/resource/convert/toZenodo.d.ts +3 -0
- package/build/plugins/zenodo/resource/convert/toZenodo.js +13 -0
- package/build/plugins/zenodo/resource/index.d.ts +3 -0
- package/build/plugins/zenodo/resource/index.js +3 -0
- package/build/plugins/zenodo/zenodo/index.d.ts +1 -0
- package/build/plugins/zenodo/zenodo/index.js +2 -0
- package/build/plugins/zenodo/zenodo/request.d.ts +12 -0
- package/build/plugins/zenodo/zenodo/request.js +36 -0
- package/build/plugins/zip/index.d.ts +2 -0
- package/build/plugins/zip/index.js +3 -0
- package/build/plugins/zip/package/index.d.ts +2 -0
- package/build/plugins/zip/package/index.js +3 -0
- package/build/plugins/zip/package/load.d.ts +1 -0
- package/build/plugins/zip/package/load.js +30 -0
- package/build/plugins/zip/package/load.spec.d.ts +1 -0
- package/build/plugins/zip/package/load.spec.js +173 -0
- package/build/plugins/zip/package/save.d.ts +5 -0
- package/build/plugins/zip/package/save.js +50 -0
- package/build/plugins/zip/package/save.spec.d.ts +1 -0
- package/build/plugins/zip/package/save.spec.js +287 -0
- package/build/plugins/zip/plugin.d.ts +11 -0
- package/build/plugins/zip/plugin.js +24 -0
- package/build/plugins/zip/plugin.spec.d.ts +1 -0
- package/build/plugins/zip/plugin.spec.js +158 -0
- package/build/resource/index.d.ts +1 -0
- package/build/resource/index.js +2 -0
- package/build/resource/save.d.ts +13 -0
- package/build/resource/save.js +53 -0
- package/build/resource/save.spec.d.ts +1 -0
- package/build/resource/save.spec.js +107 -0
- package/build/stream/concat.d.ts +3 -0
- package/build/stream/concat.js +5 -0
- package/build/stream/index.d.ts +3 -0
- package/build/stream/index.js +4 -0
- package/build/stream/load.d.ts +5 -0
- package/build/stream/load.js +46 -0
- package/build/stream/save.d.ts +5 -0
- package/build/stream/save.js +13 -0
- package/package.json +48 -0
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,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,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,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,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,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,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
|