typescript-scaffolder
Version:
 ### Unit Test Coverage: 97.12%
59 lines (58 loc) • 3.54 kB
JavaScript
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}`);
}
;