@nestia/sdk
Version:
Nestia SDK and Swagger generator
111 lines • 9.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SdkWebSocketRouteProgrammer = void 0;
const factory_1 = require("@ttsc/factory");
const IdentifierFactory_1 = require("../../factories/IdentifierFactory");
const StringUtil_1 = require("../../utils/StringUtil");
const FilePrinter_1 = require("./FilePrinter");
const SdkImportWizard_1 = require("./SdkImportWizard");
const SdkWebSocketNamespaceProgrammer_1 = require("./SdkWebSocketNamespaceProgrammer");
const SdkWebSocketParameterProgrammer_1 = require("./SdkWebSocketParameterProgrammer");
var SdkWebSocketRouteProgrammer;
(function (SdkWebSocketRouteProgrammer) {
SdkWebSocketRouteProgrammer.write = (project) => (importer) => (route) => [
FilePrinter_1.FilePrinter.description(writeFunction(project)(importer)(route), writeDescription(route)),
SdkWebSocketNamespaceProgrammer_1.SdkWebSocketNamespaceProgrammer.write(project)(importer)(route),
];
const writeDescription = (route) => {
// MAIN DESCRIPTION
const comments = route.description
? route.description.split("\n")
: [];
// COMMENT TAGS
const tags = route.jsDocTags.filter((tag) => tag.name !== "param" ||
[...route.pathParameters, ...(route.query ? [route.query] : [])]
.filter((p) => p.category === "param" || p.category === "query")
.some((p) => { var _a, _b; return p.name === ((_b = (_a = tag.text) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.text); }));
if (tags.length !== 0) {
const content = tags.map((t) => { var _a; return ((_a = t.text) === null || _a === void 0 ? void 0 : _a.length)
? `@${t.name} ${t.text.map((e) => e.text).join("")}`
: `@${t.name}`; });
comments.push("", ...new Set(content));
}
// POSTFIX
if (!!comments.length)
comments.push("");
comments.push(`@controller ${route.controller.class.name}.${route.name}`, `@path ${route.path}`, `@nestia Generated by Nestia - https://github.com/samchon/nestia`);
return comments.join("\n");
};
const writeFunction = (project) => (importer) => (route) => {
const connection = StringUtil_1.StringUtil.escapeDuplicate([route.name])("connection");
return factory_1.factory.createFunctionDeclaration([
factory_1.factory.createModifier(factory_1.SyntaxKind.ExportKeyword),
factory_1.factory.createModifier(factory_1.SyntaxKind.AsyncKeyword),
], undefined, route.name, undefined, [
IdentifierFactory_1.IdentifierFactory.parameter(connection, factory_1.factory.createTypeReferenceNode(SdkImportWizard_1.SdkImportWizard.IConnection(importer), [factory_1.factory.createTypeReferenceNode(`${route.name}.Header`)])),
...SdkWebSocketParameterProgrammer_1.SdkWebSocketParameterProgrammer.getParameterDeclarations({
project,
route,
provider: true,
prefix: true,
}),
], factory_1.factory.createTypeReferenceNode("Promise", [
factory_1.factory.createTypeReferenceNode(`${route.name}.Output`),
]), factory_1.factory.createBlock(writeFunctionBody(project)(importer)(route)(connection), true));
};
const writeFunctionBody = (project) => (importer) => (route) => (connection) => {
const access = (key) => project.config.keyword === true
? factory_1.factory.createPropertyAccessExpression(factory_1.factory.createIdentifier("props"), key)
: factory_1.factory.createIdentifier(key);
return [
local("url")(factory_1.factory.createTypeReferenceNode("string"))(joinPath(connection, factory_1.factory.createCallExpression(factory_1.factory.createPropertyAccessExpression(factory_1.factory.createIdentifier(route.name), "path"), [], project.config.keyword === true &&
SdkWebSocketParameterProgrammer_1.SdkWebSocketParameterProgrammer.isPathEmpty(route) === false
? [factory_1.factory.createIdentifier("props")]
: SdkWebSocketParameterProgrammer_1.SdkWebSocketParameterProgrammer.getEntries({
project,
route,
provider: false,
prefix: true,
}).map((p) => factory_1.factory.createIdentifier(p.key))))),
local("connector")(factory_1.factory.createTypeReferenceNode(importer.external({
declaration: false,
file: "tgrid",
type: "element",
name: "WebSocketConnector",
}), [
factory_1.factory.createTypeReferenceNode(`${route.name}.Header`),
factory_1.factory.createTypeReferenceNode(`${route.name}.Provider`),
factory_1.factory.createTypeReferenceNode(`${route.name}.Listener`),
]))(factory_1.factory.createNewExpression(factory_1.factory.createIdentifier(importer.external({
declaration: false,
file: "tgrid",
type: "element",
name: "WebSocketConnector",
})), undefined, [
factory_1.factory.createAsExpression(factory_1.factory.createBinaryExpression(factory_1.factory.createPropertyAccessExpression(factory_1.factory.createIdentifier(connection), "headers"), factory_1.factory.createToken(factory_1.SyntaxKind.QuestionQuestionToken), factory_1.factory.createObjectLiteralExpression([], false)), factory_1.factory.createKeywordTypeNode(factory_1.SyntaxKind.AnyKeyword)),
access("provider"),
])),
factory_1.factory.createExpressionStatement(factory_1.factory.createAwaitExpression(factory_1.factory.createCallExpression(factory_1.factory.createPropertyAccessExpression(factory_1.factory.createIdentifier("connector"), "connect"), undefined, [factory_1.factory.createIdentifier("url")]))),
local("driver")(factory_1.factory.createTypeReferenceNode(importer.external({
declaration: true,
file: "tgrid",
type: "element",
name: "Driver",
}), [factory_1.factory.createTypeReferenceNode(`${route.name}.Listener`)]))(factory_1.factory.createCallExpression(factory_1.factory.createPropertyAccessExpression(factory_1.factory.createIdentifier("connector"), "getDriver"), undefined, undefined)),
factory_1.factory.createReturnStatement(factory_1.factory.createObjectLiteralExpression([
factory_1.factory.createShorthandPropertyAssignment("connector"),
factory_1.factory.createShorthandPropertyAssignment("driver"),
factory_1.factory.createPropertyAssignment(factory_1.factory.createIdentifier("reconnect"), factory_1.factory.createArrowFunction([factory_1.factory.createToken(factory_1.SyntaxKind.AsyncKeyword)], undefined, [], undefined, factory_1.factory.createToken(factory_1.SyntaxKind.EqualsGreaterThanToken), factory_1.factory.createAwaitExpression(factory_1.factory.createCallExpression(factory_1.factory.createPropertyAccessExpression(factory_1.factory.createIdentifier("connector"), factory_1.factory.createIdentifier("connect")), undefined, [factory_1.factory.createIdentifier("url")])))),
], true)),
];
};
})(SdkWebSocketRouteProgrammer || (exports.SdkWebSocketRouteProgrammer = SdkWebSocketRouteProgrammer = {}));
const local = (name) => (type) => (expression) => factory_1.factory.createVariableStatement([], factory_1.factory.createVariableDeclarationList([factory_1.factory.createVariableDeclaration(name, undefined, type, expression)], factory_1.NodeFlags.Const));
const joinPath = (connection, caller) => factory_1.factory.createTemplateExpression(factory_1.factory.createTemplateHead("", ""), [
factory_1.factory.createTemplateSpan(factory_1.factory.createConditionalExpression(factory_1.factory.createCallExpression(factory_1.factory.createPropertyAccessExpression(factory_1.factory.createPropertyAccessExpression(factory_1.factory.createIdentifier(connection), factory_1.factory.createIdentifier("host")), factory_1.factory.createIdentifier("endsWith")), undefined, [factory_1.factory.createStringLiteral("/")]), factory_1.factory.createToken(factory_1.SyntaxKind.QuestionToken), factory_1.factory.createCallExpression(factory_1.factory.createPropertyAccessExpression(factory_1.factory.createPropertyAccessExpression(factory_1.factory.createIdentifier(connection), factory_1.factory.createIdentifier("host")), factory_1.factory.createIdentifier("substring")), undefined, [
factory_1.factory.createNumericLiteral("0"),
factory_1.factory.createBinaryExpression(factory_1.factory.createPropertyAccessExpression(factory_1.factory.createPropertyAccessExpression(factory_1.factory.createIdentifier(connection), factory_1.factory.createIdentifier("host")), factory_1.factory.createIdentifier("length")), factory_1.factory.createToken(factory_1.SyntaxKind.MinusToken), factory_1.factory.createNumericLiteral("1")),
]), factory_1.factory.createToken(factory_1.SyntaxKind.ColonToken), factory_1.factory.createPropertyAccessExpression(factory_1.factory.createIdentifier(connection), factory_1.factory.createIdentifier("host"))), factory_1.factory.createTemplateMiddle("")),
factory_1.factory.createTemplateSpan(caller, factory_1.factory.createTemplateTail("")),
]);
//# sourceMappingURL=SdkWebSocketRouteProgrammer.js.map