UNPKG

@backland/schema

Version:

TypeScript schema declaration and validation library with static type inference

207 lines (206 loc) 8.01 kB
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } import { hashString } from '@backland/utils'; import { CircularDeps } from '../CircularDeps'; import { GraphType } from '../GraphType/GraphType'; import { ObjectType } from '../ObjectType'; import { isFieldTypeName } from '../fields/fieldTypes'; import { parseTSFyValue } from './parseTSFyValue'; export var tsfy_defaults = { iterationLimit: 5000 }; export function tsfy(input, config) { var context = createTSFYContext(config || {}); var { groupInTypeThreshold, iterationLimit, many } = context.config; var header = new Set(); var footer = new Set(); var entries = (() => { if (many) { if (Array.isArray(input)) { return input; } else { throw new Error("tsfy: expected input value to be an array when options.many is true."); } } return [input]; })(); function getParts() { return _getParts.apply(this, arguments); } function _getParts() { _getParts = _asyncToGenerator(function* () { var body = yield _asyncToGenerator(function* () { // function runPart(_x2) { return _runPart.apply(this, arguments); } function _runPart() { _runPart = _asyncToGenerator(function* (part) { var ref = yield parseTSFyValue(part, context); return resolvePart(ref, undefined, 0); }); return _runPart.apply(this, arguments); } var parts = yield awaitAll(entries.map(runPart)); return parts.join('\n'); })(); Object.values(context.header).forEach(el => header.add(el)); return { header, body, footer }; }); return _getParts.apply(this, arguments); } function toString(_x) { return _toString.apply(this, arguments); } function _toString() { _toString = _asyncToGenerator(function* (options) { var { name, prettier, wrapper = ['', ''] } = options || {}; var { footer, header, body } = yield getParts(); if (name) { return [wrapper[0], ...header.values(), "export type ".concat(name, " = ").concat(body, ";"), ...footer.values(), wrapper[1]].filter(Boolean).join('\n'); } var res = [wrapper[0], ...header.values(), ...footer.values(), wrapper[1]].filter(Boolean).join('\n'); if (prettier) { return CircularDeps.prettier.format(res, { parser: 'typescript' }); } return res; }); return _toString.apply(this, arguments); } function resolvePart(ref, hash, count) { if (count > iterationLimit) { throw new Error("tsfy: Maximum number of iterations (".concat(iterationLimit, ") exceeded.")); } else { count += 1; } var contextRef = hash ? context.refs[hash] : undefined; if (contextRef) { if (contextRef.result !== undefined) return contextRef.result; } if (Array.isArray(ref)) { var res = ref.map(rr => resolvePart(rr, undefined, count)); var body = res.join(''); if (contextRef) { contextRef.result = body; } return body; } var value = (() => { if (typeof ref === 'string') return ref; if (ref.result !== undefined) return ref.result; /** * Complex ref */ var parts = ref.parts; var res = resolvePart(parts, ref.hash, count); ref.result = res; var shouldGroupInOneType = ref.count >= groupInTypeThreshold; if (shouldGroupInOneType || ref.identifier) { var hashed = "".concat(hashString(ref.result)).slice(0, 6); var named = ref.identifier || "T".concat(hashed); var prefix = ref.identifier ? "export type ".concat(ref.identifier, " = ") : "type ".concat(named, " = "); if (ref.identifier) { header.add("".concat(prefix, " ").concat(res, ";\n")); } else { footer.add("".concat(prefix, " ").concat(res, ";")); } return named; } return res; })(); if (hash) { context.refs[hash].result = value; } return value; } return { toString, getParts }; } export function getTSFyIdentifier(value) { if (!value) return undefined; if (typeof value !== 'object') return undefined; if (value.__isEntity === true) { return "T".concat(value.name, "Entity"); } if (GraphType.is(value) && value.optionalId) { return "T".concat(value.optionalId, "Type"); } if (ObjectType.is(value)) { return value.id ? "T".concat(value.id, "Object") : undefined; } if (isFieldTypeName(value.type) && typeof value.name === 'string') { return "T".concat(value.name, "Field"); } return undefined; } export function createTSfyRef(hash, identifier) { var ref = { identifier, hash, result: undefined, count: 1, parts: [] }; return ref; } export function createTSFYContext(config) { var { iterationLimit = tsfy_defaults.iterationLimit, many = false, groupInTypeThreshold = 2 } = config || {}; var context = _objectSpread({ refs: {}, header: {}, config: _objectSpread({ context: undefined, groupInTypeThreshold, iterationLimit, many }, config) }, config.context); context.config.context = context; return context; } function awaitAll(_x3) { return _awaitAll.apply(this, arguments); } // export type _ResolveParts = (options: { // ref: TSFYPart; // hash: string | undefined; // count: number; // }) => Promise<string>; function _awaitAll() { _awaitAll = _asyncToGenerator(function* (promises) { for (var key in promises) { promises[key] = yield promises[key]; } return promises; }); return _awaitAll.apply(this, arguments); } //# sourceMappingURL=tsfy.js.map