@nestia/sdk
Version:
Nestia SDK and Swagger generator
84 lines • 3.36 kB
JavaScript
;
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