Disallow dynamic require/import in extensions

Follow up on https://github.com/microsoft/vscode/pull/296220

Let's make sure more code doesn't introduce this pattern without some thought
This commit is contained in:
Matt Bierner
2026-02-19 00:00:24 -08:00
parent cc23c3af8e
commit 2d698cf054
2 changed files with 26 additions and 0 deletions

View File

@@ -2112,6 +2112,30 @@ export default tseslint.config(
'comma-dangle': ['warn', 'only-multiline']
}
},
// Extension main sources (excluding tests)
{
files: [
'extensions/**/*.ts',
],
ignores: [
'extensions/**/*.test.ts',
],
rules: {
// Ban dynamic require() and import() calls in extensions to ensure tree-shaking works
'no-restricted-syntax': [
'warn',
{
'selector': `CallExpression[callee.name='require'][arguments.0.type!='Literal']`,
'message': 'Use static imports instead of dynamic require() calls to enable tree-shaking.'
},
{
'selector': `ImportExpression[source.type!='Literal']`,
'message': 'Use static imports instead of dynamic import() calls to enable tree-shaking.'
},
],
}
},
// markdown-language-features
{
files: [

View File

@@ -104,6 +104,8 @@ function createServerHost(
const scriptPath = combinePaths(packageRoot, browser);
try {
// This file isn't bundled so we really do want a dynamic import here
// eslint-disable-next-line no-restricted-syntax
const { default: module } = await import(/* webpackIgnore: true */ scriptPath);
return { module, error: undefined };
} catch (e) {