From 1c3db811f57b7f798dbd789fa7defb0483cb8209 Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Wed, 6 Apr 2022 13:40:19 -0800 Subject: [PATCH] chore: move to folder-based deps lists (#13361) --- packages/playwright-core/src/DEPS | 221 ------------------ packages/playwright-core/src/DEPS.list | 10 + packages/playwright-core/src/cli/DEPS.list | 16 ++ packages/playwright-core/src/client/DEPS.list | 5 + .../playwright-core/src/dispatchers/DEPS.list | 5 + packages/playwright-core/src/grid/DEPS.list | 5 + .../playwright-core/src/protocol/DEPS.list | 3 + packages/playwright-core/src/remote/DEPS.list | 5 + packages/playwright-core/src/server/DEPS.list | 21 ++ .../src/server/android/DEPS.list | 5 + .../src/server/common/DEPS.list | 3 + .../src/server/electron/DEPS.list | 5 + .../src/server/injected/DEPS.list | 2 + .../src/server/supplements/DEPS.list | 9 + .../src/server/supplements/injected/DEPS.list | 3 + .../src/server/supplements/recorder/DEPS.list | 8 + .../src/server/trace/common/DEPS.list | 3 + .../src/server/trace/recorder/DEPS.list | 9 + .../src/server/trace/test/DEPS.list | 3 + .../src/server/trace/viewer/DEPS.list | 5 + packages/playwright-core/src/utils/DEPS.list | 4 + packages/playwright-test/src/DEPS.list | 5 + .../playwright-test/src/matchers/DEPS.list | 6 + .../playwright-test/src/reporters/DEPS.list | 4 + packages/recorder/src/DEPS | 5 - packages/recorder/src/DEPS.list | 2 + packages/trace-viewer/src/DEPS | 12 - packages/trace-viewer/src/DEPS.list | 3 + packages/trace-viewer/src/ui/DEPS.list | 4 + utils/check_deps.js | 73 +++--- 30 files changed, 189 insertions(+), 275 deletions(-) delete mode 100644 packages/playwright-core/src/DEPS create mode 100644 packages/playwright-core/src/DEPS.list create mode 100644 packages/playwright-core/src/cli/DEPS.list create mode 100644 packages/playwright-core/src/client/DEPS.list create mode 100644 packages/playwright-core/src/dispatchers/DEPS.list create mode 100644 packages/playwright-core/src/grid/DEPS.list create mode 100644 packages/playwright-core/src/protocol/DEPS.list create mode 100644 packages/playwright-core/src/remote/DEPS.list create mode 100644 packages/playwright-core/src/server/DEPS.list create mode 100644 packages/playwright-core/src/server/android/DEPS.list create mode 100644 packages/playwright-core/src/server/common/DEPS.list create mode 100644 packages/playwright-core/src/server/electron/DEPS.list create mode 100644 packages/playwright-core/src/server/injected/DEPS.list create mode 100644 packages/playwright-core/src/server/supplements/DEPS.list create mode 100644 packages/playwright-core/src/server/supplements/injected/DEPS.list create mode 100644 packages/playwright-core/src/server/supplements/recorder/DEPS.list create mode 100644 packages/playwright-core/src/server/trace/common/DEPS.list create mode 100644 packages/playwright-core/src/server/trace/recorder/DEPS.list create mode 100644 packages/playwright-core/src/server/trace/test/DEPS.list create mode 100644 packages/playwright-core/src/server/trace/viewer/DEPS.list create mode 100644 packages/playwright-core/src/utils/DEPS.list create mode 100644 packages/playwright-test/src/DEPS.list create mode 100644 packages/playwright-test/src/matchers/DEPS.list create mode 100644 packages/playwright-test/src/reporters/DEPS.list delete mode 100644 packages/recorder/src/DEPS create mode 100644 packages/recorder/src/DEPS.list delete mode 100644 packages/trace-viewer/src/DEPS create mode 100644 packages/trace-viewer/src/DEPS.list create mode 100644 packages/trace-viewer/src/ui/DEPS.list diff --git a/packages/playwright-core/src/DEPS b/packages/playwright-core/src/DEPS deleted file mode 100644 index e19298276f..0000000000 --- a/packages/playwright-core/src/DEPS +++ /dev/null @@ -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', - ], -}; diff --git a/packages/playwright-core/src/DEPS.list b/packages/playwright-core/src/DEPS.list new file mode 100644 index 0000000000..6b9ffb8d3c --- /dev/null +++ b/packages/playwright-core/src/DEPS.list @@ -0,0 +1,10 @@ +[browserServerImpl.ts] +** + +[inProcessFactory.ts] +** + +[outofprocess.ts] +client/ +protocol/ +utils/ diff --git a/packages/playwright-core/src/cli/DEPS.list b/packages/playwright-core/src/cli/DEPS.list new file mode 100644 index 0000000000..895b967f15 --- /dev/null +++ b/packages/playwright-core/src/cli/DEPS.list @@ -0,0 +1,16 @@ +[*] +../../ +../client +../debug/injected +../generated/ +../grid +../server/injected/ +../server/trace +../utils + +[cli.ts] +../server/trace/viewer/traceViewer.ts + +[driver.ts] +../** +../../ diff --git a/packages/playwright-core/src/client/DEPS.list b/packages/playwright-core/src/client/DEPS.list new file mode 100644 index 0000000000..b6a22ccc40 --- /dev/null +++ b/packages/playwright-core/src/client/DEPS.list @@ -0,0 +1,5 @@ +[*] +../../types/ +../common/ +../protocol/ +../utils/ diff --git a/packages/playwright-core/src/dispatchers/DEPS.list b/packages/playwright-core/src/dispatchers/DEPS.list new file mode 100644 index 0000000000..080d01218a --- /dev/null +++ b/packages/playwright-core/src/dispatchers/DEPS.list @@ -0,0 +1,5 @@ +[*] +../common/ +../protocol/ +../server/** +../utils/ diff --git a/packages/playwright-core/src/grid/DEPS.list b/packages/playwright-core/src/grid/DEPS.list new file mode 100644 index 0000000000..4874d0e91a --- /dev/null +++ b/packages/playwright-core/src/grid/DEPS.list @@ -0,0 +1,5 @@ +[*] +../client/ +../dispatchers/ +../server/ +../utils/ diff --git a/packages/playwright-core/src/protocol/DEPS.list b/packages/playwright-core/src/protocol/DEPS.list new file mode 100644 index 0000000000..b633cc6bb5 --- /dev/null +++ b/packages/playwright-core/src/protocol/DEPS.list @@ -0,0 +1,3 @@ +[*] +../utils/ + diff --git a/packages/playwright-core/src/remote/DEPS.list b/packages/playwright-core/src/remote/DEPS.list new file mode 100644 index 0000000000..4874d0e91a --- /dev/null +++ b/packages/playwright-core/src/remote/DEPS.list @@ -0,0 +1,5 @@ +[*] +../client/ +../dispatchers/ +../server/ +../utils/ diff --git a/packages/playwright-core/src/server/DEPS.list b/packages/playwright-core/src/server/DEPS.list new file mode 100644 index 0000000000..486abf1b65 --- /dev/null +++ b/packages/playwright-core/src/server/DEPS.list @@ -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/ diff --git a/packages/playwright-core/src/server/android/DEPS.list b/packages/playwright-core/src/server/android/DEPS.list new file mode 100644 index 0000000000..1c899cb3f3 --- /dev/null +++ b/packages/playwright-core/src/server/android/DEPS.list @@ -0,0 +1,5 @@ +[*] +../ +../../protocol/ +../../utils/ +../chromium/ diff --git a/packages/playwright-core/src/server/common/DEPS.list b/packages/playwright-core/src/server/common/DEPS.list new file mode 100644 index 0000000000..b03928f3ea --- /dev/null +++ b/packages/playwright-core/src/server/common/DEPS.list @@ -0,0 +1,3 @@ +[*] + + diff --git a/packages/playwright-core/src/server/electron/DEPS.list b/packages/playwright-core/src/server/electron/DEPS.list new file mode 100644 index 0000000000..1c899cb3f3 --- /dev/null +++ b/packages/playwright-core/src/server/electron/DEPS.list @@ -0,0 +1,5 @@ +[*] +../ +../../protocol/ +../../utils/ +../chromium/ diff --git a/packages/playwright-core/src/server/injected/DEPS.list b/packages/playwright-core/src/server/injected/DEPS.list new file mode 100644 index 0000000000..c0a39450ff --- /dev/null +++ b/packages/playwright-core/src/server/injected/DEPS.list @@ -0,0 +1,2 @@ +[*] +../common/ diff --git a/packages/playwright-core/src/server/supplements/DEPS.list b/packages/playwright-core/src/server/supplements/DEPS.list new file mode 100644 index 0000000000..730710de31 --- /dev/null +++ b/packages/playwright-core/src/server/supplements/DEPS.list @@ -0,0 +1,9 @@ +[*] +../ +../../common/ +../../protocol/ +../../utils/ + +[recorderSupplement.ts] +../../generated/ +./recorder/ diff --git a/packages/playwright-core/src/server/supplements/injected/DEPS.list b/packages/playwright-core/src/server/supplements/injected/DEPS.list new file mode 100644 index 0000000000..db653ddbcd --- /dev/null +++ b/packages/playwright-core/src/server/supplements/injected/DEPS.list @@ -0,0 +1,3 @@ +[*] +../../injected/ +../../../utils/ diff --git a/packages/playwright-core/src/server/supplements/recorder/DEPS.list b/packages/playwright-core/src/server/supplements/recorder/DEPS.list new file mode 100644 index 0000000000..0746fc118c --- /dev/null +++ b/packages/playwright-core/src/server/supplements/recorder/DEPS.list @@ -0,0 +1,8 @@ +[*] +../../ +../../../common/ +../../../protocol/ +../../../utils/ + +[recorderApp.ts] +../../chromium/crApp.ts diff --git a/packages/playwright-core/src/server/trace/common/DEPS.list b/packages/playwright-core/src/server/trace/common/DEPS.list new file mode 100644 index 0000000000..d1b4fafa19 --- /dev/null +++ b/packages/playwright-core/src/server/trace/common/DEPS.list @@ -0,0 +1,3 @@ +[*] +../../supplements/har/ + diff --git a/packages/playwright-core/src/server/trace/recorder/DEPS.list b/packages/playwright-core/src/server/trace/recorder/DEPS.list new file mode 100644 index 0000000000..de980e0f5e --- /dev/null +++ b/packages/playwright-core/src/server/trace/recorder/DEPS.list @@ -0,0 +1,9 @@ +[*] +../../ +../../../common/ +../../../generated/ +../../../protocol/ +../../../utils/ +../../common/ +../../supplements/har/ +../common/ diff --git a/packages/playwright-core/src/server/trace/test/DEPS.list b/packages/playwright-core/src/server/trace/test/DEPS.list new file mode 100644 index 0000000000..20f9319610 --- /dev/null +++ b/packages/playwright-core/src/server/trace/test/DEPS.list @@ -0,0 +1,3 @@ +[*] +../../../** +@trace-viewer/** diff --git a/packages/playwright-core/src/server/trace/viewer/DEPS.list b/packages/playwright-core/src/server/trace/viewer/DEPS.list new file mode 100644 index 0000000000..1cebb92f14 --- /dev/null +++ b/packages/playwright-core/src/server/trace/viewer/DEPS.list @@ -0,0 +1,5 @@ +[*] +../../ +../../../generated/ +../../../utils/ +../../chromium/crApp.ts diff --git a/packages/playwright-core/src/utils/DEPS.list b/packages/playwright-core/src/utils/DEPS.list new file mode 100644 index 0000000000..13d4b69170 --- /dev/null +++ b/packages/playwright-core/src/utils/DEPS.list @@ -0,0 +1,4 @@ +[*] +../common/ +../protocol/ +../third_party/diff_match_patch diff --git a/packages/playwright-test/src/DEPS.list b/packages/playwright-test/src/DEPS.list new file mode 100644 index 0000000000..82866d9e70 --- /dev/null +++ b/packages/playwright-test/src/DEPS.list @@ -0,0 +1,5 @@ +[*] +../types/testReporter.d.ts +matchers/ +reporters/ +third_party/ diff --git a/packages/playwright-test/src/matchers/DEPS.list b/packages/playwright-test/src/matchers/DEPS.list new file mode 100644 index 0000000000..7962ccfdda --- /dev/null +++ b/packages/playwright-test/src/matchers/DEPS.list @@ -0,0 +1,6 @@ +[*] +../expect.ts +../globals.ts +../testInfo.ts +../types.ts +../util.ts diff --git a/packages/playwright-test/src/reporters/DEPS.list b/packages/playwright-test/src/reporters/DEPS.list new file mode 100644 index 0000000000..28dcf01afa --- /dev/null +++ b/packages/playwright-test/src/reporters/DEPS.list @@ -0,0 +1,4 @@ +[*] +../types.ts +../util.ts +../../types/testReporter.d.ts diff --git a/packages/recorder/src/DEPS b/packages/recorder/src/DEPS deleted file mode 100644 index 1949198364..0000000000 --- a/packages/recorder/src/DEPS +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - '/': [ - '@web/**' - ] -}; diff --git a/packages/recorder/src/DEPS.list b/packages/recorder/src/DEPS.list new file mode 100644 index 0000000000..3bc0094942 --- /dev/null +++ b/packages/recorder/src/DEPS.list @@ -0,0 +1,2 @@ +[*] +@web/** diff --git a/packages/trace-viewer/src/DEPS b/packages/trace-viewer/src/DEPS deleted file mode 100644 index 4bb77445cb..0000000000 --- a/packages/trace-viewer/src/DEPS +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = { - '/': [ - '@web/**', - 'ui/', - ], - - 'ui/': [ - '@web/**', - 'geometry.ts', - 'entries.ts', - ] -}; diff --git a/packages/trace-viewer/src/DEPS.list b/packages/trace-viewer/src/DEPS.list new file mode 100644 index 0000000000..2ebecad755 --- /dev/null +++ b/packages/trace-viewer/src/DEPS.list @@ -0,0 +1,3 @@ +[*] +@web/** +ui/ diff --git a/packages/trace-viewer/src/ui/DEPS.list b/packages/trace-viewer/src/ui/DEPS.list new file mode 100644 index 0000000000..a55f4b2e25 --- /dev/null +++ b/packages/trace-viewer/src/ui/DEPS.list @@ -0,0 +1,4 @@ +[*] +@web/** +../entries.ts +../geometry.ts diff --git a/utils/check_deps.js b/utils/check_deps.js index 53645a107c..203e515d9b 100644 --- a/utils/check_deps.js +++ b/utils/check_deps.js @@ -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);