directory-schema-validator
Version:
Validate file system structure with an extension of JSON schema.
84 lines (83 loc) • 3.57 kB
JavaScript
;
/**
* Copyright 2022 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.shorthandToJSONSchema = void 0;
const path_1 = __importDefault(require("path"));
const upgradeToRule = (stringOrRule) => {
if (typeof stringOrRule === "string") {
return [stringOrRule, {}];
}
return stringOrRule;
};
const shorthandToJSONSchema = (rules, basePath = "") => {
const schema = { type: "object" };
rules.map(upgradeToRule).forEach(([file, def]) => {
let ref = schema;
if (!basePath.endsWith("/")) {
basePath += "/";
}
let dirname = file;
// remove file prefix if matches basePath
if (file.startsWith(basePath)) {
dirname = file.slice(basePath.length);
}
dirname.split("/").forEach((dir, i, dirs) => {
if (dirs.length - 1 === i) {
return;
}
ref.required = ref.required || [];
if (!ref.required.includes("directories")) {
ref.required.push("directories");
}
ref.properties = ref.properties || {};
ref.properties.directories = (ref.properties.directories ||
{});
ref.properties.directories.properties =
ref.properties.directories.properties || {};
ref.properties.directories.properties[dir] = ref.properties.directories
.properties[dir] || { type: "object" };
ref.properties.directories.type = "object";
ref.properties.directories.required =
ref.properties.directories.required || [];
if (!ref.properties.directories.required.includes(dir)) {
ref.properties.directories.required.push(dir);
}
ref = ref.properties.directories.properties[dir];
});
const filename = path_1.default.basename(file);
ref.properties = ref.properties || {};
ref.properties.files = (ref.properties.files || {});
ref.properties.files.properties = ref.properties.files.properties || {};
ref.properties.files.properties[filename] = ref.properties.files.properties[filename] || { type: "object" };
ref.properties.files.properties[filename] = {
// @ts-ignore TODO handle case where JSONDefinition is boolean
...ref.properties.files.properties[filename],
// @ts-ignore TODO handle case where JSONDefinition is boolean
...def,
};
ref.properties.files.type = "object";
ref.properties.files.required = ref.properties.files.required || [];
if (!ref.properties.files.required.includes(filename)) {
ref.properties.files.required.push(filename);
}
});
return schema;
};
exports.shorthandToJSONSchema = shorthandToJSONSchema;