mirror of
https://github.com/Start9Labs/start-sdk.git
synced 2026-03-30 04:11:57 +00:00
103 lines
3.6 KiB
JavaScript
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() { }
|
|
}
|