chore: move to folder-based deps lists (#13361)
This commit is contained in:
parent
424de6c38f
commit
1c3db811f5
|
|
@ -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',
|
||||
],
|
||||
};
|
||||
10
packages/playwright-core/src/DEPS.list
Normal file
10
packages/playwright-core/src/DEPS.list
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
[browserServerImpl.ts]
|
||||
**
|
||||
|
||||
[inProcessFactory.ts]
|
||||
**
|
||||
|
||||
[outofprocess.ts]
|
||||
client/
|
||||
protocol/
|
||||
utils/
|
||||
16
packages/playwright-core/src/cli/DEPS.list
Normal file
16
packages/playwright-core/src/cli/DEPS.list
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
[*]
|
||||
../../
|
||||
../client
|
||||
../debug/injected
|
||||
../generated/
|
||||
../grid
|
||||
../server/injected/
|
||||
../server/trace
|
||||
../utils
|
||||
|
||||
[cli.ts]
|
||||
../server/trace/viewer/traceViewer.ts
|
||||
|
||||
[driver.ts]
|
||||
../**
|
||||
../../
|
||||
5
packages/playwright-core/src/client/DEPS.list
Normal file
5
packages/playwright-core/src/client/DEPS.list
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[*]
|
||||
../../types/
|
||||
../common/
|
||||
../protocol/
|
||||
../utils/
|
||||
5
packages/playwright-core/src/dispatchers/DEPS.list
Normal file
5
packages/playwright-core/src/dispatchers/DEPS.list
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[*]
|
||||
../common/
|
||||
../protocol/
|
||||
../server/**
|
||||
../utils/
|
||||
5
packages/playwright-core/src/grid/DEPS.list
Normal file
5
packages/playwright-core/src/grid/DEPS.list
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[*]
|
||||
../client/
|
||||
../dispatchers/
|
||||
../server/
|
||||
../utils/
|
||||
3
packages/playwright-core/src/protocol/DEPS.list
Normal file
3
packages/playwright-core/src/protocol/DEPS.list
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
[*]
|
||||
../utils/
|
||||
|
||||
5
packages/playwright-core/src/remote/DEPS.list
Normal file
5
packages/playwright-core/src/remote/DEPS.list
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[*]
|
||||
../client/
|
||||
../dispatchers/
|
||||
../server/
|
||||
../utils/
|
||||
21
packages/playwright-core/src/server/DEPS.list
Normal file
21
packages/playwright-core/src/server/DEPS.list
Normal 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/
|
||||
5
packages/playwright-core/src/server/android/DEPS.list
Normal file
5
packages/playwright-core/src/server/android/DEPS.list
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[*]
|
||||
../
|
||||
../../protocol/
|
||||
../../utils/
|
||||
../chromium/
|
||||
3
packages/playwright-core/src/server/common/DEPS.list
Normal file
3
packages/playwright-core/src/server/common/DEPS.list
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
[*]
|
||||
|
||||
|
||||
5
packages/playwright-core/src/server/electron/DEPS.list
Normal file
5
packages/playwright-core/src/server/electron/DEPS.list
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[*]
|
||||
../
|
||||
../../protocol/
|
||||
../../utils/
|
||||
../chromium/
|
||||
2
packages/playwright-core/src/server/injected/DEPS.list
Normal file
2
packages/playwright-core/src/server/injected/DEPS.list
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
[*]
|
||||
../common/
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
[*]
|
||||
../
|
||||
../../common/
|
||||
../../protocol/
|
||||
../../utils/
|
||||
|
||||
[recorderSupplement.ts]
|
||||
../../generated/
|
||||
./recorder/
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
[*]
|
||||
../../injected/
|
||||
../../../utils/
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
[*]
|
||||
../../
|
||||
../../../common/
|
||||
../../../protocol/
|
||||
../../../utils/
|
||||
|
||||
[recorderApp.ts]
|
||||
../../chromium/crApp.ts
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
[*]
|
||||
../../supplements/har/
|
||||
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
[*]
|
||||
../../
|
||||
../../../common/
|
||||
../../../generated/
|
||||
../../../protocol/
|
||||
../../../utils/
|
||||
../../common/
|
||||
../../supplements/har/
|
||||
../common/
|
||||
3
packages/playwright-core/src/server/trace/test/DEPS.list
Normal file
3
packages/playwright-core/src/server/trace/test/DEPS.list
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
[*]
|
||||
../../../**
|
||||
@trace-viewer/**
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
[*]
|
||||
../../
|
||||
../../../generated/
|
||||
../../../utils/
|
||||
../../chromium/crApp.ts
|
||||
4
packages/playwright-core/src/utils/DEPS.list
Normal file
4
packages/playwright-core/src/utils/DEPS.list
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
[*]
|
||||
../common/
|
||||
../protocol/
|
||||
../third_party/diff_match_patch
|
||||
5
packages/playwright-test/src/DEPS.list
Normal file
5
packages/playwright-test/src/DEPS.list
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[*]
|
||||
../types/testReporter.d.ts
|
||||
matchers/
|
||||
reporters/
|
||||
third_party/
|
||||
6
packages/playwright-test/src/matchers/DEPS.list
Normal file
6
packages/playwright-test/src/matchers/DEPS.list
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
[*]
|
||||
../expect.ts
|
||||
../globals.ts
|
||||
../testInfo.ts
|
||||
../types.ts
|
||||
../util.ts
|
||||
4
packages/playwright-test/src/reporters/DEPS.list
Normal file
4
packages/playwright-test/src/reporters/DEPS.list
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
[*]
|
||||
../types.ts
|
||||
../util.ts
|
||||
../../types/testReporter.d.ts
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
module.exports = {
|
||||
'/': [
|
||||
'@web/**'
|
||||
]
|
||||
};
|
||||
2
packages/recorder/src/DEPS.list
Normal file
2
packages/recorder/src/DEPS.list
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
[*]
|
||||
@web/**
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
module.exports = {
|
||||
'/': [
|
||||
'@web/**',
|
||||
'ui/',
|
||||
],
|
||||
|
||||
'ui/': [
|
||||
'@web/**',
|
||||
'geometry.ts',
|
||||
'entries.ts',
|
||||
]
|
||||
};
|
||||
3
packages/trace-viewer/src/DEPS.list
Normal file
3
packages/trace-viewer/src/DEPS.list
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
[*]
|
||||
@web/**
|
||||
ui/
|
||||
4
packages/trace-viewer/src/ui/DEPS.list
Normal file
4
packages/trace-viewer/src/ui/DEPS.list
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
[*]
|
||||
@web/**
|
||||
../entries.ts
|
||||
../geometry.ts
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue