@backland/schema
Version:
TypeScript schema declaration and validation library with static type inference
112 lines (111 loc) • 3.48 kB
JavaScript
;
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