From a89645ae72075640eb8b8820466df54070f7646f Mon Sep 17 00:00:00 2001 From: Rishabh Date: Fri, 31 May 2019 17:24:42 +0530 Subject: [PATCH] chore: create isImportPresent --- packages/utils/ast-utils.ts | 37 +++++++++++++++++--------------- packages/utils/types/NodePath.ts | 1 + 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/packages/utils/ast-utils.ts b/packages/utils/ast-utils.ts index d61604be15b..3f0f3a46480 100644 --- a/packages/utils/ast-utils.ts +++ b/packages/utils/ast-utils.ts @@ -1,6 +1,17 @@ import { JSCodeshift, Node, valueType } from "./types/NodePath"; import * as validateIdentifier from "./validate-identifier"; + +function isImportPresent (j: JSCodeshift, ast: Node, path: string): boolean { + let isPresent: boolean = false; + ast.find(j.CallExpression).forEach(callExp => { + if ((callExp.value as Node).callee.name === 'require' && (callExp.value as Node).arguments[0].value === path) { + isPresent = true; + } + }) + return isPresent; +} + /** * * Traverse safely over a path object for array for paths @@ -629,31 +640,23 @@ function parseMerge(j: JSCodeshift, ast: Node, value: string[], action: string): right: j.callExpression(j.identifier("merge"), [j.identifier(configIdentifier), exportsDecl.pop()]), type: "AssignmentExpression" }; + (p.value as Node).body[bodyLength - 1] = newVal; return false; // TODO: debug later } - function addMergeImports(ast: Node, mergeImports: string[]) { - ast.find(j.Program).filter((program: Node): boolean => { - mergeImports.forEach( - (imp: string): void => { - if ((program.value as Node).body.indexOf(imp) === -1){ - (program.value as Node).body.splice(-1, 0, imp); - } - } - ) - return false; - }); - return ast; + function addMergeImports(configIdentifier: string, configPath: string) { + ast.find(j.Program).forEach(p => { + if (!isImportPresent(j, ast, 'webpack-merge')) { + (p.value as Node).body.splice(-1, 0, `const merge = require('webpack-merge')`); + } + (p.value as Node).body.splice(-1, 0, `const ${configIdentifier} = require('${configPath}')`); + }) } if (value) { const [configIdentifier, configPath] = value; - const mergeImports = [ - `const ${configIdentifier} = require('${configPath}')`, - `const merge = require('webpack-merge')` - ]; - ast.replaceWith(addMergeImports(ast, mergeImports)); + addMergeImports(configIdentifier, configPath); return ast.find(j.Program).filter((p: Node): boolean => createMergeProperty(p, configIdentifier)); } else { return ast; diff --git a/packages/utils/types/NodePath.ts b/packages/utils/types/NodePath.ts index db1853deff7..0e09ab51672 100644 --- a/packages/utils/types/NodePath.ts +++ b/packages/utils/types/NodePath.ts @@ -2,6 +2,7 @@ export interface Node extends Object { id?: { name: string; }; + callee?: Node; arguments?: Node[]; body?: Node[]; elements?: Node[];