UNPKG

@nestia/sdk

Version:

Nestia SDK and Swagger generator

84 lines 3.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AccessorAnalyzer = void 0; const utils_1 = require("@typia/utils"); var AccessorAnalyzer; (function (AccessorAnalyzer) { AccessorAnalyzer.analyze = (routes) => { var _b; shrink(routes); variable(routes); shrink(routes); for (const r of routes) r.name = (_b = r.accessor.at(-1)) !== null && _b !== void 0 ? _b : r.name; }; const prepare = (routeList) => { const dict = new Map(); for (const route of routeList) route.accessor.forEach((_a, i) => { var _b; const key = route.accessor.slice(0, i + 1).join("."); dict.set(key, ((_b = dict.get(key)) !== null && _b !== void 0 ? _b : 0) + 1); }); return dict; }; const variable = (routeList) => { const reserved = reserve(routeList); const assigned = new Map(); const used = new Set(); for (const route of routeList) { const emended = []; route.accessor.forEach((accessor, i) => { const source = route.accessor.slice(0, i + 1).join("."); const registered = assigned.get(source); if (registered !== undefined) { emended.push(registered.split(".").at(-1)); return; } accessor = normalize(accessor); while (utils_1.NamingConvention.variable(accessor) === false) accessor = "_" + accessor; while (true) { const partial = [...emended, accessor].join("."); if (used.has(partial) === false && (reserved.has(partial) === false || partial === source)) { assigned.set(source, partial); used.add(partial); emended.push(accessor); break; } accessor = "_" + accessor; } }); route.accessor.splice(0, route.accessor.length, ...emended); } }; const reserve = (routeList) => { const output = new Set(); for (const route of routeList) route.accessor.forEach((_a, i) => { const partial = route.accessor.slice(0, i + 1); if (partial.every(utils_1.NamingConvention.variable)) output.add(partial.join(".")); }); return output; }; const normalize = (accessor) => { const output = accessor.replace(/[^A-Za-z0-9_$]/g, "_"); return output.length ? output : "_"; }; const shrink = (routeList) => { var _b; const dict = prepare(routeList); for (const route of routeList) { if (route.accessor.length < 2 || route.accessor.at(-1) !== route.accessor.at(-2)) continue; const cut = route.accessor.slice(0, -1); if (((_b = dict.get(cut.join("."))) !== null && _b !== void 0 ? _b : 0) > 1) continue; route.accessor = cut; } }; })(AccessorAnalyzer || (exports.AccessorAnalyzer = AccessorAnalyzer = {})); //# sourceMappingURL=AccessorAnalyzer.js.map