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