Skip to content

Commit

Permalink
fix(core): disable js code analysis when typescript is not installed
Browse files Browse the repository at this point in the history
  • Loading branch information
FrozenPandaz committed Feb 21, 2023
1 parent 19edd02 commit 6d77cc4
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,17 @@ export function buildExplicitTypescriptAndPackageJsonDependencies(
filesToProcess: ProjectFileMap
) {
let res: ExplicitDependency[] = [];

let typescriptExists = false;

try {
require.resolve('typescript');
typescriptExists = true;
} catch {}
if (
jsPluginConfig.analyzeSourceFiles === undefined ||
jsPluginConfig.analyzeSourceFiles === true
typescriptExists &&
(jsPluginConfig.analyzeSourceFiles === undefined ||
jsPluginConfig.analyzeSourceFiles === true)
) {
res = res.concat(
buildExplicitTypeScriptDependencies(projectGraph, filesToProcess)
Expand Down
103 changes: 62 additions & 41 deletions packages/vite/src/utils/vite-config-edit-utils.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { applyChangesToString, ChangeType, Tree } from '@nrwl/devkit';
import { findNodes } from 'nx/src/utils/typescript';
import ts = require('typescript');
import { tsquery } from '@phenomnomnominal/tsquery';
import { TargetFlags } from './generator-utils';
import type { Node, ReturnStatement } from 'typescript';

export function ensureViteConfigIsCorrect(
tree: Tree,
Expand Down Expand Up @@ -66,31 +65,34 @@ function handleBuildOrTestNode(
configContentObject: {},
name: 'build' | 'test'
): string | undefined {
const buildNode = tsquery.query(
const buildNode = require('@phenomnomnominal/tsquery').query(
updatedFileContent,
`PropertyAssignment:has(Identifier[name="${name}"])`
);

if (buildNode.length) {
return tsquery.replace(
return require('@phenomnomnominal/tsquery').replace(
updatedFileContent,
`PropertyAssignment:has(Identifier[name="${name}"])`,
(node: ts.Node) => {
const found = tsquery.query(node, 'ObjectLiteralExpression');
(node: Node) => {
const found = require('@phenomnomnominal/tsquery').query(
node,
'ObjectLiteralExpression'
);
return `${name}: {
...${found?.[0].getText()},
...${JSON.stringify(configContentObject)}
}`;
}
);
} else {
const foundDefineConfig = tsquery.query(
const foundDefineConfig = require('@phenomnomnominal/tsquery').query(
updatedFileContent,
'CallExpression:has(Identifier[name="defineConfig"])'
);

if (foundDefineConfig.length) {
const conditionalConfig = tsquery.query(
const conditionalConfig = require('@phenomnomnominal/tsquery').query(
foundDefineConfig[0],
'ArrowFunction'
);
Expand All @@ -107,7 +109,7 @@ function handleBuildOrTestNode(
return updatedFileContent;
}
} else {
const propertyAssignments = tsquery.query(
const propertyAssignments = require('@phenomnomnominal/tsquery').query(
foundDefineConfig[0],
'PropertyAssignment'
);
Expand All @@ -134,11 +136,11 @@ function handleBuildOrTestNode(
// build config does not exist and defineConfig is not used
// could also potentially be invalid syntax, so try-catch
try {
const defaultExport = tsquery.query(
const defaultExport = require('@phenomnomnominal/tsquery').query(
updatedFileContent,
'ExportAssignment'
);
const found = tsquery.query(
const found = require('@phenomnomnominal/tsquery').query(
defaultExport?.[0],
'ObjectLiteralExpression'
);
Expand All @@ -159,24 +161,24 @@ function handleBuildOrTestNode(

function transformCurrentBuildObject(
index: number,
returnStatements: ts.ReturnStatement[],
returnStatements: ReturnStatement[],
appFileContent: string,
buildConfigObject: {}
): string | undefined {
if (!returnStatements?.[index]) {
return undefined;
}
const currentBuildObject = tsquery
const currentBuildObject = require('@phenomnomnominal/tsquery')
.query(returnStatements[index], 'ObjectLiteralExpression')?.[0]
.getText();

const currentBuildObjectStart = returnStatements[index].getStart();
const currentBuildObjectEnd = returnStatements[index].getEnd();

const newReturnObject = tsquery.replace(
const newReturnObject = require('@phenomnomnominal/tsquery').replace(
returnStatements[index].getText(),
'ObjectLiteralExpression',
(_node: ts.Node) => {
(_node: Node) => {
return `{
...${currentBuildObject},
...${JSON.stringify(buildConfigObject)}
Expand All @@ -201,15 +203,24 @@ function transformCurrentBuildObject(
}

function transformConditionalConfig(
conditionalConfig: ts.Node[],
conditionalConfig: Node[],
appFileContent: string,
buildConfigObject: {}
): string | undefined {
const functionBlock = tsquery.query(conditionalConfig[0], 'Block');
const functionBlock = require('@phenomnomnominal/tsquery').query(
conditionalConfig[0],
'Block'
);

const ifStatement = tsquery.query(functionBlock?.[0], 'IfStatement');
const ifStatement = require('@phenomnomnominal/tsquery').query(
functionBlock?.[0],
'IfStatement'
);

const binaryExpressions = tsquery.query(ifStatement?.[0], 'BinaryExpression');
const binaryExpressions = require('@phenomnomnominal/tsquery').query(
ifStatement?.[0],
'BinaryExpression'
);

const buildExists = binaryExpressions?.find(
(binaryExpression) => binaryExpression.getText() === `command === 'build'`
Expand All @@ -225,12 +236,13 @@ function transformConditionalConfig(

const elseKeywordExists = findNodes(
ifStatement?.[0],
ts.SyntaxKind.ElseKeyword
);
const returnStatements: ts.ReturnStatement[] = tsquery.query(
ifStatement[0],
'ReturnStatement'
require('typescript').SyntaxKind.ElseKeyword
);
const returnStatements: ReturnStatement[] =
require('@phenomnomnominal/tsquery').query(
ifStatement[0],
'ReturnStatement'
);

if (!buildExists) {
if (serveExists && elseKeywordExists) {
Expand Down Expand Up @@ -282,20 +294,23 @@ function handlePluginNode(
dtsImportLine: string,
pluginOption: string
): string | undefined {
const file = tsquery.ast(appFileContent);
const pluginsNode = tsquery.query(
const file = require('@phenomnomnominal/tsquery').ast(appFileContent);
const pluginsNode = require('@phenomnomnominal/tsquery').query(
file,
'PropertyAssignment:has(Identifier[name="plugins"])'
);

let writeFile = false;

if (pluginsNode.length) {
appFileContent = tsquery.replace(
appFileContent = require('@phenomnomnominal/tsquery').replace(
file.getText(),
'PropertyAssignment:has(Identifier[name="plugins"])',
(node: ts.Node) => {
const found = tsquery.query(node, 'ArrayLiteralExpression');
(node: Node) => {
const found = require('@phenomnomnominal/tsquery').query(
node,
'ArrayLiteralExpression'
);
return `plugins: [
...${found?.[0].getText()},
${dtsPlugin}
Expand All @@ -307,13 +322,13 @@ function handlePluginNode(
// Plugins node does not exist yet
// So make one from scratch

const foundDefineConfig = tsquery.query(
const foundDefineConfig = require('@phenomnomnominal/tsquery').query(
file,
'CallExpression:has(Identifier[name="defineConfig"])'
);

if (foundDefineConfig.length) {
const conditionalConfig = tsquery.query(
const conditionalConfig = require('@phenomnomnominal/tsquery').query(
foundDefineConfig[0],
'ArrowFunction'
);
Expand All @@ -323,7 +338,7 @@ function handlePluginNode(
// with plugins
writeFile = false;
} else {
const propertyAssignments = tsquery.query(
const propertyAssignments = require('@phenomnomnominal/tsquery').query(
foundDefineConfig[0],
'PropertyAssignment'
);
Expand Down Expand Up @@ -352,8 +367,11 @@ function handlePluginNode(
// Plugins option does not exist and defineConfig is not used
// could also potentially be invalid syntax, so try-catch
try {
const defaultExport = tsquery.query(file, 'ExportAssignment');
const found = tsquery?.query(
const defaultExport = require('@phenomnomnominal/tsquery').query(
file,
'ExportAssignment'
);
const found = require('@phenomnomnominal/tsquery')?.query(
defaultExport?.[0],
'ObjectLiteralExpression'
);
Expand Down Expand Up @@ -382,8 +400,8 @@ function handlePluginNode(
}

function handleCacheDirNode(appFileContent: string, cacheDir: string): string {
const file = tsquery.ast(appFileContent);
const cacheDirNode = tsquery.query(
const file = require('@phenomnomnominal/tsquery').ast(appFileContent);
const cacheDirNode = require('@phenomnomnominal/tsquery').query(
file,
'PropertyAssignment:has(Identifier[name="cacheDir"])'
);
Expand All @@ -392,13 +410,13 @@ function handleCacheDirNode(appFileContent: string, cacheDir: string): string {
// cacheDir node does not exist yet
// So make one from scratch

const foundDefineConfig = tsquery.query(
const foundDefineConfig = require('@phenomnomnominal/tsquery').query(
file,
'CallExpression:has(Identifier[name="defineConfig"])'
);

if (foundDefineConfig.length) {
const conditionalConfig = tsquery.query(
const conditionalConfig = require('@phenomnomnominal/tsquery').query(
foundDefineConfig[0],
'ArrowFunction'
);
Expand All @@ -407,7 +425,7 @@ function handleCacheDirNode(appFileContent: string, cacheDir: string): string {
// We are NOT transforming the conditional config
// with cacheDir
} else {
const propertyAssignments = tsquery.query(
const propertyAssignments = require('@phenomnomnominal/tsquery').query(
foundDefineConfig[0],
'PropertyAssignment'
);
Expand All @@ -434,8 +452,11 @@ function handleCacheDirNode(appFileContent: string, cacheDir: string): string {
// cacheDir option does not exist and defineConfig is not used
// could also potentially be invalid syntax, so try-catch
try {
const defaultExport = tsquery.query(file, 'ExportAssignment');
const found = tsquery?.query(
const defaultExport = require('@phenomnomnominal/tsquery').query(
file,
'ExportAssignment'
);
const found = require('@phenomnomnominal/tsquery')?.query(
defaultExport?.[0],
'ObjectLiteralExpression'
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
"devDependencies": {
"nx": "<%= nxVersion %>",
"@nrwl/workspace": "<%= nxVersion %>",
"typescript": "<%= typescriptVersion %>",
"prettier": "<%= prettierVersion %>"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
"devDependencies": {
"@nrwl/workspace": "<%= nxVersion %>",
"nx": "<%= nxVersion %>",
"prettier": "<%= prettierVersion %>",
"typescript": "<%= typescriptVersion %>"
"prettier": "<%= prettierVersion %>"
}
}

0 comments on commit 6d77cc4

Please sign in to comment.