UNPKG

a2r

Version:
115 lines (114 loc) 5.18 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.build = exports.api = void 0; const path_1 = __importDefault(require("path")); const telemetry_1 = require("@a2r/telemetry"); const fs_1 = require("@a2r/fs"); const getModuleInfo_1 = __importDefault(require("./getModuleInfo")); const getGroupedModelImports_1 = __importDefault(require("./getGroupedModelImports")); const getProxyMethod_1 = __importDefault(require("./getProxyMethod")); const updateApiObject_1 = __importDefault(require("./updateApiObject")); const getApiObject_1 = __importDefault(require("./getApiObject")); const getMethodWrapper_1 = __importDefault(require("./getMethodWrapper")); const getSocketProvider_1 = __importDefault(require("./getSocketProvider")); const getIsClientContent_1 = __importDefault(require("./getIsClientContent")); const getAuthHandler_1 = __importDefault(require("./getAuthHandler")); const getHeadersProvider_1 = __importDefault(require("./getHeadersProvider")); exports.api = {}; /** * Gets external needed imports */ const getExternalImports = () => [ { path: `'axios'`, def: 'axios' }, { path: `'https'`, def: 'https' }, { path: `'shortid'`, def: 'generateId' }, { path: `'next'`, named: ['GetServerSidePropsContext'] }, { path: `'querystring'`, named: ['ParsedUrlQuery'] }, ]; /** * Gets internal needed imports */ const getInternalImports = () => [ { path: `'./socket'`, def: 'socket', named: ['MethodCall', 'SocketMessage'] }, { path: `'./isClient'`, def: 'isClient' }, { path: `'./getHeaders'`, def: 'getHeaders' }, { path: `'../../../config/settings'`, named: ['basePath', 'domain', 'clusterUrl', 'ignoreUnauthorized'], }, ]; /** * Gets model imports text * @param groupedModelImports Grouped model imports (by path) */ const getImports = (groupedModelImports) => groupedModelImports .map(({ def, named, path: fromPath }) => `import ${def ? `${def}${named && named.length ? ', ' : ''}` : ''}${named && named.length ? `{ ${named.join(', ')} }` : ''} from ${fromPath};`) .join('\n'); /** * Gets docs text * @param jsDoc `jsDoc` property from `JSDocContainer` */ const getDocs = (jsDoc) => jsDoc[0].getFullText(); const getValidMethodName = (methodName, existing) => { let res = methodName; let i = 2; while (existing[res]) { res = `${methodName}${i}`; i++; } return res; }; /** * Build API proxy and needed files * @param apiSourcePath API source path * @param proxyTargetPath Proxy target path, where generated files will be written */ const build = async (apiSourcePath, proxyTargetPath) => { const files = await (0, fs_1.getFilesRecursively)(apiSourcePath, ['.ts']); const proxyIndexPath = path_1.default.resolve(proxyTargetPath, 'index.ts'); const socketFilePath = path_1.default.resolve(proxyTargetPath, 'socket.ts'); const authFilePath = path_1.default.resolve(proxyTargetPath, 'auth.ts'); const isClientFilePath = path_1.default.resolve(proxyTargetPath, 'isClient.ts'); const getHeadersPath = path_1.default.resolve(proxyTargetPath, 'getHeaders.ts'); const modulesInfo = await Promise.all(files.map((file) => (0, getModuleInfo_1.default)(file, apiSourcePath))); let apiObject = { key: 'api', namespaces: [], methods: [], }; const imports = []; const allUsedTypes = []; const methods = []; const methodsNames = {}; for (let i = 0, l = modulesInfo.length; i < l; i++) { const { mainMethodDocs, mainMethodName, mainMethodParamNodes, mainMethodReturnTypeInfo, modelImports, usedTypes, keys, } = modulesInfo[i]; const doc = getDocs(mainMethodDocs.jsDoc); const methodName = getValidMethodName(mainMethodName, methodsNames); methodsNames[methodName] = true; const method = (0, getProxyMethod_1.default)(keys.join('.'), methodName, mainMethodParamNodes, mainMethodReturnTypeInfo); imports.push(...modelImports); allUsedTypes.push(...usedTypes); methods.push([doc, method].join('\n')); apiObject = (0, updateApiObject_1.default)(apiObject, keys, methodName); } const initialImports = [...getExternalImports(), ...getInternalImports()]; const groupedImports = (0, getGroupedModelImports_1.default)(initialImports, imports, allUsedTypes); await (0, fs_1.writeFile)(socketFilePath, (0, getSocketProvider_1.default)()); await (0, fs_1.writeFile)(isClientFilePath, (0, getIsClientContent_1.default)()); await (0, fs_1.writeFile)(getHeadersPath, (0, getHeadersProvider_1.default)()); await (0, fs_1.writeFile)(proxyIndexPath, [ getImports(groupedImports), (0, getMethodWrapper_1.default)(), ...methods, (0, getApiObject_1.default)(apiObject), 'export default api;\n', ] .filter((s) => !!s) .join('\n\n')); await (0, fs_1.writeFile)(authFilePath, (0, getAuthHandler_1.default)()); telemetry_1.out.verbose('API Proxy built'); }; exports.build = build;