chore: move to folder-based deps lists (#13361)

This commit is contained in:
Pavel Feldman 2022-04-06 13:40:19 -08:00 committed by GitHub
parent 424de6c38f
commit 1c3db811f5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
30 changed files with 189 additions and 275 deletions

View file

@ -1,221 +0,0 @@
module.exports = {
'browserServerImpl.ts': [ '**' ],
// CLI should only use client-side features.
'cli/': [
'..',
'cli/**',
'client/**',
'debug/injected/',
'generated/',
'grid/**',
'server/injected/',
'server/trace/**',
'utils/**',
],
'cli/driver.ts': [
'..',
'**',
],
// Client depends on chromium protocol for types.
'client/': [
'../types/**',
'common/',
'protocol/',
'server/chromium/protocol.d.ts',
'utils/',
],
'dispatchers/': [
'common/',
'protocol/',
'server/**',
'utils/'
],
// Grid
'grid/': [
'client/',
'dispatchers/**',
'server/',
'utils/**',
],
'inProcessFactory.ts': [ '**' ],
'outofprocess.ts': [
'client/',
'protocol/',
'utils/'
],
'protocol/': [
'utils/'
],
// Generic dependencies for server-side code.
'server/': [
'../types/types.d.ts',
'common/',
'generated/',
'protocol/**',
// Can depend on any files in these subdirectories.
'server/',
// Can depend on files directly in the server directory.
'server/common/**',
'server/injected/**',
'server/supplements/**',
// For fetch ?!?
'server/trace/recorder/tracing.ts',
'utils/',
],
// No dependencies for code shared between node and page.
'server/common/': [],
// Strict dependencies for injected code.
'server/injected/': [
'server/common/', 'protocol/channels.ts'
],
// Electron and Clank use chromium internally.
'server/android/': [
'common/',
'generated/',
'protocol/',
'protocol/**',
'server/',
'server/chromium/',
'server/common/**',
'server/injected/**',
'server/supplements/**',
'utils/',
],
'server/browserContext.ts': [
'common/',
'generated/',
'protocol/**',
'server/',
'server/common/**',
'server/injected/**',
'server/supplements/**',
'server/trace/recorder/tracing.ts',
'utils/',
],
'server/electron/': [
'common/',
'generated/',
'protocol/**',
'server/',
'server/chromium/',
'server/common/**',
'server/injected/**',
'server/supplements/**',
'utils/',
],
'server/playwright.ts': [
'common/',
'generated/',
'protocol/**',
'server/',
'server/android/',
'server/chromium/',
'server/common/**',
'server/electron/',
'server/firefox/',
'server/injected/**',
'server/supplements/**',
'server/webkit/',
'utils/',
],
'server/supplements/recorder/recorderApp.ts': [
'common/',
'server/',
'server/chromium/',
'utils/',
],
'server/supplements/recorderSupplement.ts': [
'common/',
'generated/',
'protocol/**',
'server/',
'server/common/**',
'server/injected/**',
'server/snapshot/',
'server/supplements/**',
'utils/',
],
// Trace viewer
'server/trace/common/': [
'common/',
'generated/',
'protocol/**',
'server/',
'server/common/**',
'server/injected/**',
'server/snapshot/',
'server/supplements/**',
'utils/',
],
// For testing
'server/trace/test/': [
'@trace-viewer/**',
'**',
],
'server/trace/recorder/': [
'common/',
'generated/',
'protocol/**',
'server/',
'server/common/**',
'server/injected/**',
'server/snapshot/',
'server/supplements/**',
'server/trace/common/',
'utils/',
],
'server/trace/viewer/': [
'common/',
'generated/',
'protocol/**',
'server/',
'server/chromium/',
'server/common/**',
'server/injected/**',
'server/snapshot/',
'server/supplements/**',
'server/trace/common/',
'server/trace/recorder/',
'utils/',
],
// The service is a cross-cutting feature, and so it depends on a bunch of things.
'remote/': [
'client/',
'debug/',
'dispatchers/',
'server/',
'server/electron/',
'server/supplements/',
'server/trace/',
'utils/**',
],
'utils/': [
'common/',
'protocol/',
'third_party/diff_match_patch',
],
};

View file

@ -0,0 +1,10 @@
[browserServerImpl.ts]
**
[inProcessFactory.ts]
**
[outofprocess.ts]
client/
protocol/
utils/

View file

@ -0,0 +1,16 @@
[*]
../../
../client
../debug/injected
../generated/
../grid
../server/injected/
../server/trace
../utils
[cli.ts]
../server/trace/viewer/traceViewer.ts
[driver.ts]
../**
../../

View file

@ -0,0 +1,5 @@
[*]
../../types/
../common/
../protocol/
../utils/

View file

@ -0,0 +1,5 @@
[*]
../common/
../protocol/
../server/**
../utils/

View file

@ -0,0 +1,5 @@
[*]
../client/
../dispatchers/
../server/
../utils/

View file

@ -0,0 +1,3 @@
[*]
../utils/

View file

@ -0,0 +1,5 @@
[*]
../client/
../dispatchers/
../server/
../utils/

View file

@ -0,0 +1,21 @@
[*]
../../types/types.d.ts
../common/
../generated/
../protocol/
../utils/
./
common/
injected/
supplements/
trace/recorder/tracing.ts
[browserContext.ts]
supplements/har/
[playwright.ts]
android/
chromium/
electron/
firefox/
webkit/

View file

@ -0,0 +1,5 @@
[*]
../
../../protocol/
../../utils/
../chromium/

View file

@ -0,0 +1,3 @@
[*]

View file

@ -0,0 +1,5 @@
[*]
../
../../protocol/
../../utils/
../chromium/

View file

@ -0,0 +1,2 @@
[*]
../common/

View file

@ -0,0 +1,9 @@
[*]
../
../../common/
../../protocol/
../../utils/
[recorderSupplement.ts]
../../generated/
./recorder/

View file

@ -0,0 +1,3 @@
[*]
../../injected/
../../../utils/

View file

@ -0,0 +1,8 @@
[*]
../../
../../../common/
../../../protocol/
../../../utils/
[recorderApp.ts]
../../chromium/crApp.ts

View file

@ -0,0 +1,3 @@
[*]
../../supplements/har/

View file

@ -0,0 +1,9 @@
[*]
../../
../../../common/
../../../generated/
../../../protocol/
../../../utils/
../../common/
../../supplements/har/
../common/

View file

@ -0,0 +1,3 @@
[*]
../../../**
@trace-viewer/**

View file

@ -0,0 +1,5 @@
[*]
../../
../../../generated/
../../../utils/
../../chromium/crApp.ts

View file

@ -0,0 +1,4 @@
[*]
../common/
../protocol/
../third_party/diff_match_patch

View file

@ -0,0 +1,5 @@
[*]
../types/testReporter.d.ts
matchers/
reporters/
third_party/

View file

@ -0,0 +1,6 @@
[*]
../expect.ts
../globals.ts
../testInfo.ts
../types.ts
../util.ts

View file

@ -0,0 +1,4 @@
[*]
../types.ts
../util.ts
../../types/testReporter.d.ts

View file

@ -1,5 +0,0 @@
module.exports = {
'/': [
'@web/**'
]
};

View file

@ -0,0 +1,2 @@
[*]
@web/**

View file

@ -1,12 +0,0 @@
module.exports = {
'/': [
'@web/**',
'ui/',
],
'ui/': [
'@web/**',
'geometry.ts',
'entries.ts',
]
};

View file

@ -0,0 +1,3 @@
[*]
@web/**
ui/

View file

@ -0,0 +1,4 @@
[*]
@web/**
../entries.ts
../geometry.ts

View file

@ -26,6 +26,8 @@ const packagesDir = path.normalize(path.join(__dirname, '..', 'packages'));
const packages = fs.readdirSync(packagesDir);
const peerDependencies = ['electron', 'react', 'react-dom', '@zip.js/zip.js'];
const depsCache = {};
async function checkDeps() {
await innerCheckDeps(path.join(packagesDir, 'recorder'), true, true);
await innerCheckDeps(path.join(packagesDir, 'trace-viewer'), true, true);
@ -45,10 +47,10 @@ async function checkDeps() {
}
async function innerCheckDeps(root, checkDepsFile, checkPackageJson) {
console.log('Testing', root);
console.log('Testing', path.relative(packagesDir, root));
const deps = new Set();
const src = path.join(root, 'src');
const depsFile = checkDepsFile ? loadDEPSFile(src) : {};
const packageJSON = require(path.join(root, 'package.json'));
const program = ts.createProgram({
options: {
@ -60,12 +62,8 @@ async function innerCheckDeps(root, checkDepsFile, checkPackageJson) {
});
const sourceFiles = program.getSourceFiles();
const errors = [];
const usedDeps = new Set(['/']);
sourceFiles.filter(x => !x.fileName.includes('node_modules')).map(x => visit(x, x.fileName));
for (const key of Object.keys(depsFile)) {
if (!usedDeps.has(key) && depsFile[key].length)
errors.push(`Stale DEPS entry "${key}"`);
}
if (checkDepsFile && errors.length) {
for (const error of errors)
console.log(error);
@ -122,7 +120,7 @@ async function innerCheckDeps(root, checkDepsFile, checkPackageJson) {
importPath = importPath + '.d.ts';
}
if (checkDepsFile && !allowImport(depsFile, fileName, importPath))
if (checkDepsFile && !allowImport(fileName, importPath))
errors.push(`Disallowed import ${path.relative(root, importPath)} in ${path.relative(root, fileName)}`);
return;
}
@ -138,20 +136,38 @@ async function innerCheckDeps(root, checkDepsFile, checkPackageJson) {
ts.forEachChild(node, x => visit(x, fileName));
}
function allowImport(depsFile, from, to) {
function allowImport(from, to) {
const fromDirectory = path.dirname(from);
const toDirectory = path.dirname(to);
if (fromDirectory === toDirectory)
return true;
while (!depsFile[from]) {
if (from.lastIndexOf('/') === -1)
return false;
from = from.substring(0, from.lastIndexOf('/'));
let depsDirectory = fromDirectory;
while (depsDirectory.startsWith(packagesDir) && !depsCache[depsDirectory] && !fs.existsSync(path.join(depsDirectory, 'DEPS.list')))
depsDirectory = path.dirname(depsDirectory);
let deps = depsCache[depsDirectory];
if (!deps) {
const depsListFile = path.join(depsDirectory, 'DEPS.list');
deps = {};
let group;
for (const line of fs.readFileSync(depsListFile, 'utf-8').split('\n').filter(Boolean).filter(l => !l.startsWith('#'))) {
const groupMatch = line.match(/\[(.*)\]/);
if (groupMatch) {
group = [];
deps[groupMatch[1]] = group;
continue;
}
if (line.startsWith('@'))
group.push(line.replace(/@([\w-]+)\/(.*)/, path.join(packagesDir, '$1', 'src', '$2')));
else
group.push(path.resolve(depsDirectory, line));
}
depsCache[depsDirectory] = deps;
}
usedDeps.add(from);
for (const dep of depsFile[from]) {
const mergedDeps = [...(deps['*'] || []), ...(deps[path.relative(depsDirectory, from)] || [])]
for (const dep of mergedDeps) {
if (to === dep || toDirectory === dep)
return true;
if (dep.endsWith('**')) {
@ -163,7 +179,6 @@ async function innerCheckDeps(root, checkDepsFile, checkPackageJson) {
return false;
}
function allowExternalImport(importName, packageJSON) {
// Only external imports are relevant. Files in src/web are bundled via webpack.
if (importName.startsWith('.') || importName.startsWith('@'))
@ -172,15 +187,16 @@ async function innerCheckDeps(root, checkDepsFile, checkPackageJson) {
return true;
try {
const resolvedImport = require.resolve(importName);
const resolvedImportRelativeToNodeModules = path.relative(path.join(root, 'node_modules'), resolvedImport);
// Filter out internal Node.js modules
if (!resolvedImportRelativeToNodeModules.startsWith(importName))
if (!resolvedImport.includes('node_modules'))
return true;
} catch (error) {
if (error.code !== 'MODULE_NOT_FOUND')
throw error;
}
return !!(packageJSON.dependencies || {})[importName];
const match = importName.match(/(@[\w-]+\/)?([^/]+)/);
const dependency = match[1] ? match[1] + '/' + match[2] : match[2];
return !!(packageJSON.dependencies || {})[dependency];
}
}
@ -197,23 +213,6 @@ function listAllFiles(dir) {
return result;
}
function loadDEPSFile(src) {
const deps = require(path.join(src, 'DEPS'));
const resolved = {};
for (let [key, values] of Object.entries(deps)) {
if (key === '/')
key = '';
resolved[path.resolve(src, key)] = values.map(v => {
if (v.startsWith('@')) {
const tokens = v.substring(1).split('/');
return path.resolve(packagesDir, tokens[0], 'src', ...tokens.slice(1));
}
return path.resolve(src, v);
});
}
return resolved;
}
checkDeps().catch(e => {
console.error(e && e.stack ? e.stack : e);
process.exit(1);