UNPKG

@backland/schema

Version:

TypeScript schema declaration and validation library with static type inference

199 lines (194 loc) 5.16 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CircularDeps = void 0; var _utils = require("@backland/utils"); var _fieldTypeNames = require("./fields/fieldTypeNames"); /* * Handles circular dependencies with type safety */ const nodeModule = typeof module !== undefined ? module : undefined; function getModules() { const sharedCode = { GraphType: { module: () => require('./GraphType/GraphType'), server: false }, fieldInstanceFromDef: { module: () => require('./fieldInstanceFromDef'), server: false }, MetaField: { module: () => require('./fields/MetaFieldField'), server: false }, ObjectType: { module: () => require('./ObjectType'), server: false }, fieldTypes: { module: () => require('./fields/fieldTypes'), server: false }, implementObject: { module: () => require('./implementObject'), server: false }, mockObject: { module: () => require('./mockObject'), server: false } }; const serverCode = { tsfy: { // @only-server module: () => require('./tsfy'), server: true }, GraphQLParser: { // @only-server module: () => // @only-server require('./GraphType/GraphQLParser'), server: true }, fs: { // @only-server module: () => // @only-server require('fs-extra'), server: true }, parsePhoneNumberServerSide: { // @only-server module: () => // @only-server require('@backland/utils/lib/parsePhoneNumber'), server: true }, clientUtils: { // @only-server module: () => require('./GraphType/generateClientUtils'), server: true }, createGraphQLSchema: { // @only-server module: () => require('./createGraphQLSchema'), server: true }, createResolver: { // @only-server module: () => require('./Resolver'), server: true }, getQueryTemplates: { // @only-server module: () => require('./GraphType/getQueryTemplates'), server: true }, objectToTypescript: { // @only-server module: () => { try { // too big to include in bundles // @only-server return (0, _utils.dynamicRequire)('./objectToTypescript', nodeModule); } catch (e) { return function objectToTypescript() { throw new Error('⚠️ Backland.objectToTypescript is not available when bundled.\n' + e.stack); }; } }, server: true }, prettier: { // @only-server module: () => { try { // too big to include in bundled code // @only-server return (0, _utils.dynamicRequire)('prettier', nodeModule); } catch (e) { return { format(code) { console.warn('⚠️ Backland.prettier is not available when bundled.' + e.stack); return code; } }; } }, server: true }, typesWriter: { // @only-server module: () => { return require('./typesWriter'); }, server: true } }; return { ...serverCode, ...sharedCode, // shared should override others graphql: { // @only-server module: () => require('graphql'), // Too big to show in logs, let at last position server: true } }; } const cache = new Map(); function get(key) { let existing = cache.get(key); if (cache.has(key)) return existing; const modules = getModules(); Object.entries(modules).forEach(([_key, value]) => { var _mainModule; if (cache.has(_key)) return; // parser -> parser // parser -> vizinho if ((0, _utils.isBrowser)() && value.server) { cache.set(_key, undefined); return; } const moduleObject = value.module(); if (!moduleObject) { return; } let mainModule = moduleObject.default ? moduleObject.default : moduleObject; if ((_mainModule = mainModule) !== null && _mainModule !== void 0 && _mainModule[_key]) { mainModule = mainModule[_key]; } Object.entries(moduleObject || {}).forEach(([subKey, subModule]) => { if (subKey !== _key) { cache.set(subKey, subModule); } if (typeof mainModule === 'function' && mainModule[subKey] === undefined) { mainModule[subKey] = subModule; } }); cache.set(_key, mainModule); }); const fieldTypes = modules.fieldTypes.module(); _fieldTypeNames.fieldTypeNames.forEach(key => { const creator = fieldTypes.create[key]; cache.set(key, creator); }); return cache.get(key); } const CircularDeps = new Proxy({}, { get(_, key) { const item = get(key); if (!item) { throw new _utils.RuntimeError(`${key} is not available at this environment.`, { validModules: [...cache.entries()].filter(el => el[1] !== undefined).map(el => el[0]) }); } return item; } }); exports.CircularDeps = CircularDeps; //# sourceMappingURL=CircularDeps.js.map