@nestia/sdk
Version:
Nestia SDK and Swagger generator
122 lines • 10.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SdkWebSocketNamespaceProgrammer = void 0;
const factory_1 = require("@ttsc/factory");
const ExpressionFactory_1 = require("../../factories/ExpressionFactory");
const IdentifierFactory_1 = require("../../factories/IdentifierFactory");
const TypeFactory_1 = require("../../factories/TypeFactory");
const FilePrinter_1 = require("./FilePrinter");
const SdkAliasCollection_1 = require("./SdkAliasCollection");
const SdkWebSocketParameterProgrammer_1 = require("./SdkWebSocketParameterProgrammer");
var SdkWebSocketNamespaceProgrammer;
(function (SdkWebSocketNamespaceProgrammer) {
SdkWebSocketNamespaceProgrammer.write = (project) => (importer) => (route) => factory_1.factory.createModuleDeclaration([factory_1.factory.createToken(factory_1.SyntaxKind.ExportKeyword)], factory_1.factory.createIdentifier(route.name), factory_1.factory.createModuleBlock([
...writeTypes(project)(importer)(route),
FilePrinter_1.FilePrinter.enter(),
writePath(project)(route),
]), factory_1.NodeFlags.Namespace);
const writeTypes = (project) => (importer) => (route) => {
var _a, _b, _c, _d, _e, _f;
var _g, _h;
const output = [];
const declare = (name, type) => output.push(factory_1.factory.createTypeAliasDeclaration([factory_1.factory.createModifier(factory_1.SyntaxKind.ExportKeyword)], name, undefined, type));
if (project.config.keyword === true)
declare("Props", SdkAliasCollection_1.SdkAliasCollection.websocketProps(route));
declare("Output", factory_1.factory.createTypeLiteralNode([
factory_1.factory.createPropertySignature(undefined, "connector", undefined, factory_1.factory.createTypeReferenceNode(importer.external({
declaration: false,
file: "tgrid",
type: "element",
name: "WebSocketConnector",
}), [
factory_1.factory.createTypeReferenceNode("Header"),
factory_1.factory.createTypeReferenceNode("Provider"),
factory_1.factory.createTypeReferenceNode("Listener"),
])),
factory_1.factory.createPropertySignature(undefined, "driver", undefined, factory_1.factory.createTypeReferenceNode(importer.external({
declaration: true,
file: "tgrid",
type: "element",
name: "Driver",
}), [factory_1.factory.createTypeReferenceNode("Listener")])),
factory_1.factory.createPropertySignature(undefined, "reconnect", undefined, factory_1.factory.createFunctionTypeNode(undefined, [], factory_1.factory.createTypeReferenceNode(factory_1.factory.createIdentifier("Promise"), [factory_1.factory.createKeywordTypeNode(factory_1.SyntaxKind.VoidKeyword)]))),
]));
declare("Header", SdkAliasCollection_1.SdkAliasCollection.name({
type: ((_g = (_a = route.header) === null || _a === void 0 ? void 0 : _a.type) !== null && _g !== void 0 ? _g : (_b = route.acceptor.type.typeArguments) === null || _b === void 0 ? void 0 : _b[0]),
}));
declare("Provider", SdkAliasCollection_1.SdkAliasCollection.name({
type: (_h = (_d = (_c = route.driver) === null || _c === void 0 ? void 0 : _c.type.typeArguments) === null || _d === void 0 ? void 0 : _d[0]) !== null && _h !== void 0 ? _h : (_e = route.acceptor.type.typeArguments) === null || _e === void 0 ? void 0 : _e[2],
}));
declare("Listener", SdkAliasCollection_1.SdkAliasCollection.name({
type: (_f = route.acceptor.type.typeArguments) === null || _f === void 0 ? void 0 : _f[1],
}));
if (route.query)
declare("Query", SdkAliasCollection_1.SdkAliasCollection.name(route.query));
return output;
};
const writePath = (project) => (route) => {
const out = (body) => constant("path")(factory_1.factory.createArrowFunction([], [], SdkWebSocketParameterProgrammer_1.SdkWebSocketParameterProgrammer.getParameterDeclarations({
project,
route,
provider: false,
prefix: false,
}), undefined, undefined, body));
if (route.pathParameters.length === 0 && route.query === null)
return out(factory_1.factory.createStringLiteral(route.path));
const access = (key) => project.config.keyword === true
? factory_1.factory.createPropertyAccessExpression(factory_1.factory.createIdentifier("props"), key)
: factory_1.factory.createIdentifier(key);
const template = () => {
const split = route.path.split(":");
if (split.length === 1)
return factory_1.factory.createStringLiteral(route.path);
return factory_1.factory.createTemplateExpression(factory_1.factory.createTemplateHead(split[0]), split.slice(1).map((s, i, arr) => {
const name = s.split("/")[0];
return factory_1.factory.createTemplateSpan(factory_1.factory.createCallExpression(factory_1.factory.createIdentifier("encodeURIComponent"), undefined, [
factory_1.factory.createBinaryExpression(factory_1.factory.createCallChain(factory_1.factory.createPropertyAccessChain(access(route.pathParameters.find((p) => p.field === name)
.name), factory_1.factory.createToken(factory_1.SyntaxKind.QuestionDotToken), "toString"), undefined, undefined, []), factory_1.factory.createToken(factory_1.SyntaxKind.QuestionQuestionToken), factory_1.factory.createStringLiteral("null")),
]), (i !== arr.length - 1
? factory_1.factory.createTemplateMiddle
: factory_1.factory.createTemplateTail)(s.substring(name.length)));
}));
};
if (route.query === null)
return out(template());
const block = (expr) => {
const computeName = (str) => [...route.pathParameters, ...(route.query ? [route.query] : [])].find((p) => p.name === str) !== undefined
? computeName("_" + str)
: str;
const variables = computeName("variables");
return factory_1.factory.createBlock([
local(variables)("URLSearchParams")(factory_1.factory.createNewExpression(factory_1.factory.createIdentifier("URLSearchParams"), [], [])),
factory_1.factory.createForOfStatement(undefined, factory_1.factory.createVariableDeclarationList([
factory_1.factory.createVariableDeclaration(factory_1.factory.createArrayBindingPattern([
factory_1.factory.createBindingElement(undefined, undefined, factory_1.factory.createIdentifier("key"), undefined),
factory_1.factory.createBindingElement(undefined, undefined, factory_1.factory.createIdentifier("value"), undefined),
]), undefined, undefined, undefined),
], factory_1.NodeFlags.Const), factory_1.factory.createCallExpression(factory_1.factory.createIdentifier("Object.entries"), undefined, [factory_1.factory.createAsExpression(expr, TypeFactory_1.TypeFactory.keyword("any"))]), factory_1.factory.createIfStatement(factory_1.factory.createStrictEquality(factory_1.factory.createIdentifier("undefined"), factory_1.factory.createIdentifier("value")), factory_1.factory.createContinueStatement(), factory_1.factory.createIfStatement(factory_1.factory.createCallExpression(factory_1.factory.createIdentifier("Array.isArray"), undefined, [factory_1.factory.createIdentifier("value")]), factory_1.factory.createExpressionStatement(factory_1.factory.createCallExpression(factory_1.factory.createPropertyAccessExpression(factory_1.factory.createIdentifier("value"), factory_1.factory.createIdentifier("forEach")), undefined, [
factory_1.factory.createArrowFunction(undefined, undefined, [IdentifierFactory_1.IdentifierFactory.parameter("elem")], undefined, undefined, factory_1.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(factory_1.factory.createIdentifier(variables), "append"), undefined, [
factory_1.factory.createIdentifier("key"),
factory_1.factory.createCallExpression(factory_1.factory.createIdentifier("String"), undefined, [factory_1.factory.createIdentifier("elem")]),
])),
])), factory_1.factory.createExpressionStatement(factory_1.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(factory_1.factory.createIdentifier(variables), "set"), undefined, [
factory_1.factory.createIdentifier("key"),
factory_1.factory.createCallExpression(factory_1.factory.createIdentifier("String"), undefined, [factory_1.factory.createIdentifier("value")]),
]))))),
local("location")("string")(template()),
factory_1.factory.createReturnStatement(factory_1.factory.createConditionalExpression(factory_1.factory.createStrictEquality(ExpressionFactory_1.ExpressionFactory.number(0), IdentifierFactory_1.IdentifierFactory.access(factory_1.factory.createIdentifier(variables), "size")), undefined, factory_1.factory.createIdentifier("location"), undefined, factory_1.factory.createTemplateExpression(factory_1.factory.createTemplateHead(""), [
factory_1.factory.createTemplateSpan(factory_1.factory.createIdentifier("location"), factory_1.factory.createTemplateMiddle("?")),
factory_1.factory.createTemplateSpan(factory_1.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(factory_1.factory.createIdentifier(variables), "toString"), undefined, undefined), factory_1.factory.createTemplateTail("")),
]))),
], true);
};
return out(block(access(route.query.name)));
};
})(SdkWebSocketNamespaceProgrammer || (exports.SdkWebSocketNamespaceProgrammer = SdkWebSocketNamespaceProgrammer = {}));
const local = (name) => (type) => (expression) => factory_1.factory.createVariableStatement([], factory_1.factory.createVariableDeclarationList([
factory_1.factory.createVariableDeclaration(name, undefined, factory_1.factory.createTypeReferenceNode(type), expression),
], factory_1.NodeFlags.Const));
const constant = (name) => (expression) => factory_1.factory.createVariableStatement([factory_1.factory.createModifier(factory_1.SyntaxKind.ExportKeyword)], factory_1.factory.createVariableDeclarationList([
factory_1.factory.createVariableDeclaration(name, undefined, undefined, expression),
], factory_1.NodeFlags.Const));
//# sourceMappingURL=SdkWebSocketNamespaceProgrammer.js.map