Files
start-sdk/lib/esm/deps/deno.land/std@0.140.0/encoding/_yaml/schema.js
2023-02-27 10:38:56 -07:00

103 lines
3.6 KiB
JavaScript

// Ported from js-yaml v3.13.1:
// https://github.com/nodeca/js-yaml/commit/665aadda42349dcae869f12040d9b10ef18d12da
// Copyright 2011-2015 by Vitaly Puzrin. All rights reserved. MIT license.
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
import { YAMLError } from "./error.js";
function compileList(schema, name, result) {
const exclude = [];
for (const includedSchema of schema.include) {
result = compileList(includedSchema, name, result);
}
for (const currentType of schema[name]) {
for (let previousIndex = 0; previousIndex < result.length; previousIndex++) {
const previousType = result[previousIndex];
if (previousType.tag === currentType.tag &&
previousType.kind === currentType.kind) {
exclude.push(previousIndex);
}
}
result.push(currentType);
}
return result.filter((_type, index) => !exclude.includes(index));
}
function compileMap(...typesList) {
const result = {
fallback: {},
mapping: {},
scalar: {},
sequence: {},
};
for (const types of typesList) {
for (const type of types) {
if (type.kind !== null) {
result[type.kind][type.tag] = result["fallback"][type.tag] = type;
}
}
}
return result;
}
export class Schema {
constructor(definition) {
Object.defineProperty(this, "implicit", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "explicit", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "include", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "compiledImplicit", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "compiledExplicit", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "compiledTypeMap", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.explicit = definition.explicit || [];
this.implicit = definition.implicit || [];
this.include = definition.include || [];
for (const type of this.implicit) {
if (type.loadKind && type.loadKind !== "scalar") {
throw new YAMLError("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");
}
}
this.compiledImplicit = compileList(this, "implicit", []);
this.compiledExplicit = compileList(this, "explicit", []);
this.compiledTypeMap = compileMap(this.compiledImplicit, this.compiledExplicit);
}
/* Returns a new extended schema from current schema */
extend(definition) {
return new Schema({
implicit: [
...new Set([...this.implicit, ...(definition?.implicit ?? [])]),
],
explicit: [
...new Set([...this.explicit, ...(definition?.explicit ?? [])]),
],
include: [...new Set([...this.include, ...(definition?.include ?? [])])],
});
}
static create() { }
}