Skip to content

Commit

Permalink
ci: checks for bundling
Browse files Browse the repository at this point in the history
  • Loading branch information
mingxuanzhangsfdx committed Oct 31, 2024
1 parent f7ef476 commit eac0b0f
Show file tree
Hide file tree
Showing 6 changed files with 310 additions and 1 deletion.
1 change: 1 addition & 0 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@
. "$(dirname -- "$0")/_/husky.sh"

yarn lint && yarn pretty-quick --staged
node ./scripts/scanTs.js
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
"chai-as-promised": "^7.1.2",
"commitizen": "^4.3.1",
"cz-conventional-changelog": "^3.3.0",
"esbuild": "^0.24.0",
"eslint": "^7.27.0",
"eslint-config-prettier": "^6.11.0",
"eslint-config-salesforce": "^0.1.6",
Expand All @@ -54,6 +55,7 @@
"shelljs": "^0.8.5",
"shx": "^0.3.4",
"sinon": "^18",
"ts-morph": "^24.0.0",
"ts-node": "^10.9.2",
"typescript": "^5.4.5"
},
Expand All @@ -79,4 +81,4 @@
"publishConfig": {
"access": "public"
}
}
}
29 changes: 29 additions & 0 deletions scripts/esbuild.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/**
* NOTE: This file does NOT really generate a bundle version of templates
* templates is bundled directly in salesforcedx-vscode
* The file is only used to detect any potential risks to esbuild.
**/
const { build } = require('esbuild');

const sharedConfig = {
bundle: true,
format: 'cjs',
platform: 'node',
external: [], // The allowlist of dependencies that are not bundle-able
keepNames: true,
plugins: [],
supported: {
'dynamic-import': false,
},
logOverride: {
'unsupported-dynamic-import': 'error',
},
};

(async () => {
await build({
...sharedConfig,
entryPoints: ['./lib/index.js'],
outdir: 'dist',
});
})();
55 changes: 55 additions & 0 deletions scripts/scanTs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
const fs = require('fs');
const path = require('path');
const { Project, CallExpression } = require('ts-morph');

const SRC_DIR = path.join(__dirname, '..', 'src');
const project = new Project({
tsConfigFilePath: path.join(__dirname, '..', 'tsconfig.json'),
});

let detected = false;

const scanDirectory = (dir) => {
const files = fs.readdirSync(dir);
files.forEach((file) => {
const fullPath = path.join(dir, file);
const stat = fs.statSync(fullPath);
if (stat.isDirectory()) {
scanDirectory(fullPath);
} else if (fullPath.endsWith('.ts')) {
analyzeFile(fullPath);
}
});
};

// This function will detect all the usages of fs.read* and send warnings with the location of the usage
const analyzeFile = (filePath) => {
const srcFile = project.addSourceFileAtPath(filePath);
const funcCalls = srcFile.getDescendantsOfKind(CallExpression);

funcCalls.forEach((callExpression) => {
const exp = callExpression.getExpression();
if (exp.getText().startsWith('fs.read')) {
detected = true;
console.warn(
`Warning: Usage of "${exp.getText()}" in file "${filePath}" at line ${callExpression.getStartLineNumber()}.\n`
);
}
});
};

scanDirectory(SRC_DIR);

if (detected) {
console.log('The warnings above do not mean the usages are wrong.');
console.log(
`Avoid reading local artifacts with "fs.read*" since esbuild cannot bundle the artifacts together.`
);
console.log(
'Consider using import instead or reach out to IDEx Foundations team'
);
} else {
console.log('No fs.read* usages detected.');
}

console.log('Scan complete');
20 changes: 20 additions & 0 deletions scripts/testEsbuild.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
const { exec } = require('child_process');

// Run the command
exec('node ./scripts/esbuild.config.js', (error, stdout, stderr) => {
// Combine stdout and stderr to check the entire output
const output = `${stdout}\n${stderr}`;
if (error) {
console.error(stderr);
process.exit(1); // Exit with an error code
}
// Check if the output contains the error string
if (output.includes('[require-resolve-not-external]')) {
console.error(
'Error: A dependency that has to be externalized in esbuild process is found. Please resolve it!'
);
process.exit(1); // Exit with an error code
} else {
process.exit(0); // Exit with success code
}
});
Loading

0 comments on commit eac0b0f

Please sign in to comment.