UNPKG

apollo-angular

Version:

Use your GraphQL data in your Angular app, with the Apollo Client

294 lines 12.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.migrateImports = exports.migrateTsConfig = void 0; const tslib_1 = require("tslib"); const schematics_1 = require("@angular-devkit/schematics"); const tasks_1 = require("@angular-devkit/schematics/tasks"); const ts = require("typescript"); const utils_1 = require("../utils"); const index_1 = require("../install/index"); function default_1() { return (0, schematics_1.chain)([migrateImports, migrateTsConfig, migrateDependencies]); } exports.default = default_1; function migrateDependencies() { return (tree, context) => { const packageJsonPath = 'package.json'; const packageJson = (0, utils_1.getJsonFile)(tree, packageJsonPath); packageJson.dependencies = packageJson.dependencies || {}; const dependenciesMap = (0, index_1.createDependenciesMap)({}); for (const dependency in dependenciesMap) { if (dependenciesMap.hasOwnProperty(dependency)) { const version = dependenciesMap[dependency]; packageJson.dependencies[dependency] = version; } } const packagesToRemove = [ 'graphql-tag', 'apollo-client', 'apollo-cache', 'apollo-cache-inmemory', 'apollo-utilities', 'apollo-link', 'apollo-link-http', 'apollo-link-batch-http', 'apollo-link-context', 'apollo-link-error', 'apollo-link-schema', 'apollo-link-ws', 'apollo-angular-link-http', 'apollo-angular-link-http-batch', 'apollo-angular-link-headers', ]; const removedPackages = []; packagesToRemove.forEach((packageName) => { var _a, _b; let removed = false; if ((_a = packageJson.dependencies) === null || _a === void 0 ? void 0 : _a[packageName]) { delete packageJson.dependencies[packageName]; removed = true; } if ((_b = packageJson.devDependencies) === null || _b === void 0 ? void 0 : _b[packageName]) { delete packageJson.devDependencies[packageName]; removed = true; } if (removed) { removedPackages.push(packageName); } }); removedPackages.forEach((packageName) => { context.logger.info(`Removed ${packageName} dependency`); }); // save the changed file tree.overwrite(packageJsonPath, JSON.stringify(packageJson, null, 2)); // schedule `npm install` context.addTask(new tasks_1.NodePackageInstallTask()); return tree; }; } function migrateTsConfig(tree) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const tsconfigPath = 'tsconfig.json'; const tsconfig = (0, utils_1.getJsonFile)(tree, tsconfigPath); const compilerOptions = tsconfig.compilerOptions; if (compilerOptions) { compilerOptions.allowSyntheticDefaultImports = true; tree.overwrite(tsconfigPath, JSON.stringify(tsconfig, null, 2)); } else { const tsconfigBasePath = 'tsconfig.base.json'; const tsconfigBase = (0, utils_1.getJsonFile)(tree, tsconfigBasePath); const baseCompilerOptions = tsconfigBase.compilerOptions; if (baseCompilerOptions) { baseCompilerOptions.allowSyntheticDefaultImports = true; tree.overwrite(tsconfigBasePath, JSON.stringify(tsconfigBase, null, 2)); } } }); } exports.migrateTsConfig = migrateTsConfig; function getIdentifiers(namedBindings, onIdentifier) { namedBindings.forEachChild((named) => { if (ts.isImportSpecifier(named)) { const name = named.propertyName && typeof named.propertyName !== 'undefined' ? named.propertyName.escapedText.toString() : named.name.escapedText.toString(); onIdentifier({ name, alias: name === named.name.escapedText.toString() ? undefined : name, }); } }); } function migrateImports(tree) { return tslib_1.__awaiter(this, void 0, void 0, function* () { tree.visit((path) => { if (path.includes('node_modules') || !path.endsWith('.ts')) { return; } const importsMap = {}; function collectIdentifiers(packageName, namedBindings) { getIdentifiers(namedBindings, ({ name, alias }) => { if (!importsMap[packageName]) { importsMap[packageName] = []; } importsMap[packageName].push({ name, alias, }); }); } function redirectImport({ source, target, modulePath, statement, recorder, }) { if (modulePath === source) { if (statement.importClause.namedBindings) { collectIdentifiers(target, statement.importClause.namedBindings); } recorder.remove(statement.getStart(), statement.getWidth()); } } function redirectDefaultImport({ identifier, source, target, modulePath, statement, recorder, }) { if (modulePath === source && statement.importClause.name) { if (!importsMap[target]) { importsMap[target] = []; } const alias = statement.importClause.name.escapedText.toString(); importsMap[target].push({ name: identifier, alias: alias !== identifier ? alias : undefined, }); recorder.remove(statement.getStart(), statement.getWidth()); } } const sourceFile = ts.createSourceFile(path, tree.read(path).toString(), ts.ScriptTarget.Latest, true); const recorder = tree.beginUpdate(path); sourceFile.statements.forEach((statement) => { if (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) { const nodeText = statement.moduleSpecifier.getText(sourceFile); const modulePath = statement.moduleSpecifier .getText(sourceFile) .substr(1, nodeText.length - 2); redirectImport({ source: 'apollo-cache-inmemory', target: '@apollo/client/core', recorder, statement, modulePath, }); redirectImport({ source: 'apollo-client', target: '@apollo/client/core', recorder, statement, modulePath, }); redirectImport({ source: 'apollo-link', target: '@apollo/client/core', recorder, statement, modulePath, }); redirectImport({ source: 'apollo-cache', target: '@apollo/client/core', recorder, statement, modulePath, }); redirectImport({ source: 'apollo-angular-link-http', target: 'apollo-angular/http', recorder, statement, modulePath, }); redirectImport({ source: 'apollo-angular-link-http-batch', target: 'apollo-angular/http', recorder, statement, modulePath, }); redirectImport({ source: 'apollo-utilities', target: '@apollo/client/utilities', recorder, statement, modulePath, }); redirectImport({ source: 'apollo-link-http', target: '@apollo/client/link/http', recorder, statement, modulePath, }); redirectImport({ source: 'apollo-link-batch-http', target: '@apollo/client/link/batch-http', recorder, statement, modulePath, }); redirectImport({ source: 'apollo-link-context', target: '@apollo/client/link/context', recorder, statement, modulePath, }); redirectImport({ source: 'apollo-link-error', target: '@apollo/client/link/error', recorder, statement, modulePath, }); redirectImport({ source: 'apollo-link-schema', target: '@apollo/client/link/schema', recorder, statement, modulePath, }); redirectImport({ source: 'apollo-link-ws', target: '@apollo/client/link/ws', recorder, statement, modulePath, }); redirectImport({ source: 'apollo-angular', target: 'apollo-angular', recorder, statement, modulePath, }); redirectImport({ source: 'apollo-angular-link-headers', target: 'apollo-angular/headers', recorder, statement, modulePath, }); redirectDefaultImport({ identifier: 'ApolloClient', source: 'apollo-client', target: '@apollo/client/core', recorder, statement, modulePath, }); redirectDefaultImport({ identifier: 'gql', source: 'graphql-tag', target: 'apollo-angular', recorder, statement, modulePath, }); } }); const importSources = Object.keys(importsMap); importSources.forEach((importSource) => { const props = importsMap[importSource] .filter((im, i, all) => { if (im.alias) { return all.findIndex((f) => f.alias === im.alias) === i; } return all.findIndex((f) => f.name === im.name) === i; }) .map((im) => (im.alias ? `${im.name} as ${im.alias}` : im.name)) .join(', '); recorder.insertLeft(sourceFile.getStart(), `import {${props}} from '${importSource}';\n`); }); if (importSources.length) { tree.commitUpdate(recorder); } }); }); } exports.migrateImports = migrateImports; //# sourceMappingURL=v2.js.map