UNPKG

@backland/schema

Version:

TypeScript schema declaration and validation library with static type inference

112 lines (111 loc) 3.48 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.defaultTypesDest = void 0; exports.moduleWrapper = moduleWrapper; exports.tsfyWriter = tsfyWriter; var _path = _interopRequireDefault(require("path")); var _utils = require("@backland/utils"); var _fsExtra = require("fs-extra"); var _GraphType = require("../GraphType/GraphType"); var _ObjectType = require("../ObjectType"); var _tsfy = require("./tsfy"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const defaultTypesDest = _path.default.resolve(_utils.Process.cwd(), 'generated/backland.d.ts'); exports.defaultTypesDest = defaultTypesDest; function tsfyWriter(options = {}) { const { wrappers, dest = defaultTypesDest, writeThrottleMS = 3000, moduleName = 'backland', store = (0, _utils.createStore)() } = options; options.dest = dest; options.writeThrottleMS = writeThrottleMS; options.store = store; const context = (0, _tsfy.createTSFYContext)({ ...options }); options.context = context; const wrapper = moduleWrapper({ moduleName, extra: wrappers }); let delayRef = undefined; function add(value) { clearTimeout(delayRef); const hash = (0, _utils.simpleObjectHash)(value); store.set(hash, value); if (_GraphType.GraphType.is(value) && value.optionalId) { const id = value.optionalId; context.header[`hash_declare_type_${id}`] = `declare function createType(name: '${id}', ...params: unknown[]): T${id}Type;`; } if (_ObjectType.ObjectType.is(value) && value.id) { const id = value.id; context.header[`hash_declare_object_${id}`] = `declare function createObject(name: '${id}', ...params: unknown[]): T${id}Object;`; } return { hash }; } function remove(value) { clearTimeout(delayRef); const hash = (0, _utils.simpleObjectHash)(value); const { index } = store.remove(hash); return { hash, index }; } function toString() { const values = store.entries.map(el => el[1]); return (0, _tsfy.tsfy)(values, { ...options, context, many: true }).toString({ prettier: (options === null || options === void 0 ? void 0 : options.prettify) ?? true }).then(res => { const wrapped = wrapper(res); return wrapped; }); } function writeAll() { delayRef = setTimeout(() => { toString().catch(console.error); }, writeThrottleMS); } function listen() { (0, _fsExtra.ensureFileSync)(dest); store.onRemove(function onRemove({}) { clearTimeout(delayRef); writeAll(); }); store.onSet(function onSet({}) { clearTimeout(delayRef); writeAll(); }); return store; } return { toString, listen, add, remove, store }; } function moduleWrapper(init) { const { extra, moduleName } = init; return function wrap(body) { return ['/* tslint-disable */', '/* tslint:disable */', '/* eslint-disable */', 'declare global {', ` module '${moduleName}' {`, ` export * from '${moduleName}';`, extra === null || extra === void 0 ? void 0 : extra.map(([open]) => open).join('\n'), ` import { GraphType, ObjectType } from 'backland';`, body, extra === null || extra === void 0 ? void 0 : extra.map(([_, closer]) => closer).join('\n'), `}\n}`].filter(el => typeof el === 'string').join('\n'); }; } //# sourceMappingURL=tsfyWriter.js.map