UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

217 lines 17.4 kB
export function isObject(data) { if (!data) return false; if (Array.isArray(data)) return false; return typeof data === "object"; } export function isString(data) { return typeof data === "string"; } export function isNumber(data) { return typeof data === "number"; } export function isBoolean(data) { return typeof data === "boolean"; } export function isArrayBuffer(data) { if (!data) return false; return data instanceof ArrayBuffer; } export function isStringArray(data) { if (!Array.isArray(data)) return false; for (const item of data) { if (!isString(item)) return false; } return true; } export function assertNumber(data, name = "data") { if (!isNumber(data)) { throw new TypeError(`${name} was expected to be a number but we got ${typeof data}!`); } } export function assertString(data, name = "data") { if (!isString(data)) { throw new TypeError(`${name} was expected to be a string but we got ${typeof data}!`); } } export function assertOptionalString(data, name = "data") { if (data && !isString(data)) { throw new TypeError(`${name} was expected to be a string but we got ${typeof data}!`); } } export function assertBoolean(data, name = "data") { if (!isBoolean(data)) { throw new TypeError(`${name} was expected to be a boolean but we got ${typeof data}!`); } } export function assertObject(data, name = "data") { if (!isObject(data)) { throw new TypeError(`${name} was expected to be an object but we got ${typeof data}!`); } } export function assertArray(data, name = "data") { if (!Array.isArray(data)) { throw new TypeError(`${name} was expected to be an Array but we got ${typeof data}!`); } } export function assertArrayBuffer(data, name = "data") { if (!isArrayBuffer(data)) { throw new TypeError(`${name} was expected to be an ArrayBuffer but we got ${typeof data}!`); } } export function assertOptionalArrayBuffer(data, name = "data") { if (data && !isArrayBuffer(data)) { throw new TypeError(`${name} was expected to be an ArrayBuffer but we got ${typeof data}!`); } } export function isType(data, type) { try { assertType(data, type); return true; } catch (_a) { return false; } } export function assertType(data, type, prefix = "data") { if (type === "unknown") return; if (type === "null") { if (data !== null) { throw new TypeError(`Expected ${prefix} to be null and not a ${typeof data}!`); } return; } if (typeof type === "string") { if (typeof data !== type) { throw new TypeError(`Expected ${prefix} to be a ${type} and not a ${typeof data}!`); } return; } if (Array.isArray(type)) { const [kind] = type; switch (kind) { case "array": assertTypeArray(data, prefix, type); return; case "map": assertTypeMap(data, prefix, type); return; case "?": assertTypeOptional(data, prefix, type); return; case "|": assertTypeAlternative(data, prefix, type); return; case "tuple": assertTypeTuple(data, prefix, type); return; case "partial": assertTypePartial(data, prefix, type); return; case "literal": assertTypeLiteral(data, prefix, type); return; default: if (kind.startsWith("array(")) { const size = Number.parseInt(kind.slice("array(".length, -1), 10); assertTypeArrayWithDimension(data, prefix, type, size); return; } throw new TypeError(`Don't know how to create a type guard for this kind of type: ${JSON.stringify(type)}`); } } if (typeof data !== "object") throw new TypeError(`Expected ${prefix} to be an object and not a ${typeof data}!`); const object = data; for (const name of Object.keys(type)) { if (typeof name !== "string") continue; assertType(object[name], type[name], `${prefix}.${name}`); } } function assertTypeTuple(data, prefix, [, ...types]) { assertArray(data); if (types.length !== data.length) { throw new TypeError(`Expected ${prefix} to have ${types.length} elements, not ${data.length}!`); } for (const [index, type_] of types.entries()) { const type = type_; assertType(data[index], type, `${prefix}[$i]`); } } function assertTypePartial(data, prefix, [, type]) { assertObject(data, prefix); for (const name of Object.keys(type)) { if (typeof name !== "string") continue; const attrib = data[name]; if (attrib !== undefined) { assertType(attrib, type[name], `${prefix}.${name}`); } } } function assertTypeArray(data, prefix, type) { if (!Array.isArray(data)) throw new TypeError(`Expected ${prefix} to be an array and not a ${typeof data}!`); const [, subType] = type; for (const [index, datum] of data.entries()) { assertType(datum, subType, `${prefix}[${index}]`); } } function assertTypeArrayWithDimension(data, prefix, type, size) { if (!Array.isArray(data)) throw new TypeError(`Expected ${prefix} to be an array and not a ${typeof data}!`); if (data.length !== size) throw new TypeError(`${prefix} was expected to have a length of ${size}, but we got ${data.length}!`); const [, subType] = type; for (const [index, datum] of data.entries()) { assertType(datum, subType, `${prefix}[${index}]`); } } function assertTypeMap(data, prefix, type) { if (!isObject(data)) throw new TypeError(`Expected ${prefix} to be an object and not a ${typeof data}!`); const [, subType] = type; for (const key of Object.keys(data)) { if (typeof key === "string") { assertType(data[key], subType, `${prefix}[${key}]`); } } } function assertTypeOptional(data, prefix, type) { if (data === undefined) return; const [, optionalType] = type; assertType(data, optionalType, prefix); } function assertTypeAlternative(data, prefix, type) { const [, ...altTypes] = type; let lastException = new Error(`No type has been defined for this alternative: ${JSON.stringify(type)}!`); for (const altType of altTypes) { try { assertType(data, altType, prefix); return; } catch (error) { if (error instanceof Error) lastException = error; } } throw lastException; } function assertTypeLiteral(data, prefix, type) { const [, ...literals] = type; for (const literal of literals) { if (data === literal) return; } throw new TypeError(`Expected ${prefix} to be a literal (${literals .map(item => `"${item}"`) .join(" | ")})!`); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhcmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2d1YXJkcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFVBQVUsUUFBUSxDQUFDLElBQWE7SUFDbEMsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUN2QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDckMsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUE7QUFDbkMsQ0FBQztBQUVELE1BQU0sVUFBVSxRQUFRLENBQUMsSUFBYTtJQUNsQyxPQUFPLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQTtBQUNuQyxDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxJQUFhO0lBQ2xDLE9BQU8sT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFBO0FBQ25DLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQWE7SUFDbkMsT0FBTyxPQUFPLElBQUksS0FBSyxTQUFTLENBQUE7QUFDcEMsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsSUFBYTtJQUN2QyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBQ3ZCLE9BQU8sSUFBSSxZQUFZLFdBQVcsQ0FBQTtBQUN0QyxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFhO0lBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFBO0lBQ3RDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQTtJQUNyQyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUE7QUFDZixDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FDeEIsSUFBYSxF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