@dpkit/core
Version:
Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames
112 lines • 14.1 kB
JavaScript
import { describe, expect, it } from "vitest";
import { validateDescriptor } from "./validate.js";
describe("validateDescriptor", () => {
it("returns empty array for valid descriptor", async () => {
const descriptor = {
name: "test-package",
version: "1.0.0",
description: "A test package",
};
const profile = {
type: "object",
required: ["name", "version"],
properties: {
name: { type: "string" },
version: { type: "string" },
description: { type: "string" },
},
};
const result = await validateDescriptor(descriptor, { profile });
expect(result.valid).toBe(true);
expect(result.errors).toEqual([]);
});
it("returns validation errors for invalid descriptor", async () => {
const profile = {
type: "object",
required: ["name", "version"],
properties: {
name: { type: "string" },
version: { type: "string" },
description: { type: "string" },
},
};
const descriptor = {
name: "test-package",
version: 123,
description: "A test package with wrong version type",
};
const result = await validateDescriptor(descriptor, { profile });
expect(result.valid).toBe(false);
expect(result.errors.length).toBeGreaterThan(0);
const error = result.errors[0];
expect(error).toBeDefined();
if (error) {
expect(error.keyword).toBe("type");
expect(error.instancePath).toBe("/version");
}
});
it("returns errors when required fields are missing", async () => {
const profile = {
type: "object",
required: ["name", "version", "required_field"],
properties: {
name: { type: "string" },
version: { type: "string" },
required_field: { type: "string" },
},
};
const descriptor = {
name: "test-package",
version: "1.0.0",
};
const result = await validateDescriptor(descriptor, { profile });
expect(result.valid).toBe(false);
expect(result.errors.length).toBeGreaterThan(0);
const error = result.errors[0];
expect(error).toBeDefined();
if (error) {
expect(error.keyword).toBe("required");
expect(error.params).toBeDefined();
if (error.params) {
expect(error.params.missingProperty).toBe("required_field");
}
}
});
it("validates nested objects in the descriptor", async () => {
const profile = {
type: "object",
required: ["name", "version", "author"],
properties: {
name: { type: "string" },
version: { type: "string" },
author: {
type: "object",
required: ["name", "email"],
properties: {
name: { type: "string" },
email: {
type: "string",
pattern: "^[^@]+@[^@]+\\.[^@]+$",
},
},
},
},
};
const descriptor = {
name: "test-package",
version: "1.0.0",
author: {
name: "Test Author",
email: "invalid-email",
},
};
const result = await validateDescriptor(descriptor, { profile });
expect(result.valid).toBe(false);
expect(result.errors.length).toBeGreaterThan(0);
const hasEmailPatternError = result.errors.some(error => error &&
error.instancePath === "/author/email" &&
error.keyword === "pattern");
expect(hasEmailPatternError).toBe(true);
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2dlbmVyYWwvZGVzY3JpcHRvci92YWxpZGF0ZS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFbEQsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtJQUNsQyxFQUFFLENBQUMsMENBQTBDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDeEQsTUFBTSxVQUFVLEdBQUc7WUFDakIsSUFBSSxFQUFFLGNBQWM7WUFDcEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsV0FBVyxFQUFFLGdCQUFnQjtTQUM5QixDQUFBO1FBRUQsTUFBTSxPQUFPLEdBQUc7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUM7WUFDN0IsVUFBVSxFQUFFO2dCQUNWLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7Z0JBQ3hCLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7Z0JBQzNCLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7YUFDaEM7U0FDRixDQUFBO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBRWhFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQy9CLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ25DLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2hFLE1BQU0sT0FBTyxHQUFHO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDO1lBQzdCLFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2dCQUN4QixPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2dCQUMzQixXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2FBQ2hDO1NBQ0YsQ0FBQTtRQUVELE1BQU0sVUFBVSxHQUFHO1lBQ2pCLElBQUksRUFBRSxjQUFjO1lBQ3BCLE9BQU8sRUFBRSxHQUFHO1lBQ1osV0FBVyxFQUFFLHdDQUF3QztTQUN0RCxDQUFBO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBRWhFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUUvQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzlCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUMzQixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDbEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDN0MsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGlEQUFpRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQy9ELE1BQU0sT0FBTyxHQUFHO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixDQUFDO1lBQy9DLFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2dCQUN4QixPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2dCQUMzQixjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2FBQ25DO1NBQ0YsQ0FBQTtRQUVELE1BQU0sVUFBVSxHQUFHO1lBQ2pCLElBQUksRUFBRSxjQUFjO1lBQ3BCLE9BQU8sRUFBRSxPQUFPO1NBQ2pCLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFFaEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRS9DLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDOUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQzNCLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUN0QyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO1lBQ2xDLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNqQixNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtZQUM3RCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzFELE1BQU0sT0FBTyxHQUFHO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQztZQUN2QyxVQUFVLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtnQkFDeEIsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtnQkFDM0IsTUFBTSxFQUFFO29CQUNOLElBQUksRUFBRSxRQUFRO29CQUNkLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7b0JBQzNCLFVBQVUsRUFBRTt3QkFDVixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO3dCQUN4QixLQUFLLEVBQUU7NEJBQ0wsSUFBSSxFQUFFLFFBQVE7NEJBQ2QsT0FBTyxFQUFFLHVCQUF1Qjt5QkFDakM7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGLENBQUE7UUFFRCxNQUFNLFVBQVUsR0FBRztZQUNqQixJQUFJLEVBQUUsY0FBYztZQUNwQixPQUFPLEVBQUUsT0FBTztZQUNoQixNQUFNLEVBQUU7Z0JBQ04sSUFBSSxFQUFFLGFBQWE7Z0JBQ25CLEtBQUssRUFBRSxlQUFlO2FBQ3ZCO1NBQ0YsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUVoRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFL0MsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDN0MsS0FBSyxDQUFDLEVBQUUsQ0FDTixLQUFLO1lBQ0wsS0FBSyxDQUFDLFlBQVksS0FBSyxlQUFlO1lBQ3RDLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUM5QixDQUFBO1FBRUQsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3pDLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHsgdmFsaWRhdGVEZXNjcmlwdG9yIH0gZnJvbSBcIi4vdmFsaWRhdGUuanNcIlxuXG5kZXNjcmliZShcInZhbGlkYXRlRGVzY3JpcHRvclwiLCAoKSA9PiB7XG4gIGl0KFwicmV0dXJucyBlbXB0eSBhcnJheSBmb3IgdmFsaWQgZGVzY3JpcHRvclwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IHtcbiAgICAgIG5hbWU6IFwidGVzdC1wYWNrYWdlXCIsXG4gICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJBIHRlc3QgcGFja2FnZVwiLFxuICAgIH1cblxuICAgIGNvbnN0IHByb2ZpbGUgPSB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgcmVxdWlyZWQ6IFtcIm5hbWVcIiwgXCJ2ZXJzaW9uXCJdLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBuYW1lOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgdmVyc2lvbjogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIGRlc2NyaXB0aW9uOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdmFsaWRhdGVEZXNjcmlwdG9yKGRlc2NyaXB0b3IsIHsgcHJvZmlsZSB9KVxuXG4gICAgZXhwZWN0KHJlc3VsdC52YWxpZCkudG9CZSh0cnVlKVxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0VxdWFsKFtdKVxuICB9KVxuXG4gIGl0KFwicmV0dXJucyB2YWxpZGF0aW9uIGVycm9ycyBmb3IgaW52YWxpZCBkZXNjcmlwdG9yXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwcm9maWxlID0ge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIHJlcXVpcmVkOiBbXCJuYW1lXCIsIFwidmVyc2lvblwiXSxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgbmFtZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHZlcnNpb246IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBkZXNjcmlwdGlvbjogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB7XG4gICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgdmVyc2lvbjogMTIzLFxuICAgICAgZGVzY3JpcHRpb246IFwiQSB0ZXN0IHBhY2thZ2Ugd2l0aCB3cm9uZyB2ZXJzaW9uIHR5cGVcIixcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB2YWxpZGF0ZURlc2NyaXB0b3IoZGVzY3JpcHRvciwgeyBwcm9maWxlIH0pXG5cbiAgICBleHBlY3QocmVzdWx0LnZhbGlkKS50b0JlKGZhbHNlKVxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApXG5cbiAgICBjb25zdCBlcnJvciA9IHJlc3VsdC5lcnJvcnNbMF1cbiAgICBleHBlY3QoZXJyb3IpLnRvQmVEZWZpbmVkKClcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIGV4cGVjdChlcnJvci5rZXl3b3JkKS50b0JlKFwidHlwZVwiKVxuICAgICAgZXhwZWN0KGVycm9yLmluc3RhbmNlUGF0aCkudG9CZShcIi92ZXJzaW9uXCIpXG4gICAgfVxuICB9KVxuXG4gIGl0KFwicmV0dXJucyBlcnJvcnMgd2hlbiByZXF1aXJlZCBmaWVsZHMgYXJlIG1pc3NpbmdcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHByb2ZpbGUgPSB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgcmVxdWlyZWQ6IFtcIm5hbWVcIiwgXCJ2ZXJzaW9uXCIsIFwicmVxdWlyZWRfZmllbGRcIl0sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIG5hbWU6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICB2ZXJzaW9uOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgcmVxdWlyZWRfZmllbGQ6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCBkZXNjcmlwdG9yID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB2YWxpZGF0ZURlc2NyaXB0b3IoZGVzY3JpcHRvciwgeyBwcm9maWxlIH0pXG5cbiAgICBleHBlY3QocmVzdWx0LnZhbGlkKS50b0JlKGZhbHNlKVxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApXG5cbiAgICBjb25zdCBlcnJvciA9IHJlc3VsdC5lcnJvcnNbMF1cbiAgICBleHBlY3QoZXJyb3IpLnRvQmVEZWZpbmVkKClcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIGV4cGVjdChlcnJvci5rZXl3b3JkKS50b0JlKFwicmVxdWlyZWRcIilcbiAgICAgIGV4cGVjdChlcnJvci5wYXJhbXMpLnRvQmVEZWZpbmVkKClcbiAgICAgIGlmIChlcnJvci5wYXJhbXMpIHtcbiAgICAgICAgZXhwZWN0KGVycm9yLnBhcmFtcy5taXNzaW5nUHJvcGVydHkpLnRvQmUoXCJyZXF1aXJlZF9maWVsZFwiKVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICBpdChcInZhbGlkYXRlcyBuZXN0ZWQgb2JqZWN0cyBpbiB0aGUgZGVzY3JpcHRvclwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcHJvZmlsZSA9IHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICByZXF1aXJlZDogW1wibmFtZVwiLCBcInZlcnNpb25cIiwgXCJhdXRob3JcIl0sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIG5hbWU6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICB2ZXJzaW9uOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgYXV0aG9yOiB7XG4gICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICByZXF1aXJlZDogW1wibmFtZVwiLCBcImVtYWlsXCJdLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgZW1haWw6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgcGF0dGVybjogXCJeW15AXStAW15AXStcXFxcLlteQF0rJFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCBkZXNjcmlwdG9yID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAgICAgIGF1dGhvcjoge1xuICAgICAgICBuYW1lOiBcIlRlc3QgQXV0aG9yXCIsXG4gICAgICAgIGVtYWlsOiBcImludmFsaWQtZW1haWxcIixcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdmFsaWRhdGVEZXNjcmlwdG9yKGRlc2NyaXB0b3IsIHsgcHJvZmlsZSB9KVxuXG4gICAgZXhwZWN0KHJlc3VsdC52YWxpZCkudG9CZShmYWxzZSlcbiAgICBleHBlY3QocmVzdWx0LmVycm9ycy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKVxuXG4gICAgY29uc3QgaGFzRW1haWxQYXR0ZXJuRXJyb3IgPSByZXN1bHQuZXJyb3JzLnNvbWUoXG4gICAgICBlcnJvciA9PlxuICAgICAgICBlcnJvciAmJlxuICAgICAgICBlcnJvci5pbnN0YW5jZVBhdGggPT09IFwiL2F1dGhvci9lbWFpbFwiICYmXG4gICAgICAgIGVycm9yLmtleXdvcmQgPT09IFwicGF0dGVyblwiLFxuICAgIClcblxuICAgIGV4cGVjdChoYXNFbWFpbFBhdHRlcm5FcnJvcikudG9CZSh0cnVlKVxuICB9KVxufSlcbiJdfQ==