@nestia/sdk
Version:
Nestia SDK and Swagger generator
96 lines • 5.17 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SdkFileProgrammer = void 0;
const fs_1 = __importDefault(require("fs"));
const typescript_1 = __importDefault(require("typescript"));
const MapUtil_1 = require("../../utils/MapUtil");
const FilePrinter_1 = require("./FilePrinter");
const ImportDictionary_1 = require("./ImportDictionary");
const SdkHttpRouteProgrammer_1 = require("./SdkHttpRouteProgrammer");
const SdkRouteDirectory_1 = require("./SdkRouteDirectory");
const SdkWebSocketRouteProgrammer_1 = require("./SdkWebSocketRouteProgrammer");
var SdkFileProgrammer;
(function (SdkFileProgrammer) {
/* ---------------------------------------------------------
CONSTRUCTOR
--------------------------------------------------------- */
SdkFileProgrammer.generate = (app) => __awaiter(this, void 0, void 0, function* () {
// CONSTRUCT FOLDER TREE
const root = new SdkRouteDirectory_1.SdkRouteDirectory(null, "functional");
for (const route of app.routes)
emplace(root)(route);
// ITERATE FILES
yield iterate(app.project)(root)(`${app.project.config.output}/functional`);
});
const emplace = (directory) => (route) => {
// OPEN DIRECTORIES
for (const key of route.accessor.slice(0, -1)) {
directory = MapUtil_1.MapUtil.take(directory.children, key, () => new SdkRouteDirectory_1.SdkRouteDirectory(directory, key));
}
// ADD ROUTE
directory.routes.push(route);
};
/* ---------------------------------------------------------
FILE ITERATOR
--------------------------------------------------------- */
const iterate = (project) => (directory) => (outDir) => __awaiter(this, void 0, void 0, function* () {
// CREATE A NEW DIRECTORY
try {
yield fs_1.default.promises.mkdir(outDir);
}
catch (_a) { }
// ITERATE CHILDREN
const statements = [];
for (const [key, value] of directory.children) {
yield iterate(project)(value)(`${outDir}/${key}`);
statements.push(typescript_1.default.factory.createExportDeclaration(undefined, false, typescript_1.default.factory.createNamespaceExport(typescript_1.default.factory.createIdentifier(key)), typescript_1.default.factory.createStringLiteral(`./${key}`), undefined));
}
if (statements.length && directory.routes.length)
statements.push(FilePrinter_1.FilePrinter.enter());
// ITERATE ROUTES
const importer = new ImportDictionary_1.ImportDictionary(`${outDir}/index.ts`);
directory.routes.forEach((route, i) => {
if (!(project.config.clone === true && route.protocol === "http"))
for (const tuple of route.imports)
for (const instance of tuple.instances)
importer.internal({
file: tuple.file,
instance,
type: true,
});
statements.push(...(route.protocol === "http"
? SdkHttpRouteProgrammer_1.SdkHttpRouteProgrammer.write(project)(importer)(route)
: SdkWebSocketRouteProgrammer_1.SdkWebSocketRouteProgrammer.write(importer)(route)));
if (i !== directory.routes.length - 1)
statements.push(FilePrinter_1.FilePrinter.enter());
});
// FINALIZE THE CONTENT
if (directory.routes.length !== 0)
statements.push(...importer.toStatements(outDir), ...(!importer.empty() && statements.length
? [FilePrinter_1.FilePrinter.enter()]
: []), ...statements.splice(0, statements.length));
yield FilePrinter_1.FilePrinter.write({
location: importer.file,
statements,
top: "/**\n" +
" * @packageDocumentation\n" +
` * @module ${directory.module}\n` +
" * @nestia Generated by Nestia - https://github.com/samchon/nestia \n" +
" */\n" +
"//================================================================\n",
});
});
})(SdkFileProgrammer || (exports.SdkFileProgrammer = SdkFileProgrammer = {}));
//# sourceMappingURL=SdkFileProgrammer.js.map
;