UNPKG

pg-proto-parser

Version:
77 lines (76 loc) 2.98 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getDependents = exports.getDependencies = void 0; const types_1 = require("./types"); const constants_1 = require("../constants"); const dependenciesResolve = (types, enums, symbolName, resolved, unresolved) => { if (symbolName === constants_1.NODE_TYPE) return; unresolved.push(symbolName); let dep = [...types, ...enums].find(dep => dep.name === symbolName); if (!dep) { throw new Error(`Dependency Not Found ${symbolName}`); } const depAsType = types.find(t => t.name === dep.name); if (depAsType) { const fields = Object.values(depAsType.fields); for (let i = 0; i < fields.length; i++) { const childDep = fields[i]; if (!resolved.includes(childDep.type)) { if (unresolved.includes(childDep.type)) { // console.warn(`Circular reference detected ${symbolName}, ${dep}`); continue; } if (!(0, types_1.isPrimitiveType)(childDep.type)) { dependenciesResolve(types, enums, childDep.type, resolved, unresolved); } } } } resolved.push(symbolName); const index = unresolved.indexOf(symbolName); unresolved.splice(index); }; const getDependencies = (name, types, enums) => { const resolved = []; const unresolved = []; dependenciesResolve(types, enums, name, resolved, unresolved); return resolved; }; exports.getDependencies = getDependencies; const dependentsResolve = (types, enums, symbolName, resolved, unresolved) => { if (symbolName === constants_1.NODE_TYPE) return; unresolved.push(symbolName); [...types, ...enums].forEach(dep => { if (resolved.includes(dep.name) || unresolved.includes(dep.name)) { return; } const depAsType = types.find(t => t.name === dep.name); let isDependent = false; if (depAsType) { const fields = Object.values(depAsType.fields); isDependent = fields.some(field => field.type === symbolName); } if (isDependent) { if (unresolved.includes(dep.name)) { throw new Error(`Circular reference detected: ${symbolName} <-> ${dep.name}`); } dependentsResolve(types, enums, dep.name, resolved, unresolved); } }); if (!resolved.includes(symbolName)) { resolved.push(symbolName); } const index = unresolved.indexOf(symbolName); if (index !== -1) { unresolved.splice(index, 1); } }; const getDependents = (symbolName, types, enums) => { const resolved = []; const unresolved = []; dependentsResolve(types, enums, symbolName, resolved, unresolved); return resolved.filter(name => name !== symbolName); // Exclude the symbol itself from its dependents }; exports.getDependents = getDependents;