a2r
Version:
A2R Framework
115 lines (114 loc) • 5.18 kB
JavaScript
;
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;