@nestia/sdk
Version:
Nestia SDK and Swagger generator
103 lines • 4.61 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SdkHttpCloneReferencer = void 0;
const legacy_1 = require("../../internal/legacy");
const StringUtil_1 = require("../../utils/StringUtil");
const SdkHttpParameterProgrammer_1 = require("./SdkHttpParameterProgrammer");
const SdkWebSocketCloneProgrammer_1 = require("./SdkWebSocketCloneProgrammer");
var SdkHttpCloneReferencer;
(function (SdkHttpCloneReferencer) {
SdkHttpCloneReferencer.replace = (app, websocket = new Set()) => {
const directory = `${app.project.config.output}/structures`;
for (const route of app.routes)
if (route.protocol === "http")
visitHttpRoute({
directory,
route,
});
else if (route.protocol === "websocket")
visitWebSocketRoute({
cloned: websocket,
directory,
route,
});
};
const visitHttpRoute = (props) => {
const unique = new Set();
for (const p of SdkHttpParameterProgrammer_1.SdkHttpParameterProgrammer.getSignificant(props.route, true))
visitType({
unique,
metadata: p.metadata,
type: p.type,
name: (name) => (p.type = { name }),
});
for (const v of Object.values(props.route.exceptions))
visitType({
unique,
metadata: v.metadata,
type: v.type,
name: (name) => (v.type = { name }),
});
if (props.route.success.binary === false)
visitType({
unique,
metadata: props.route.success.metadata,
type: props.route.success.type,
name: (name) => (props.route.success.type = { name }),
});
props.route.imports = Array.from(unique).map((str) => ({
file: `${props.directory}/${str}`,
asterisk: null,
default: null,
elements: [str],
}));
};
const visitWebSocketRoute = (props) => {
var _a;
var _b;
const unique = new Map();
const keep = [];
for (const imp of props.route.imports) {
const cloned = SdkWebSocketCloneProgrammer_1.SdkWebSocketCloneProgrammer.isNodeModulesPath(imp.file)
? []
: imp.elements.filter((elem) => {
var _a;
var _b;
const imported = (_b = (_a = imp.elementAliases) === null || _a === void 0 ? void 0 : _a[elem]) !== null && _b !== void 0 ? _b : elem;
return props.cloned.has(SdkWebSocketCloneProgrammer_1.SdkWebSocketCloneProgrammer.importKey(imp.file, imported));
});
const remained = imp.elements.filter((elem) => cloned.includes(elem) === false);
for (const elem of cloned)
unique.set(elem, (_b = (_a = imp.elementAliases) === null || _a === void 0 ? void 0 : _a[elem]) !== null && _b !== void 0 ? _b : elem);
if (imp.asterisk !== null ||
imp.default !== null ||
remained.length !== 0)
keep.push(Object.assign(Object.assign({}, imp), { elements: remained }));
}
props.route.imports = [
...keep,
...Array.from(unique).map(([local, imported]) => (Object.assign({ file: `${props.directory}/${imported}`, asterisk: null, default: null, elements: [local] }, (local === imported
? {}
: { elementAliases: { [local]: imported } })))),
];
};
const visitType = (p) => {
const enroll = (key) => {
if (key.length && StringUtil_1.StringUtil.isImplicit(key) === false)
p.unique.add(key.split(".")[0]);
};
for (const alias of p.metadata.aliases)
enroll(alias.type.name);
for (const array of p.metadata.arrays)
enroll(array.type.name);
for (const tuple of p.metadata.tuples)
enroll(tuple.type.name);
for (const object of p.metadata.objects)
enroll(object.type.name);
p.name((0, legacy_1.nameOf)(p.metadata));
};
})(SdkHttpCloneReferencer || (exports.SdkHttpCloneReferencer = SdkHttpCloneReferencer = {}));
const getFullText = (type) => type.typeArguments === undefined
? type.name
: `${type.name}<${type.typeArguments.map(getFullText).join(", ")}>`;
//# sourceMappingURL=SdkHttpCloneReferencer.js.map