livemark 0.2.0
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/descriptor/index.d.ts +3 -0
- package/build/descriptor/index.js +4 -0
- package/build/descriptor/load.d.ts +8 -0
- package/build/descriptor/load.js +40 -0
- package/build/descriptor/node.d.ts +125 -0
- package/build/descriptor/node.js +9 -0
- package/build/descriptor/save.d.ts +8 -0
- package/build/descriptor/save.js +17 -0
- package/build/descriptor/save.spec.d.ts +1 -0
- package/build/descriptor/save.spec.js +80 -0
- package/build/descriptor/validate.d.ts +9 -0
- package/build/descriptor/validate.js +14 -0
- package/build/descriptor/validate.spec.d.ts +1 -0
- package/build/descriptor/validate.spec.js +124 -0
- package/build/dialect/Dialect.d.ts +88 -0
- package/build/dialect/Dialect.js +2 -0
- package/build/dialect/index.d.ts +3 -0
- package/build/dialect/index.js +3 -0
- package/build/dialect/load.d.ts +4 -0
- package/build/dialect/load.js +7 -0
- package/build/dialect/save.d.ts +9 -0
- package/build/dialect/save.js +13 -0
- package/build/dialect/validate.d.ts +1 -0
- package/build/dialect/validate.js +4 -0
- package/build/index.d.ts +4 -0
- package/build/index.js +5 -0
- package/build/metadata/index.d.ts +3 -0
- package/build/metadata/index.js +4 -0
- package/build/metadata/load.d.ts +10 -0
- package/build/metadata/load.js +55 -0
- package/build/metadata/node.d.ts +125 -0
- package/build/metadata/node.js +9 -0
- package/build/metadata/save.d.ts +8 -0
- package/build/metadata/save.js +17 -0
- package/build/metadata/save.spec.d.ts +1 -0
- package/build/metadata/save.spec.js +80 -0
- package/build/metadata/validate.d.ts +9 -0
- package/build/metadata/validate.js +14 -0
- package/build/metadata/validate.spec.d.ts +1 -0
- package/build/metadata/validate.spec.js +124 -0
- package/build/package/Contributor.d.ts +21 -0
- package/build/package/Contributor.js +2 -0
- package/build/package/Package.d.ts +65 -0
- package/build/package/Package.js +2 -0
- package/build/package/index.d.ts +4 -0
- package/build/package/index.js +3 -0
- package/build/package/load.d.ts +4 -0
- package/build/package/load.js +7 -0
- package/build/package/save.d.ts +9 -0
- package/build/package/save.js +13 -0
- package/build/package/validate.d.ts +1 -0
- package/build/package/validate.js +4 -0
- package/build/resource/License.d.ts +18 -0
- package/build/resource/License.js +2 -0
- package/build/resource/Resource.d.ts +67 -0
- package/build/resource/Resource.js +2 -0
- package/build/resource/Source.d.ts +17 -0
- package/build/resource/Source.js +2 -0
- package/build/resource/index.d.ts +5 -0
- package/build/resource/index.js +2 -0
- package/build/resource/load.d.ts +1 -0
- package/build/resource/load.js +2 -0
- package/build/resource/save.d.ts +9 -0
- package/build/resource/save.js +13 -0
- package/build/resource/types/index.d.ts +1 -0
- package/build/resource/types/index.js +2 -0
- package/build/resource/types/table.d.ts +29 -0
- package/build/resource/types/table.js +2 -0
- package/build/resource/validate.d.ts +1 -0
- package/build/resource/validate.js +4 -0
- package/build/schema/Field.d.ts +5 -0
- package/build/schema/Field.js +2 -0
- package/build/schema/Schema.d.ts +55 -0
- package/build/schema/Schema.js +2 -0
- package/build/schema/fields/any.d.ts +20 -0
- package/build/schema/fields/any.js +2 -0
- package/build/schema/fields/array.d.ts +32 -0
- package/build/schema/fields/array.js +2 -0
- package/build/schema/fields/base.d.ts +42 -0
- package/build/schema/fields/base.js +2 -0
- package/build/schema/fields/boolean.d.ts +28 -0
- package/build/schema/fields/boolean.js +2 -0
- package/build/schema/fields/date.d.ts +35 -0
- package/build/schema/fields/date.js +2 -0
- package/build/schema/fields/datetime.d.ts +35 -0
- package/build/schema/fields/datetime.js +2 -0
- package/build/schema/fields/duration.d.ts +28 -0
- package/build/schema/fields/duration.js +2 -0
- package/build/schema/fields/geojson.d.ts +26 -0
- package/build/schema/fields/geojson.js +2 -0
- package/build/schema/fields/geopoint.d.ts +27 -0
- package/build/schema/fields/geopoint.js +2 -0
- package/build/schema/fields/index.d.ts +16 -0
- package/build/schema/fields/index.js +17 -0
- package/build/schema/fields/integer.d.ts +37 -0
- package/build/schema/fields/integer.js +2 -0
- package/build/schema/fields/list.d.ts +36 -0
- package/build/schema/fields/list.js +2 -0
- package/build/schema/fields/number.d.ts +40 -0
- package/build/schema/fields/number.js +2 -0
- package/build/schema/fields/object.d.ts +32 -0
- package/build/schema/fields/object.js +2 -0
- package/build/schema/fields/string.d.ts +40 -0
- package/build/schema/fields/string.js +2 -0
- package/build/schema/fields/time.d.ts +35 -0
- package/build/schema/fields/time.js +2 -0
- package/build/schema/fields/year.d.ts +28 -0
- package/build/schema/fields/year.js +2 -0
- package/build/schema/fields/yearmonth.d.ts +28 -0
- package/build/schema/fields/yearmonth.js +2 -0
- package/build/schema/index.d.ts +4 -0
- package/build/schema/index.js +2 -0
- package/build/schema/load.d.ts +1 -0
- package/build/schema/load.js +2 -0
- package/build/schema/save.d.ts +9 -0
- package/build/schema/save.js +13 -0
- package/build/schema/validate.d.ts +1 -0
- package/build/schema/validate.js +4 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/index.ts +0 -0
- package/package.json +21 -0
- package/tsconfig.json +10 -0
- package/typedoc.json +4 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { saveDescriptor } from "../descriptor/save.js";
|
|
2
|
+
/**
|
|
3
|
+
* Save a Dialect to a file path
|
|
4
|
+
* Works in Node.js environments
|
|
5
|
+
*/
|
|
6
|
+
export async function saveDialect(props) {
|
|
7
|
+
const { dialect, path } = props;
|
|
8
|
+
return saveDescriptor({
|
|
9
|
+
descriptor: dialect,
|
|
10
|
+
path,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2RpYWxlY3Qvc2F2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFHdEQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQUMsS0FBeUM7SUFDekUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUE7SUFFL0IsT0FBTyxjQUFjLENBQUM7UUFDcEIsVUFBVSxFQUFFLE9BQU87UUFDbkIsSUFBSTtLQUNMLENBQUMsQ0FBQTtBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzYXZlRGVzY3JpcHRvciB9IGZyb20gXCIuLi9kZXNjcmlwdG9yL3NhdmUuanNcIlxuaW1wb3J0IHR5cGUgeyBEaWFsZWN0IH0gZnJvbSBcIi4vRGlhbGVjdC5qc1wiXG5cbi8qKlxuICogU2F2ZSBhIERpYWxlY3QgdG8gYSBmaWxlIHBhdGhcbiAqIFdvcmtzIGluIE5vZGUuanMgZW52aXJvbm1lbnRzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlRGlhbGVjdChwcm9wczogeyBkaWFsZWN0OiBEaWFsZWN0OyBwYXRoOiBzdHJpbmcgfSkge1xuICBjb25zdCB7IGRpYWxlY3QsIHBhdGggfSA9IHByb3BzXG5cbiAgcmV0dXJuIHNhdmVEZXNjcmlwdG9yKHtcbiAgICBkZXNjcmlwdG9yOiBkaWFsZWN0LFxuICAgIHBhdGgsXG4gIH0pXG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function validateDialect(dialect: string): Promise<string>;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export async function validateDialect(dialect) {
|
|
2
|
+
return dialect;
|
|
3
|
+
}
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9kaWFsZWN0L3ZhbGlkYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUFDLE9BQWU7SUFDbkQsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZURpYWxlY3QoZGlhbGVjdDogc3RyaW5nKSB7XG4gIHJldHVybiBkaWFsZWN0XG59XG4iXX0=
|
package/build/index.d.ts
ADDED
package/build/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from "./dialect/index.js";
|
|
2
|
+
export * from "./package/index.js";
|
|
3
|
+
export * from "./resource/index.js";
|
|
4
|
+
export * from "./schema/index.js";
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG9CQUFvQixDQUFBO0FBQ2xDLGNBQWMsb0JBQW9CLENBQUE7QUFDbEMsY0FBYyxxQkFBcUIsQ0FBQTtBQUNuQyxjQUFjLG1CQUFtQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vZGlhbGVjdC9pbmRleC5qc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9wYWNrYWdlL2luZGV4LmpzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3Jlc291cmNlL2luZGV4LmpzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3NjaGVtYS9pbmRleC5qc1wiXG4iXX0=
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { loadMetadata } from "./load.js";
|
|
2
|
+
export { saveMetadata } from "./save.js";
|
|
3
|
+
export { validateMetadata } from "./validate.js";
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9tZXRhZGF0YS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDeEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgbG9hZE1ldGFkYXRhIH0gZnJvbSBcIi4vbG9hZC5qc1wiXG5leHBvcnQgeyBzYXZlTWV0YWRhdGEgfSBmcm9tIFwiLi9zYXZlLmpzXCJcbmV4cG9ydCB7IHZhbGlkYXRlTWV0YWRhdGEgfSBmcm9tIFwiLi92YWxpZGF0ZS5qc1wiXG4iXX0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Load a metadata (JSON Object) from a file or URL
|
|
3
|
+
* Uses dynamic imports to work in both Node.js and browser environments
|
|
4
|
+
* Supports HTTP, HTTPS, FTP, and FTPS protocols
|
|
5
|
+
*
|
|
6
|
+
* @param props Object containing the path to the metadata
|
|
7
|
+
*/
|
|
8
|
+
export declare function loadMetadata(props: {
|
|
9
|
+
path: string;
|
|
10
|
+
}): Promise<Record<string, any>>;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Load a metadata (JSON Object) from a file or URL
|
|
3
|
+
* Uses dynamic imports to work in both Node.js and browser environments
|
|
4
|
+
* Supports HTTP, HTTPS, FTP, and FTPS protocols
|
|
5
|
+
*
|
|
6
|
+
* @param props Object containing the path to the metadata
|
|
7
|
+
*/
|
|
8
|
+
export async function loadMetadata(props) {
|
|
9
|
+
const { path } = props;
|
|
10
|
+
let isUrl = false;
|
|
11
|
+
try {
|
|
12
|
+
new URL(path);
|
|
13
|
+
isUrl = true;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
isUrl = false;
|
|
17
|
+
}
|
|
18
|
+
return isUrl
|
|
19
|
+
? await loadRemoteMetadata(props)
|
|
20
|
+
: await loadLocalMetadata(props);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Load a metadata (JSON Object) from a remote URL
|
|
24
|
+
* Supports HTTP, HTTPS, FTP, and FTPS protocols
|
|
25
|
+
*
|
|
26
|
+
* @param props Object containing the remote URL path
|
|
27
|
+
*/
|
|
28
|
+
async function loadRemoteMetadata(props) {
|
|
29
|
+
const { path } = props;
|
|
30
|
+
const url = new URL(path);
|
|
31
|
+
const protocol = url.protocol.toLowerCase();
|
|
32
|
+
if (!["http:", "https:", "ftp:", "ftps:"].includes(protocol)) {
|
|
33
|
+
throw new Error(`Unsupported URL protocol: ${protocol}`);
|
|
34
|
+
}
|
|
35
|
+
const response = await fetch(path);
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
throw new Error(`Failed to load metadata from URL: ${path}, status: ${response.status}`);
|
|
38
|
+
}
|
|
39
|
+
const data = (await response.json());
|
|
40
|
+
return data;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Load a metadata (JSON Object) from a local file
|
|
44
|
+
* Works in Node.js environments only
|
|
45
|
+
*
|
|
46
|
+
* @param props Object containing the file path
|
|
47
|
+
*/
|
|
48
|
+
async function loadLocalMetadata(props) {
|
|
49
|
+
const { path } = props;
|
|
50
|
+
const fs = await import("node:fs/promises");
|
|
51
|
+
await fs.access(path, fs.constants.R_OK);
|
|
52
|
+
const content = await fs.readFile(path, "utf-8");
|
|
53
|
+
return JSON.parse(content);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL21ldGFkYXRhL2xvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBQUMsS0FBdUI7SUFDeEQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUV0QixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUE7SUFDakIsSUFBSSxDQUFDO1FBQ0gsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDYixLQUFLLEdBQUcsSUFBSSxDQUFBO0lBQ2QsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLEtBQUssR0FBRyxLQUFLLENBQUE7SUFDZixDQUFDO0lBRUQsT0FBTyxLQUFLO1FBQ1YsQ0FBQyxDQUFDLE1BQU0sa0JBQWtCLENBQUMsS0FBSyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxNQUFNLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ3BDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxLQUF1QjtJQUN2RCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFBO0lBRXRCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3pCLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUE7SUFFM0MsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDN0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUMxRCxDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNqQixNQUFNLElBQUksS0FBSyxDQUNiLHFDQUFxQyxJQUFJLGFBQWEsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUN4RSxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQXdCLENBQUE7SUFDM0QsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxLQUFLLFVBQVUsaUJBQWlCLENBQUMsS0FBdUI7SUFDdEQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUV0QixNQUFNLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO0lBQzNDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUV4QyxNQUFNLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ2hELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQXdCLENBQUE7QUFDbkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTG9hZCBhIG1ldGFkYXRhIChKU09OIE9iamVjdCkgZnJvbSBhIGZpbGUgb3IgVVJMXG4gKiBVc2VzIGR5bmFtaWMgaW1wb3J0cyB0byB3b3JrIGluIGJvdGggTm9kZS5qcyBhbmQgYnJvd3NlciBlbnZpcm9ubWVudHNcbiAqIFN1cHBvcnRzIEhUVFAsIEhUVFBTLCBGVFAsIGFuZCBGVFBTIHByb3RvY29sc1xuICpcbiAqIEBwYXJhbSBwcm9wcyBPYmplY3QgY29udGFpbmluZyB0aGUgcGF0aCB0byB0aGUgbWV0YWRhdGFcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRNZXRhZGF0YShwcm9wczogeyBwYXRoOiBzdHJpbmcgfSkge1xuICBjb25zdCB7IHBhdGggfSA9IHByb3BzXG5cbiAgbGV0IGlzVXJsID0gZmFsc2VcbiAgdHJ5IHtcbiAgICBuZXcgVVJMKHBhdGgpXG4gICAgaXNVcmwgPSB0cnVlXG4gIH0gY2F0Y2gge1xuICAgIGlzVXJsID0gZmFsc2VcbiAgfVxuXG4gIHJldHVybiBpc1VybFxuICAgID8gYXdhaXQgbG9hZFJlbW90ZU1ldGFkYXRhKHByb3BzKVxuICAgIDogYXdhaXQgbG9hZExvY2FsTWV0YWRhdGEocHJvcHMpXG59XG5cbi8qKlxuICogTG9hZCBhIG1ldGFkYXRhIChKU09OIE9iamVjdCkgZnJvbSBhIHJlbW90ZSBVUkxcbiAqIFN1cHBvcnRzIEhUVFAsIEhUVFBTLCBGVFAsIGFuZCBGVFBTIHByb3RvY29sc1xuICpcbiAqIEBwYXJhbSBwcm9wcyBPYmplY3QgY29udGFpbmluZyB0aGUgcmVtb3RlIFVSTCBwYXRoXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvYWRSZW1vdGVNZXRhZGF0YShwcm9wczogeyBwYXRoOiBzdHJpbmcgfSkge1xuICBjb25zdCB7IHBhdGggfSA9IHByb3BzXG5cbiAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoKVxuICBjb25zdCBwcm90b2NvbCA9IHVybC5wcm90b2NvbC50b0xvd2VyQ2FzZSgpXG5cbiAgaWYgKCFbXCJodHRwOlwiLCBcImh0dHBzOlwiLCBcImZ0cDpcIiwgXCJmdHBzOlwiXS5pbmNsdWRlcyhwcm90b2NvbCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIFVSTCBwcm90b2NvbDogJHtwcm90b2NvbH1gKVxuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChwYXRoKVxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBsb2FkIG1ldGFkYXRhIGZyb20gVVJMOiAke3BhdGh9LCBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWAsXG4gICAgKVxuICB9XG5cbiAgY29uc3QgZGF0YSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgcmV0dXJuIGRhdGFcbn1cblxuLyoqXG4gKiBMb2FkIGEgbWV0YWRhdGEgKEpTT04gT2JqZWN0KSBmcm9tIGEgbG9jYWwgZmlsZVxuICogV29ya3MgaW4gTm9kZS5qcyBlbnZpcm9ubWVudHMgb25seVxuICpcbiAqIEBwYXJhbSBwcm9wcyBPYmplY3QgY29udGFpbmluZyB0aGUgZmlsZSBwYXRoXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvYWRMb2NhbE1ldGFkYXRhKHByb3BzOiB7IHBhdGg6IHN0cmluZyB9KSB7XG4gIGNvbnN0IHsgcGF0aCB9ID0gcHJvcHNcblxuICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIilcbiAgYXdhaXQgZnMuYWNjZXNzKHBhdGgsIGZzLmNvbnN0YW50cy5SX09LKVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLCBcInV0Zi04XCIpXG4gIHJldHVybiBKU09OLnBhcnNlKGNvbnRlbnQpIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbn1cbiJdfQ==
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
export declare function loadNodeApis(): Promise<{
|
|
2
|
+
fs: {
|
|
3
|
+
default: typeof import("node:fs/promises");
|
|
4
|
+
access(path: import("fs").PathLike, mode?: number): Promise<void>;
|
|
5
|
+
copyFile(src: import("fs").PathLike, dest: import("fs").PathLike, mode?: number): Promise<void>;
|
|
6
|
+
open(path: import("fs").PathLike, flags?: string | number, mode?: import("fs").Mode): Promise<import("fs/promises").FileHandle>;
|
|
7
|
+
rename(oldPath: import("fs").PathLike, newPath: import("fs").PathLike): Promise<void>;
|
|
8
|
+
truncate(path: import("fs").PathLike, len?: number): Promise<void>;
|
|
9
|
+
rmdir(path: import("fs").PathLike, options?: import("fs").RmDirOptions): Promise<void>;
|
|
10
|
+
rm(path: import("fs").PathLike, options?: import("fs").RmOptions): Promise<void>;
|
|
11
|
+
mkdir(path: import("fs").PathLike, options: import("fs").MakeDirectoryOptions & {
|
|
12
|
+
recursive: true;
|
|
13
|
+
}): Promise<string | undefined>;
|
|
14
|
+
mkdir(path: import("fs").PathLike, options?: import("fs").Mode | (import("fs").MakeDirectoryOptions & {
|
|
15
|
+
recursive?: false | undefined;
|
|
16
|
+
}) | null): Promise<void>;
|
|
17
|
+
mkdir(path: import("fs").PathLike, options?: import("fs").Mode | import("fs").MakeDirectoryOptions | null): Promise<string | undefined>;
|
|
18
|
+
readdir(path: import("fs").PathLike, options?: (import("fs").ObjectEncodingOptions & {
|
|
19
|
+
withFileTypes?: false | undefined;
|
|
20
|
+
recursive?: boolean | undefined;
|
|
21
|
+
}) | BufferEncoding | null): Promise<string[]>;
|
|
22
|
+
readdir(path: import("fs").PathLike, options: {
|
|
23
|
+
encoding: "buffer";
|
|
24
|
+
withFileTypes?: false | undefined;
|
|
25
|
+
recursive?: boolean | undefined;
|
|
26
|
+
} | "buffer"): Promise<Buffer[]>;
|
|
27
|
+
readdir(path: import("fs").PathLike, options?: (import("fs").ObjectEncodingOptions & {
|
|
28
|
+
withFileTypes?: false | undefined;
|
|
29
|
+
recursive?: boolean | undefined;
|
|
30
|
+
}) | BufferEncoding | null): Promise<string[] | Buffer[]>;
|
|
31
|
+
readdir(path: import("fs").PathLike, options: import("fs").ObjectEncodingOptions & {
|
|
32
|
+
withFileTypes: true;
|
|
33
|
+
recursive?: boolean | undefined;
|
|
34
|
+
}): Promise<import("fs").Dirent[]>;
|
|
35
|
+
readlink(path: import("fs").PathLike, options?: import("fs").ObjectEncodingOptions | BufferEncoding | null): Promise<string>;
|
|
36
|
+
readlink(path: import("fs").PathLike, options: import("fs").BufferEncodingOption): Promise<Buffer>;
|
|
37
|
+
readlink(path: import("fs").PathLike, options?: import("fs").ObjectEncodingOptions | string | null): Promise<string | Buffer>;
|
|
38
|
+
symlink(target: import("fs").PathLike, path: import("fs").PathLike, type?: string | null): Promise<void>;
|
|
39
|
+
lstat(path: import("fs").PathLike, opts?: import("fs").StatOptions & {
|
|
40
|
+
bigint?: false | undefined;
|
|
41
|
+
}): Promise<import("fs").Stats>;
|
|
42
|
+
lstat(path: import("fs").PathLike, opts: import("fs").StatOptions & {
|
|
43
|
+
bigint: true;
|
|
44
|
+
}): Promise<import("fs").BigIntStats>;
|
|
45
|
+
lstat(path: import("fs").PathLike, opts?: import("fs").StatOptions): Promise<import("fs").Stats | import("fs").BigIntStats>;
|
|
46
|
+
stat(path: import("fs").PathLike, opts?: import("fs").StatOptions & {
|
|
47
|
+
bigint?: false | undefined;
|
|
48
|
+
}): Promise<import("fs").Stats>;
|
|
49
|
+
stat(path: import("fs").PathLike, opts: import("fs").StatOptions & {
|
|
50
|
+
bigint: true;
|
|
51
|
+
}): Promise<import("fs").BigIntStats>;
|
|
52
|
+
stat(path: import("fs").PathLike, opts?: import("fs").StatOptions): Promise<import("fs").Stats | import("fs").BigIntStats>;
|
|
53
|
+
statfs(path: import("fs").PathLike, opts?: import("fs").StatFsOptions & {
|
|
54
|
+
bigint?: false | undefined;
|
|
55
|
+
}): Promise<import("fs").StatsFs>;
|
|
56
|
+
statfs(path: import("fs").PathLike, opts: import("fs").StatFsOptions & {
|
|
57
|
+
bigint: true;
|
|
58
|
+
}): Promise<import("fs").BigIntStatsFs>;
|
|
59
|
+
statfs(path: import("fs").PathLike, opts?: import("fs").StatFsOptions): Promise<import("fs").StatsFs | import("fs").BigIntStatsFs>;
|
|
60
|
+
link(existingPath: import("fs").PathLike, newPath: import("fs").PathLike): Promise<void>;
|
|
61
|
+
unlink(path: import("fs").PathLike): Promise<void>;
|
|
62
|
+
chmod(path: import("fs").PathLike, mode: import("fs").Mode): Promise<void>;
|
|
63
|
+
lchmod(path: import("fs").PathLike, mode: import("fs").Mode): Promise<void>;
|
|
64
|
+
lchown(path: import("fs").PathLike, uid: number, gid: number): Promise<void>;
|
|
65
|
+
lutimes(path: import("fs").PathLike, atime: import("fs").TimeLike, mtime: import("fs").TimeLike): Promise<void>;
|
|
66
|
+
chown(path: import("fs").PathLike, uid: number, gid: number): Promise<void>;
|
|
67
|
+
utimes(path: import("fs").PathLike, atime: import("fs").TimeLike, mtime: import("fs").TimeLike): Promise<void>;
|
|
68
|
+
realpath(path: import("fs").PathLike, options?: import("fs").ObjectEncodingOptions | BufferEncoding | null): Promise<string>;
|
|
69
|
+
realpath(path: import("fs").PathLike, options: import("fs").BufferEncodingOption): Promise<Buffer>;
|
|
70
|
+
realpath(path: import("fs").PathLike, options?: import("fs").ObjectEncodingOptions | BufferEncoding | null): Promise<string | Buffer>;
|
|
71
|
+
mkdtemp(prefix: string, options?: import("fs").ObjectEncodingOptions | BufferEncoding | null): Promise<string>;
|
|
72
|
+
mkdtemp(prefix: string, options: import("fs").BufferEncodingOption): Promise<Buffer>;
|
|
73
|
+
mkdtemp(prefix: string, options?: import("fs").ObjectEncodingOptions | BufferEncoding | null): Promise<string | Buffer>;
|
|
74
|
+
writeFile(file: import("fs").PathLike | import("fs/promises").FileHandle, data: string | NodeJS.ArrayBufferView | Iterable<string | NodeJS.ArrayBufferView> | AsyncIterable<string | NodeJS.ArrayBufferView> | import("stream"), options?: (import("fs").ObjectEncodingOptions & {
|
|
75
|
+
mode?: import("fs").Mode | undefined;
|
|
76
|
+
flag?: import("fs").OpenMode | undefined;
|
|
77
|
+
flush?: boolean | undefined;
|
|
78
|
+
} & import("events").Abortable) | BufferEncoding | null): Promise<void>;
|
|
79
|
+
appendFile(path: import("fs").PathLike | import("fs/promises").FileHandle, data: string | Uint8Array, options?: (import("fs").ObjectEncodingOptions & import("fs/promises").FlagAndOpenMode & {
|
|
80
|
+
flush?: boolean | undefined;
|
|
81
|
+
}) | BufferEncoding | null): Promise<void>;
|
|
82
|
+
readFile(path: import("fs").PathLike | import("fs/promises").FileHandle, options?: ({
|
|
83
|
+
encoding?: null | undefined;
|
|
84
|
+
flag?: import("fs").OpenMode | undefined;
|
|
85
|
+
} & import("events").Abortable) | null): Promise<Buffer>;
|
|
86
|
+
readFile(path: import("fs").PathLike | import("fs/promises").FileHandle, options: ({
|
|
87
|
+
encoding: BufferEncoding;
|
|
88
|
+
flag?: import("fs").OpenMode | undefined;
|
|
89
|
+
} & import("events").Abortable) | BufferEncoding): Promise<string>;
|
|
90
|
+
readFile(path: import("fs").PathLike | import("fs/promises").FileHandle, options?: (import("fs").ObjectEncodingOptions & import("events").Abortable & {
|
|
91
|
+
flag?: import("fs").OpenMode | undefined;
|
|
92
|
+
}) | BufferEncoding | null): Promise<string | Buffer>;
|
|
93
|
+
opendir(path: import("fs").PathLike, options?: import("fs").OpenDirOptions): Promise<import("fs").Dir>;
|
|
94
|
+
watch(filename: import("fs").PathLike, options: (import("fs").WatchOptions & {
|
|
95
|
+
encoding: "buffer";
|
|
96
|
+
}) | "buffer"): AsyncIterable<import("fs/promises").FileChangeInfo<Buffer>>;
|
|
97
|
+
watch(filename: import("fs").PathLike, options?: import("fs").WatchOptions | BufferEncoding): AsyncIterable<import("fs/promises").FileChangeInfo<string>>;
|
|
98
|
+
watch(filename: import("fs").PathLike, options: import("fs").WatchOptions | string): AsyncIterable<import("fs/promises").FileChangeInfo<string>> | AsyncIterable<import("fs/promises").FileChangeInfo<Buffer>>;
|
|
99
|
+
cp(source: string | URL, destination: string | URL, opts?: import("fs").CopyOptions): Promise<void>;
|
|
100
|
+
glob(pattern: string | string[]): NodeJS.AsyncIterator<string>;
|
|
101
|
+
glob(pattern: string | string[], opt: import("fs").GlobOptionsWithFileTypes): NodeJS.AsyncIterator<import("fs").Dirent>;
|
|
102
|
+
glob(pattern: string | string[], opt: import("fs").GlobOptionsWithoutFileTypes): NodeJS.AsyncIterator<string>;
|
|
103
|
+
glob(pattern: string | string[], opt: import("fs").GlobOptions): NodeJS.AsyncIterator<import("fs").Dirent | string>;
|
|
104
|
+
constants: typeof import("fs").constants;
|
|
105
|
+
};
|
|
106
|
+
path: {
|
|
107
|
+
default: import("path").PlatformPath;
|
|
108
|
+
normalize(path: string): string;
|
|
109
|
+
join(...paths: string[]): string;
|
|
110
|
+
resolve(...paths: string[]): string;
|
|
111
|
+
matchesGlob(path: string, pattern: string): boolean;
|
|
112
|
+
isAbsolute(path: string): boolean;
|
|
113
|
+
relative(from: string, to: string): string;
|
|
114
|
+
dirname(path: string): string;
|
|
115
|
+
basename(path: string, suffix?: string): string;
|
|
116
|
+
extname(path: string): string;
|
|
117
|
+
sep: "\\" | "/";
|
|
118
|
+
delimiter: ";" | ":";
|
|
119
|
+
parse(path: string): import("path").ParsedPath;
|
|
120
|
+
format(pathObject: import("path").FormatInputPathObject): string;
|
|
121
|
+
toNamespacedPath(path: string): string;
|
|
122
|
+
posix: import("path").PlatformPath;
|
|
123
|
+
win32: import("path").PlatformPath;
|
|
124
|
+
};
|
|
125
|
+
} | undefined>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export async function loadNodeApis() {
|
|
2
|
+
if (globalThis.process) {
|
|
3
|
+
const fs = await import("node:fs/promises");
|
|
4
|
+
const path = await import("node:path");
|
|
5
|
+
return { fs, path };
|
|
6
|
+
}
|
|
7
|
+
return undefined;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL21ldGFkYXRhL25vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZO0lBQ2hDLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFDM0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDdEMsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQTtJQUNyQixDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkTm9kZUFwaXMoKSB7XG4gIGlmIChnbG9iYWxUaGlzLnByb2Nlc3MpIHtcbiAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIilcbiAgICBjb25zdCBwYXRoID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpXG4gICAgcmV0dXJuIHsgZnMsIHBhdGggfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuIl19
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { loadNodeApis } from "./node.js";
|
|
2
|
+
/**
|
|
3
|
+
* Save a metadata (JSON Object) to a file path
|
|
4
|
+
* Works in Node.js environments
|
|
5
|
+
*/
|
|
6
|
+
export async function saveMetadata(props) {
|
|
7
|
+
const { metadata, path } = props;
|
|
8
|
+
const node = await loadNodeApis();
|
|
9
|
+
if (!node) {
|
|
10
|
+
throw new Error("File system operations are not supported in this environment");
|
|
11
|
+
}
|
|
12
|
+
const content = JSON.stringify(metadata, null, 2);
|
|
13
|
+
await node.fs.mkdir(node.path.dirname(path), { recursive: true });
|
|
14
|
+
await node.fs.writeFile(path, content, "utf-8");
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL21ldGFkYXRhL3NhdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUV4Qzs7O0dBR0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFlBQVksQ0FBQyxLQUdsQztJQUNDLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFBO0lBRWhDLE1BQU0sSUFBSSxHQUFHLE1BQU0sWUFBWSxFQUFFLENBQUE7SUFDakMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FDYiw4REFBOEQsQ0FDL0QsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFFakQsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ2pFLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUUvQyxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBsb2FkTm9kZUFwaXMgfSBmcm9tIFwiLi9ub2RlLmpzXCJcblxuLyoqXG4gKiBTYXZlIGEgbWV0YWRhdGEgKEpTT04gT2JqZWN0KSB0byBhIGZpbGUgcGF0aFxuICogV29ya3MgaW4gTm9kZS5qcyBlbnZpcm9ubWVudHNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVNZXRhZGF0YShwcm9wczoge1xuICBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PlxuICBwYXRoOiBzdHJpbmdcbn0pIHtcbiAgY29uc3QgeyBtZXRhZGF0YSwgcGF0aCB9ID0gcHJvcHNcblxuICBjb25zdCBub2RlID0gYXdhaXQgbG9hZE5vZGVBcGlzKClcbiAgaWYgKCFub2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJGaWxlIHN5c3RlbSBvcGVyYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnRcIixcbiAgICApXG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEsIG51bGwsIDIpXG5cbiAgYXdhaXQgbm9kZS5mcy5ta2Rpcihub2RlLnBhdGguZGlybmFtZShwYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgYXdhaXQgbm9kZS5mcy53cml0ZUZpbGUocGF0aCwgY29udGVudCwgXCJ1dGYtOFwiKVxuXG4gIHJldHVybiB0cnVlXG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,80 @@
|
|
|
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 { saveMetadata } from "./save.js";
|
|
6
|
+
describe("saveMetadata", () => {
|
|
7
|
+
const testMetadata = {
|
|
8
|
+
name: "test-metadata",
|
|
9
|
+
version: "1.0.0",
|
|
10
|
+
description: "Test metadata for save function",
|
|
11
|
+
resources: [
|
|
12
|
+
{
|
|
13
|
+
name: "resource1",
|
|
14
|
+
path: "data/resource1.csv",
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
};
|
|
18
|
+
let testDir;
|
|
19
|
+
let testPath;
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
testDir = temporaryDirectory();
|
|
22
|
+
testPath = path.join(testDir, "metadata.json");
|
|
23
|
+
});
|
|
24
|
+
afterEach(async () => {
|
|
25
|
+
try {
|
|
26
|
+
await fs.rm(testDir, { recursive: true, force: true });
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
if (error instanceof Error && !error.message.includes("ENOENT")) {
|
|
30
|
+
console.error(`Failed to clean up test directory: ${testDir}`, error);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
it("should save a metadata to the specified path", async () => {
|
|
35
|
+
const result = await saveMetadata({
|
|
36
|
+
metadata: testMetadata,
|
|
37
|
+
path: testPath,
|
|
38
|
+
});
|
|
39
|
+
expect(result).toBe(true);
|
|
40
|
+
const fileExists = await fs
|
|
41
|
+
.stat(testPath)
|
|
42
|
+
.then(() => true)
|
|
43
|
+
.catch(() => false);
|
|
44
|
+
expect(fileExists).toBe(true);
|
|
45
|
+
const content = await fs.readFile(testPath, "utf-8");
|
|
46
|
+
const parsedContent = JSON.parse(content);
|
|
47
|
+
expect(parsedContent).toEqual(testMetadata);
|
|
48
|
+
});
|
|
49
|
+
it("should save a metadata to a nested directory path", async () => {
|
|
50
|
+
const nestedPath = path.join(testDir, "nested", "dir", "metadata.json");
|
|
51
|
+
const result = await saveMetadata({
|
|
52
|
+
metadata: testMetadata,
|
|
53
|
+
path: nestedPath,
|
|
54
|
+
});
|
|
55
|
+
expect(result).toBe(true);
|
|
56
|
+
const fileExists = await fs
|
|
57
|
+
.stat(nestedPath)
|
|
58
|
+
.then(() => true)
|
|
59
|
+
.catch(() => false);
|
|
60
|
+
expect(fileExists).toBe(true);
|
|
61
|
+
const content = await fs.readFile(nestedPath, "utf-8");
|
|
62
|
+
const parsedContent = JSON.parse(content);
|
|
63
|
+
expect(parsedContent).toEqual(testMetadata);
|
|
64
|
+
});
|
|
65
|
+
it("should use pretty formatting with 2-space indentation", async () => {
|
|
66
|
+
await saveMetadata({
|
|
67
|
+
metadata: testMetadata,
|
|
68
|
+
path: testPath,
|
|
69
|
+
});
|
|
70
|
+
const content = await fs.readFile(testPath, "utf-8");
|
|
71
|
+
const expectedFormat = JSON.stringify(testMetadata, null, 2);
|
|
72
|
+
expect(content).toEqual(expectedFormat);
|
|
73
|
+
const lines = content.split("\n");
|
|
74
|
+
expect(lines.length).toBeGreaterThan(1);
|
|
75
|
+
if (lines.length > 1 && lines[1]) {
|
|
76
|
+
expect(lines[1].startsWith(" ")).toBe(true);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbWV0YWRhdGEvc2F2ZS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUE7QUFDakMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sT0FBTyxDQUFBO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ3BFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFeEMsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDNUIsTUFBTSxZQUFZLEdBQUc7UUFDbkIsSUFBSSxFQUFFLGVBQWU7UUFDckIsT0FBTyxFQUFFLE9BQU87UUFDaEIsV0FBVyxFQUFFLGlDQUFpQztRQUM5QyxTQUFTLEVBQUU7WUFDVDtnQkFDRSxJQUFJLEVBQUUsV0FBVztnQkFDakIsSUFBSSxFQUFFLG9CQUFvQjthQUMzQjtTQUNGO0tBQ0YsQ0FBQTtJQUVELElBQUksT0FBZSxDQUFBO0lBQ25CLElBQUksUUFBZ0IsQ0FBQTtJQUVwQixVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsT0FBTyxHQUFHLGtCQUFrQixFQUFFLENBQUE7UUFDOUIsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFBO0lBQ2hELENBQUMsQ0FBQyxDQUFBO0lBRUYsU0FBUyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ25CLElBQUksQ0FBQztZQUNILE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3hELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxLQUFLLFlBQVksS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDaEUsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsT0FBTyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDdkUsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUM1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLFlBQVksQ0FBQztZQUNoQyxRQUFRLEVBQUUsWUFBWTtZQUN0QixJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUMsQ0FBQTtRQUVGLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFekIsTUFBTSxVQUFVLEdBQUcsTUFBTSxFQUFFO2FBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUM7YUFDZCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO2FBQ2hCLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNyQixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRTdCLE1BQU0sT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDcEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN6QyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBQzdDLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2pFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUE7UUFFdkUsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUM7WUFDaEMsUUFBUSxFQUFFLFlBQVk7WUFDdEIsSUFBSSxFQUFFLFVBQVU7U0FDakIsQ0FBQyxDQUFBO1FBRUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUV6QixNQUFNLFVBQVUsR0FBRyxNQUFNLEVBQUU7YUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUNoQixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO2FBQ2hCLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNyQixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRTdCLE1BQU0sT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDdEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN6QyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBQzdDLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHVEQUF1RCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3JFLE1BQU0sWUFBWSxDQUFDO1lBQ2pCLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQyxDQUFBO1FBRUYsTUFBTSxPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUNwRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDNUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUV2QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2pDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRXZDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUMsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgdGVtcG9yYXJ5RGlyZWN0b3J5IH0gZnJvbSBcInRlbXB5XCJcbmltcG9ydCB7IGFmdGVyRWFjaCwgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IHNhdmVNZXRhZGF0YSB9IGZyb20gXCIuL3NhdmUuanNcIlxuXG5kZXNjcmliZShcInNhdmVNZXRhZGF0YVwiLCAoKSA9PiB7XG4gIGNvbnN0IHRlc3RNZXRhZGF0YSA9IHtcbiAgICBuYW1lOiBcInRlc3QtbWV0YWRhdGFcIixcbiAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgZGVzY3JpcHRpb246IFwiVGVzdCBtZXRhZGF0YSBmb3Igc2F2ZSBmdW5jdGlvblwiLFxuICAgIHJlc291cmNlczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiBcInJlc291cmNlMVwiLFxuICAgICAgICBwYXRoOiBcImRhdGEvcmVzb3VyY2UxLmNzdlwiLFxuICAgICAgfSxcbiAgICBdLFxuICB9XG5cbiAgbGV0IHRlc3REaXI6IHN0cmluZ1xuICBsZXQgdGVzdFBhdGg6IHN0cmluZ1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHRlc3REaXIgPSB0ZW1wb3JhcnlEaXJlY3RvcnkoKVxuICAgIHRlc3RQYXRoID0gcGF0aC5qb2luKHRlc3REaXIsIFwibWV0YWRhdGEuanNvblwiKVxuICB9KVxuXG4gIGFmdGVyRWFjaChhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLnJtKHRlc3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIkVOT0VOVFwiKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY2xlYW4gdXAgdGVzdCBkaXJlY3Rvcnk6ICR7dGVzdERpcn1gLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc2F2ZSBhIG1ldGFkYXRhIHRvIHRoZSBzcGVjaWZpZWQgcGF0aFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2F2ZU1ldGFkYXRhKHtcbiAgICAgIG1ldGFkYXRhOiB0ZXN0TWV0YWRhdGEsXG4gICAgICBwYXRoOiB0ZXN0UGF0aCxcbiAgICB9KVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKVxuXG4gICAgY29uc3QgZmlsZUV4aXN0cyA9IGF3YWl0IGZzXG4gICAgICAuc3RhdCh0ZXN0UGF0aClcbiAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAuY2F0Y2goKCkgPT4gZmFsc2UpXG4gICAgZXhwZWN0KGZpbGVFeGlzdHMpLnRvQmUodHJ1ZSlcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZSh0ZXN0UGF0aCwgXCJ1dGYtOFwiKVxuICAgIGNvbnN0IHBhcnNlZENvbnRlbnQgPSBKU09OLnBhcnNlKGNvbnRlbnQpXG4gICAgZXhwZWN0KHBhcnNlZENvbnRlbnQpLnRvRXF1YWwodGVzdE1ldGFkYXRhKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHNhdmUgYSBtZXRhZGF0YSB0byBhIG5lc3RlZCBkaXJlY3RvcnkgcGF0aFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbmVzdGVkUGF0aCA9IHBhdGguam9pbih0ZXN0RGlyLCBcIm5lc3RlZFwiLCBcImRpclwiLCBcIm1ldGFkYXRhLmpzb25cIilcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNhdmVNZXRhZGF0YSh7XG4gICAgICBtZXRhZGF0YTogdGVzdE1ldGFkYXRhLFxuICAgICAgcGF0aDogbmVzdGVkUGF0aCxcbiAgICB9KVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKVxuXG4gICAgY29uc3QgZmlsZUV4aXN0cyA9IGF3YWl0IGZzXG4gICAgICAuc3RhdChuZXN0ZWRQYXRoKVxuICAgICAgLnRoZW4oKCkgPT4gdHJ1ZSlcbiAgICAgIC5jYXRjaCgoKSA9PiBmYWxzZSlcbiAgICBleHBlY3QoZmlsZUV4aXN0cykudG9CZSh0cnVlKVxuXG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKG5lc3RlZFBhdGgsIFwidXRmLThcIilcbiAgICBjb25zdCBwYXJzZWRDb250ZW50ID0gSlNPTi5wYXJzZShjb250ZW50KVxuICAgIGV4cGVjdChwYXJzZWRDb250ZW50KS50b0VxdWFsKHRlc3RNZXRhZGF0YSlcbiAgfSlcblxuICBpdChcInNob3VsZCB1c2UgcHJldHR5IGZvcm1hdHRpbmcgd2l0aCAyLXNwYWNlIGluZGVudGF0aW9uXCIsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBzYXZlTWV0YWRhdGEoe1xuICAgICAgbWV0YWRhdGE6IHRlc3RNZXRhZGF0YSxcbiAgICAgIHBhdGg6IHRlc3RQYXRoLFxuICAgIH0pXG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUodGVzdFBhdGgsIFwidXRmLThcIilcbiAgICBjb25zdCBleHBlY3RlZEZvcm1hdCA9IEpTT04uc3RyaW5naWZ5KHRlc3RNZXRhZGF0YSwgbnVsbCwgMilcbiAgICBleHBlY3QoY29udGVudCkudG9FcXVhbChleHBlY3RlZEZvcm1hdClcblxuICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKVxuICAgIGV4cGVjdChsaW5lcy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigxKVxuXG4gICAgaWYgKGxpbmVzLmxlbmd0aCA+IDEgJiYgbGluZXNbMV0pIHtcbiAgICAgIGV4cGVjdChsaW5lc1sxXS5zdGFydHNXaXRoKFwiICBcIikpLnRvQmUodHJ1ZSlcbiAgICB9XG4gIH0pXG59KVxuIl19
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate a metadata (JSON Object) against a JSON Schema
|
|
3
|
+
* It uses Ajv for JSON Schema validation under the hood
|
|
4
|
+
* It returns a list of errors (empty if valid)
|
|
5
|
+
*/
|
|
6
|
+
export declare function validateMetadata(props: {
|
|
7
|
+
metadata: Record<string, any>;
|
|
8
|
+
profile: Record<string, any>;
|
|
9
|
+
}): Promise<import("ajv").ErrorObject<string, Record<string, any>, unknown>[]>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Ajv } from "ajv";
|
|
2
|
+
/**
|
|
3
|
+
* Validate a metadata (JSON Object) against a JSON Schema
|
|
4
|
+
* It uses Ajv for JSON Schema validation under the hood
|
|
5
|
+
* It returns a list of errors (empty if valid)
|
|
6
|
+
*/
|
|
7
|
+
export async function validateMetadata(props) {
|
|
8
|
+
const { metadata, profile } = props;
|
|
9
|
+
const ajv = new Ajv();
|
|
10
|
+
const validate = ajv.compile(profile);
|
|
11
|
+
validate(metadata);
|
|
12
|
+
return validate.errors ?? [];
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9tZXRhZGF0YS92YWxpZGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sS0FBSyxDQUFBO0FBRXpCOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUFDLEtBR3RDO0lBQ0MsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUE7SUFFbkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUNyQixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3JDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNsQixPQUFPLFFBQVEsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFBO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBanYgfSBmcm9tIFwiYWp2XCJcblxuLyoqXG4gKiBWYWxpZGF0ZSBhIG1ldGFkYXRhIChKU09OIE9iamVjdCkgYWdhaW5zdCBhIEpTT04gU2NoZW1hXG4gKiBJdCB1c2VzIEFqdiBmb3IgSlNPTiBTY2hlbWEgdmFsaWRhdGlvbiB1bmRlciB0aGUgaG9vZFxuICogSXQgcmV0dXJucyBhIGxpc3Qgb2YgZXJyb3JzIChlbXB0eSBpZiB2YWxpZClcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlTWV0YWRhdGEocHJvcHM6IHtcbiAgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgcHJvZmlsZTogUmVjb3JkPHN0cmluZywgYW55PlxufSkge1xuICBjb25zdCB7IG1ldGFkYXRhLCBwcm9maWxlIH0gPSBwcm9wc1xuXG4gIGNvbnN0IGFqdiA9IG5ldyBBanYoKVxuICBjb25zdCB2YWxpZGF0ZSA9IGFqdi5jb21waWxlKHByb2ZpbGUpXG4gIHZhbGlkYXRlKG1ldGFkYXRhKVxuICByZXR1cm4gdmFsaWRhdGUuZXJyb3JzID8/IFtdXG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { validateMetadata } from "./validate.js";
|
|
3
|
+
describe("validateMetadata", () => {
|
|
4
|
+
it("returns empty array for valid metadata", async () => {
|
|
5
|
+
const profile = {
|
|
6
|
+
type: "object",
|
|
7
|
+
required: ["name", "version"],
|
|
8
|
+
properties: {
|
|
9
|
+
name: { type: "string" },
|
|
10
|
+
version: { type: "string" },
|
|
11
|
+
description: { type: "string" },
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
const metadata = {
|
|
15
|
+
name: "test-package",
|
|
16
|
+
version: "1.0.0",
|
|
17
|
+
description: "A test package",
|
|
18
|
+
};
|
|
19
|
+
const result = await validateMetadata({
|
|
20
|
+
metadata,
|
|
21
|
+
profile,
|
|
22
|
+
});
|
|
23
|
+
expect(result).toEqual([]);
|
|
24
|
+
});
|
|
25
|
+
it("returns validation errors for invalid metadata", async () => {
|
|
26
|
+
const profile = {
|
|
27
|
+
type: "object",
|
|
28
|
+
required: ["name", "version"],
|
|
29
|
+
properties: {
|
|
30
|
+
name: { type: "string" },
|
|
31
|
+
version: { type: "string" },
|
|
32
|
+
description: { type: "string" },
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
const metadata = {
|
|
36
|
+
name: "test-package",
|
|
37
|
+
version: 123,
|
|
38
|
+
description: "A test package with wrong version type",
|
|
39
|
+
};
|
|
40
|
+
const result = await validateMetadata({
|
|
41
|
+
metadata,
|
|
42
|
+
profile,
|
|
43
|
+
});
|
|
44
|
+
expect(result).not.toBeNull();
|
|
45
|
+
expect(Array.isArray(result)).toBe(true);
|
|
46
|
+
expect(result.length).toBeGreaterThan(0);
|
|
47
|
+
const error = result[0];
|
|
48
|
+
expect(error).toBeDefined();
|
|
49
|
+
if (error) {
|
|
50
|
+
expect(error.keyword).toBe("type");
|
|
51
|
+
expect(error.instancePath).toBe("/version");
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
it("returns errors when required fields are missing", async () => {
|
|
55
|
+
const profile = {
|
|
56
|
+
type: "object",
|
|
57
|
+
required: ["name", "version", "required_field"],
|
|
58
|
+
properties: {
|
|
59
|
+
name: { type: "string" },
|
|
60
|
+
version: { type: "string" },
|
|
61
|
+
required_field: { type: "string" },
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
const metadata = {
|
|
65
|
+
name: "test-package",
|
|
66
|
+
version: "1.0.0",
|
|
67
|
+
};
|
|
68
|
+
const result = await validateMetadata({
|
|
69
|
+
metadata,
|
|
70
|
+
profile,
|
|
71
|
+
});
|
|
72
|
+
expect(Array.isArray(result)).toBe(true);
|
|
73
|
+
expect(result.length).toBeGreaterThan(0);
|
|
74
|
+
const error = result[0];
|
|
75
|
+
expect(error).toBeDefined();
|
|
76
|
+
if (error) {
|
|
77
|
+
expect(error.keyword).toBe("required");
|
|
78
|
+
expect(error.params).toBeDefined();
|
|
79
|
+
if (error.params) {
|
|
80
|
+
expect(error.params.missingProperty).toBe("required_field");
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
it("validates nested objects in the metadata", async () => {
|
|
85
|
+
const profile = {
|
|
86
|
+
type: "object",
|
|
87
|
+
required: ["name", "version", "author"],
|
|
88
|
+
properties: {
|
|
89
|
+
name: { type: "string" },
|
|
90
|
+
version: { type: "string" },
|
|
91
|
+
author: {
|
|
92
|
+
type: "object",
|
|
93
|
+
required: ["name", "email"],
|
|
94
|
+
properties: {
|
|
95
|
+
name: { type: "string" },
|
|
96
|
+
email: {
|
|
97
|
+
type: "string",
|
|
98
|
+
pattern: "^[^@]+@[^@]+\\.[^@]+$",
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
const metadata = {
|
|
105
|
+
name: "test-package",
|
|
106
|
+
version: "1.0.0",
|
|
107
|
+
author: {
|
|
108
|
+
name: "Test Author",
|
|
109
|
+
email: "invalid-email",
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
const result = await validateMetadata({
|
|
113
|
+
metadata,
|
|
114
|
+
profile,
|
|
115
|
+
});
|
|
116
|
+
expect(Array.isArray(result)).toBe(true);
|
|
117
|
+
expect(result.length).toBeGreaterThan(0);
|
|
118
|
+
const hasEmailPatternError = result.some(error => error &&
|
|
119
|
+
error.instancePath === "/author/email" &&
|
|
120
|
+
error.keyword === "pattern");
|
|
121
|
+
expect(hasEmailPatternError).toBe(true);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL21ldGFkYXRhL3ZhbGlkYXRlLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUVoRCxRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO0lBQ2hDLEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN0RCxNQUFNLE9BQU8sR0FBRztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQztZQUM3QixVQUFVLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtnQkFDeEIsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtnQkFDM0IsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTthQUNoQztTQUNGLENBQUE7UUFFRCxNQUFNLFFBQVEsR0FBRztZQUNmLElBQUksRUFBRSxjQUFjO1lBQ3BCLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLFdBQVcsRUFBRSxnQkFBZ0I7U0FDOUIsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sZ0JBQWdCLENBQUM7WUFDcEMsUUFBUTtZQUNSLE9BQU87U0FDUixDQUFDLENBQUE7UUFFRixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQzVCLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGdEQUFnRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzlELE1BQU0sT0FBTyxHQUFHO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVB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WUFBWSxLQUFLLGVBQWU7WUFDdEMsS0FBSyxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQzlCLENBQUE7UUFFRCxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDekMsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyB2YWxpZGF0ZU1ldGFkYXRhIH0gZnJvbSBcIi4vdmFsaWRhdGUuanNcIlxuXG5kZXNjcmliZShcInZhbGlkYXRlTWV0YWRhdGFcIiwgKCkgPT4ge1xuICBpdChcInJldHVybnMgZW1wdHkgYXJyYXkgZm9yIHZhbGlkIG1ldGFkYXRhXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwcm9maWxlID0ge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIHJlcXVpcmVkOiBbXCJuYW1lXCIsIFwidmVyc2lvblwiXSxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgbmFtZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHZlcnNpb246IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBkZXNjcmlwdGlvbjogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IG1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkEgdGVzdCBwYWNrYWdlXCIsXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdmFsaWRhdGVNZXRhZGF0YSh7XG4gICAgICBtZXRhZGF0YSxcbiAgICAgIHByb2ZpbGUsXG4gICAgfSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoW10pXG4gIH0pXG5cbiAgaXQoXCJyZXR1cm5zIHZhbGlkYXRpb24gZXJyb3JzIGZvciBpbnZhbGlkIG1ldGFkYXRhXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwcm9maWxlID0ge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIHJlcXVpcmVkOiBbXCJuYW1lXCIsIFwidmVyc2lvblwiXSxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgbmFtZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHZlcnNpb246IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBkZXNjcmlwdGlvbjogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IG1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgIHZlcnNpb246IDEyMyxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkEgdGVzdCBwYWNrYWdlIHdpdGggd3JvbmcgdmVyc2lvbiB0eXBlXCIsXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdmFsaWRhdGVNZXRhZGF0YSh7XG4gICAgICBtZXRhZGF0YSxcbiAgICAgIHByb2ZpbGUsXG4gICAgfSlcblxuICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b0JlTnVsbCgpXG4gICAgZXhwZWN0KEFycmF5LmlzQXJyYXkocmVzdWx0KSkudG9CZSh0cnVlKVxuICAgIGV4cGVjdChyZXN1bHQubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMClcblxuICAgIGNvbnN0IGVycm9yID0gcmVzdWx0WzBdXG4gICAgZXhwZWN0KGVycm9yKS50b0JlRGVmaW5lZCgpXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBleHBlY3QoZXJyb3Iua2V5d29yZCkudG9CZShcInR5cGVcIilcbiAgICAgIGV4cGVjdChlcnJvci5pbnN0YW5jZVBhdGgpLnRvQmUoXCIvdmVyc2lvblwiKVxuICAgIH1cbiAgfSlcblxuICBpdChcInJldHVybnMgZXJyb3JzIHdoZW4gcmVxdWlyZWQgZmllbGRzIGFyZSBtaXNzaW5nXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwcm9maWxlID0ge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIHJlcXVpcmVkOiBbXCJuYW1lXCIsIFwidmVyc2lvblwiLCBcInJlcXVpcmVkX2ZpZWxkXCJdLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBuYW1lOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgdmVyc2lvbjogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHJlcXVpcmVkX2ZpZWxkOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgbWV0YWRhdGEgPSB7XG4gICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZhbGlkYXRlTWV0YWRhdGEoe1xuICAgICAgbWV0YWRhdGEsXG4gICAgICBwcm9maWxlLFxuICAgIH0pXG5cbiAgICBleHBlY3QoQXJyYXkuaXNBcnJheShyZXN1bHQpKS50b0JlKHRydWUpXG4gICAgZXhwZWN0KHJlc3VsdC5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKVxuXG4gICAgY29uc3QgZXJyb3IgPSByZXN1bHRbMF1cbiAgICBleHBlY3QoZXJyb3IpLnRvQmVEZWZpbmVkKClcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIGV4cGVjdChlcnJvci5rZXl3b3JkKS50b0JlKFwicmVxdWlyZWRcIilcbiAgICAgIGV4cGVjdChlcnJvci5wYXJhbXMpLnRvQmVEZWZpbmVkKClcbiAgICAgIGlmIChlcnJvci5wYXJhbXMpIHtcbiAgICAgICAgZXhwZWN0KGVycm9yLnBhcmFtcy5taXNzaW5nUHJvcGVydHkpLnRvQmUoXCJyZXF1aXJlZF9maWVsZFwiKVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICBpdChcInZhbGlkYXRlcyBuZXN0ZWQgb2JqZWN0cyBpbiB0aGUgbWV0YWRhdGFcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHByb2ZpbGUgPSB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgcmVxdWlyZWQ6IFtcIm5hbWVcIiwgXCJ2ZXJzaW9uXCIsIFwiYXV0aG9yXCJdLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBuYW1lOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgdmVyc2lvbjogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIGF1dGhvcjoge1xuICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IFtcIm5hbWVcIiwgXCJlbWFpbFwiXSxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBuYW1lOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgIGVtYWlsOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgIHBhdHRlcm46IFwiXlteQF0rQFteQF0rXFxcXC5bXkBdKyRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgbWV0YWRhdGEgPSB7XG4gICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgICAgYXV0aG9yOiB7XG4gICAgICAgIG5hbWU6IFwiVGVzdCBBdXRob3JcIixcbiAgICAgICAgZW1haWw6IFwiaW52YWxpZC1lbWFpbFwiLFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB2YWxpZGF0ZU1ldGFkYXRhKHtcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgcHJvZmlsZSxcbiAgICB9KVxuXG4gICAgZXhwZWN0KEFycmF5LmlzQXJyYXkocmVzdWx0KSkudG9CZSh0cnVlKVxuICAgIGV4cGVjdChyZXN1bHQubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMClcblxuICAgIGNvbnN0IGhhc0VtYWlsUGF0dGVybkVycm9yID0gcmVzdWx0LnNvbWUoXG4gICAgICBlcnJvciA9PlxuICAgICAgICBlcnJvciAmJlxuICAgICAgICBlcnJvci5pbnN0YW5jZVBhdGggPT09IFwiL2F1dGhvci9lbWFpbFwiICYmXG4gICAgICAgIGVycm9yLmtleXdvcmQgPT09IFwicGF0dGVyblwiLFxuICAgIClcblxuICAgIGV4cGVjdChoYXNFbWFpbFBhdHRlcm5FcnJvcikudG9CZSh0cnVlKVxuICB9KVxufSlcbiJdfQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contributor information
|
|
3
|
+
*/
|
|
4
|
+
export interface Contributor {
|
|
5
|
+
/**
|
|
6
|
+
* Full name of the contributor
|
|
7
|
+
*/
|
|
8
|
+
title: string;
|
|
9
|
+
/**
|
|
10
|
+
* Email address of the contributor
|
|
11
|
+
*/
|
|
12
|
+
email?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Path to relevant contributor information
|
|
15
|
+
*/
|
|
16
|
+
path?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Role of the contributor
|
|
19
|
+
*/
|
|
20
|
+
role?: string;
|
|
21
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJpYnV0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9wYWNrYWdlL0NvbnRyaWJ1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnRyaWJ1dG9yIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJpYnV0b3Ige1xuICAvKipcbiAgICogRnVsbCBuYW1lIG9mIHRoZSBjb250cmlidXRvclxuICAgKi9cbiAgdGl0bGU6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBFbWFpbCBhZGRyZXNzIG9mIHRoZSBjb250cmlidXRvclxuICAgKi9cbiAgZW1haWw/OiBzdHJpbmdcblxuICAvKipcbiAgICogUGF0aCB0byByZWxldmFudCBjb250cmlidXRvciBpbmZvcm1hdGlvblxuICAgKi9cbiAgcGF0aD86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBSb2xlIG9mIHRoZSBjb250cmlidXRvclxuICAgKi9cbiAgcm9sZT86IHN0cmluZ1xufVxuIl19
|