@o3r/apis-manager
Version:
This module provides services to help you communicate with your APIs. Its responsibility is to provide an API configuration to a service factory so that it could instantiate an API with the right configurations. It contains a default configuration and a m
83 lines (82 loc) • 4.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.updateApiDependencies = updateApiDependencies;
const schematics_1 = require("@angular-devkit/schematics");
const schematics_2 = require("@o3r/schematics");
const utility_1 = require("@schematics/angular/utility");
const ast_utils_1 = require("@schematics/angular/utility/ast-utils");
const ts = require("typescript");
/**
* Update app.module file with api manager, if needed
* @param options
*/
function updateApiDependencies(options) {
const updateAppModule = (tree, context) => {
const additionalRules = [];
const moduleFilePath = (0, schematics_2.getAppModuleFilePath)(tree, context, options.projectName);
if (!moduleFilePath) {
return tree;
}
const sourceFileContent = tree.readText(moduleFilePath);
const sourceFile = ts.createSourceFile(moduleFilePath, sourceFileContent, ts.ScriptTarget.ES2015, true);
if ((0, ast_utils_1.isImported)(sourceFile, 'ApiManagerModule', '@otter/common') || (0, ast_utils_1.isImported)(sourceFile, 'ApiManagerModule', '@o3r/apis-manager')) {
return tree;
}
const recorder = tree.beginUpdate(moduleFilePath);
const { moduleIndex } = (0, schematics_2.getModuleIndex)(sourceFile, sourceFileContent);
const addImportToModuleFile = (name, file, moduleFunction) => additionalRules.push((0, utility_1.addRootImport)(options.projectName, ({ code, external }) => code `${external(name, file)}${moduleFunction}`));
const insertImportToModuleFile = (name, file, isDefault) => (0, schematics_2.insertImportToModuleFile)(name, file, sourceFile, recorder, moduleFilePath, isDefault);
const addProviderToModuleFile = (name, file, customProvider) => additionalRules.push((0, utility_1.addRootProvider)(options.projectName, ({ code, external }) => code `{provide: ${external(name, file)}, ${customProvider}}`));
const insertBeforeModule = (line) => (0, schematics_2.insertBeforeModule)(line, sourceFileContent, recorder, moduleIndex);
insertImportToModuleFile('appendPreconnect', '@o3r/apis-manager', false);
insertBeforeModule('const PROXY_SERVER = \'https://YOUR_API_ENDPOINT\';');
insertBeforeModule('appendPreconnect(PROXY_SERVER);');
addImportToModuleFile('ApiManagerModule', '@o3r/apis-manager');
if (!options.skipCodeSample) {
insertBeforeModule(`
export function apiManagerFactory(): ApiManager {
const apiClient = new ApiFetchClient({
basePath: PROXY_SERVER,
requestPlugins: [new ApiKeyRequest(/* API Key */ 'YOUR_API_KEY', 'Authorization')]
});
return new ApiManager(apiClient);
}`);
addProviderToModuleFile('API_TOKEN', '@o3r/apis-manager', 'useFactory: apiManagerFactory');
insertImportToModuleFile('ApiFetchClient', '@ama-sdk/client-fetch', false);
}
insertImportToModuleFile('ApiManager', '@o3r/apis-manager', false);
insertImportToModuleFile('ApiKeyRequest', '@ama-sdk/core', false);
tree.commitUpdate(recorder);
context.logger.info('Please update by hand the placeholders for YOUR_API_ENDPOINT and YOUR_API_KEY!');
return (0, schematics_1.chain)(additionalRules)(tree, context);
};
const updateTsConfig = (tree, context) => {
const workspaceProject = options.projectName ? (0, schematics_2.getWorkspaceConfig)(tree)?.projects[options.projectName] : undefined;
const tsconfig = workspaceProject
&& workspaceProject.architect
&& workspaceProject.architect.build
&& workspaceProject.architect.build.options
&& workspaceProject.architect.build.options.tsConfig;
if (!tsconfig) {
context.logger.warn('No tsconfig found in build target');
return tree;
}
ts.parseConfigFileTextToJson(tsconfig, tree.readText(tsconfig));
const tsconfigObj = ts.parseConfigFileTextToJson(tsconfig, tree.readText(tsconfig)).config;
if (!tsconfigObj.compilerOptions) {
tsconfigObj.compilerOptions = {};
}
if (!tsconfigObj.compilerOptions.lib) {
tsconfigObj.compilerOptions.lib = [];
}
tsconfigObj.compilerOptions.lib.push('scripthost', 'es2020', 'dom');
tsconfigObj.compilerOptions.lib = tsconfigObj.compilerOptions.lib.reduce((acc, lib) => acc.includes(lib) ? acc : [...acc, lib], []);
tree.overwrite(tsconfig, JSON.stringify(tsconfigObj, null, 2));
return tree;
};
return (0, schematics_1.chain)([
updateTsConfig,
updateAppModule
]);
}
//# sourceMappingURL=index.js.map