UNPKG

typescript-scaffolder

Version:

![npm version](https://img.shields.io/npm/v/typescript-scaffolder) ### Unit Test Coverage: 97.12%

59 lines (58 loc) 3.54 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateRetryHelperForApiFile = generateRetryHelperForApiFile; const path_1 = __importDefault(require("path")); const fs_1 = __importDefault(require("fs")); const ts_morph_1 = require("ts-morph"); const logger_1 = require("../../utils/logger"); const file_system_1 = require("../../utils/file-system"); const retry_constructors_1 = require("../../utils/retry-constructors"); /** * Generates a per-API retry helper file (e.g., "<fileBase>.requestWithRetry.ts"), * containing: * - type-only imports (AxiosResponse, RetryOptions, and concrete response types) * - an embedded generic retry implementation (no runtime dependency) * - one exported endpoint-typed wrapper per endpoint * * This function does not modify endpoint files; it only writes the helper file. * * @param outputDir - Directory where "<fileBase>.ts" resides (helper will be written here) * @param fileBaseName - Base name of the API file (e.g., "person_api") * @param endpoints - Endpoint metadata used to build typed wrappers * @param overwrite - Whether to overwrite existing helper (default: true) */ function generateRetryHelperForApiFile(outputDir, fileBaseName, endpoints, overwrite = true) { const funcName = 'generateRetryHelperForApiFile'; logger_1.Logger.debug(funcName, `Generating retry helper for ${fileBaseName} with ${endpoints.length} endpoint(s)...`); if (!Array.isArray(endpoints) || endpoints.length === 0) { logger_1.Logger.warn(funcName, `No endpoints provided for ${fileBaseName}.requestWithRetry.ts — nothing to write.`); return; } const project = new ts_morph_1.Project(); const helperPath = path_1.default.join(outputDir, `${fileBaseName}.requestWithRetry.ts`); // Ensure output directory exists before creating file (0, file_system_1.ensureDir)(outputDir); // Respect overwrite flag: if file exists and overwrite is false, skip writing if (!overwrite && fs_1.default.existsSync(helperPath)) { logger_1.Logger.info(funcName, `Skip writing ${fileBaseName}.requestWithRetry.ts (exists, overwrite disabled).`); return; } const sourceFile = project.createSourceFile(helperPath, '', { overwrite }); // 1) Type-only imports for axios, RetryOptions, and unique response types const uniqueTypeImports = Array.from(new Map(endpoints.map(e => [`${e.responseModule}::${e.responseType}`, e])).values()).map(e => ({ typeName: e.responseType, moduleSpecifier: e.responseModule })); (0, retry_constructors_1.addRetryHelperImportsToSourceFile)(sourceFile, uniqueTypeImports); // 2) Embed the generic implementation (no external runtime dependency) sourceFile.addStatements('\n' + (0, retry_constructors_1.buildRetryHelperImplSource)()); // 3) Export one typed wrapper per endpoint (sorted by functionName for deterministic output) const sortedEndpoints = [...endpoints].sort((a, b) => a.functionName.localeCompare(b.functionName)); for (const ep of sortedEndpoints) { const wrapperSource = (0, retry_constructors_1.buildEndpointRetryWrapperExport)(ep.functionName, ep.responseType); sourceFile.addStatements('\n' + wrapperSource + '\n'); } // 4) Save to disk sourceFile.saveSync(); logger_1.Logger.info(funcName, `Wrote ${fileBaseName}.requestWithRetry.ts at ${helperPath}`); }