diff --git a/package-lock.json b/package-lock.json index 8f3aba5172..7eefabb2c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6234,6 +6234,7 @@ "license": "Apache-2.0", "dependencies": { "@playwright/test": "1.36.0-next", + "playwright-core": "1.36.0-next", "vite": "^4.3.9" }, "bin": { @@ -7260,6 +7261,7 @@ "version": "file:packages/playwright-ct-core", "requires": { "@playwright/test": "1.36.0-next", + "playwright-core": "1.36.0-next", "vite": "^4.3.9" } }, diff --git a/packages/html-reporter/src/DEPS.list b/packages/html-reporter/src/DEPS.list index 5308eedfc2..c7e0c4943d 100644 --- a/packages/html-reporter/src/DEPS.list +++ b/packages/html-reporter/src/DEPS.list @@ -1,3 +1,15 @@ [*] @playwright/experimental-ct-react @web/** + +[chip.spec.tsx] +*** + +[headerView.spec.tsx] +*** + +[imageDiffView.spec.tsx] +*** + +[testCaseView.spec.tsx] +*** diff --git a/packages/playwright-core/src/server/chromium/crApp.ts b/packages/playwright-core/src/server/chromium/crApp.ts index bfa8819f2d..3456fe1304 100644 --- a/packages/playwright-core/src/server/chromium/crApp.ts +++ b/packages/playwright-core/src/server/chromium/crApp.ts @@ -16,7 +16,7 @@ import fs from 'fs'; import path from 'path'; -import { isUnderTest } from 'playwright-core/lib/utils'; +import { isUnderTest } from '../../utils'; import type { Page } from '../page'; import { registryDirectory } from '../registry'; import type { CRPage } from './crPage'; diff --git a/packages/playwright-core/src/server/dispatchers/debugControllerDispatcher.ts b/packages/playwright-core/src/server/dispatchers/debugControllerDispatcher.ts index 9714d69093..251ed1e3c7 100644 --- a/packages/playwright-core/src/server/dispatchers/debugControllerDispatcher.ts +++ b/packages/playwright-core/src/server/dispatchers/debugControllerDispatcher.ts @@ -15,8 +15,8 @@ */ import type * as channels from '@protocol/channels'; -import { eventsHelper } from 'playwright-core/lib/utils'; -import type { RegisteredListener } from 'playwright-core/lib/utils/eventsHelper'; +import { eventsHelper } from '../../utils'; +import type { RegisteredListener } from '../../utils/eventsHelper'; import { DebugController } from '../debugController'; import type { DispatcherConnection, RootDispatcher } from './dispatcher'; import { Dispatcher } from './dispatcher'; diff --git a/packages/playwright-core/src/server/trace/test/DEPS.list b/packages/playwright-core/src/server/trace/test/DEPS.list index 20f9319610..665f63400d 100644 --- a/packages/playwright-core/src/server/trace/test/DEPS.list +++ b/packages/playwright-core/src/server/trace/test/DEPS.list @@ -1,3 +1,2 @@ [*] -../../../** -@trace-viewer/** +*** diff --git a/packages/playwright-core/src/server/trace/viewer/DEPS.list b/packages/playwright-core/src/server/trace/viewer/DEPS.list index 89fcbb8161..16e752745d 100644 --- a/packages/playwright-core/src/server/trace/viewer/DEPS.list +++ b/packages/playwright-core/src/server/trace/viewer/DEPS.list @@ -3,4 +3,5 @@ ../../registry/ ../../../generated/ ../../../utils/ +../../../utilsBundle.ts ../../chromium/crApp.ts diff --git a/packages/playwright-core/src/server/trace/viewer/traceViewer.ts b/packages/playwright-core/src/server/trace/viewer/traceViewer.ts index 07c53db2fc..12caf129b5 100644 --- a/packages/playwright-core/src/server/trace/viewer/traceViewer.ts +++ b/packages/playwright-core/src/server/trace/viewer/traceViewer.ts @@ -23,7 +23,7 @@ import { installAppIcon, syncLocalStorageWithSettings } from '../../chromium/crA import { serverSideCallMetadata } from '../../instrumentation'; import { createPlaywright } from '../../playwright'; import { ProgressController } from '../../progress'; -import { open, wsServer } from 'playwright-core/lib/utilsBundle'; +import { open, wsServer } from '../../../utilsBundle'; import type { Page } from '../../page'; export type Transport = { diff --git a/packages/playwright-ct-core/package.json b/packages/playwright-ct-core/package.json index b407d3f84e..0365fe6b7f 100644 --- a/packages/playwright-ct-core/package.json +++ b/packages/playwright-ct-core/package.json @@ -21,6 +21,7 @@ "./lib/vitePlugin": "./lib/vitePlugin.js" }, "dependencies": { + "playwright-core": "1.36.0-next", "vite": "^4.3.9", "@playwright/test": "1.36.0-next" }, diff --git a/packages/playwright-ct-core/src/DEPS.list b/packages/playwright-ct-core/src/DEPS.list new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/components/ct-react-vite/package.json b/tests/components/ct-react-vite/package.json index 091b86c7e6..7f661a1532 100644 --- a/tests/components/ct-react-vite/package.json +++ b/tests/components/ct-react-vite/package.json @@ -19,9 +19,5 @@ "@vitejs/plugin-react": "^3.1.0", "typescript": "^4.5.4", "vite": "^4.2.1" - }, - "@standaloneDevDependencies": { - "@playwright/experimental-ct-react": "^1.22.0", - "@playwright/test": "^1.22.2" } } diff --git a/tests/components/ct-react17/package.json b/tests/components/ct-react17/package.json index 1765fc0a9d..792d0cdd0f 100644 --- a/tests/components/ct-react17/package.json +++ b/tests/components/ct-react17/package.json @@ -14,10 +14,6 @@ "react-scripts": "5.0.1", "typescript": "^4.6.2" }, - "@standaloneDevDependencies": { - "@playwright/experimental-ct-react17": "^1.2.2", - "@playwright/test": "^1.22.2" - }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", diff --git a/tests/components/ct-solid/package.json b/tests/components/ct-solid/package.json index 063342cc61..a298b78099 100644 --- a/tests/components/ct-solid/package.json +++ b/tests/components/ct-solid/package.json @@ -18,9 +18,5 @@ "typescript": "^4.7.4", "vite": "^4.2.1", "vite-plugin-solid": "^2.6.1" - }, - "@standaloneDevDependencies": { - "@playwright/experimental-ct-solid": "^1.22.2", - "@playwright/test": "^1.22.2" } } diff --git a/tests/components/ct-svelte-vite/package.json b/tests/components/ct-svelte-vite/package.json index e903343ed8..c11cbf1dc9 100644 --- a/tests/components/ct-svelte-vite/package.json +++ b/tests/components/ct-svelte-vite/package.json @@ -18,10 +18,6 @@ "typescript": "^4.5.4", "vite": "^4.2.1" }, - "@standaloneDevDependencies": { - "@playwright/experimental-ct-svelte": "^1.22.2", - "@playwright/test": "^1.22.2" - }, "dependencies": { "svelte": "^3.49.0", "svelte-navigator": "^3.2.2" diff --git a/tests/components/ct-svelte/package.json b/tests/components/ct-svelte/package.json index bdfb38249c..d5e068ac07 100644 --- a/tests/components/ct-svelte/package.json +++ b/tests/components/ct-svelte/package.json @@ -18,10 +18,6 @@ "rollup-plugin-terser": "^7.0.0", "sirv-cli": "^2.0.0" }, - "@standaloneDevDependencies": { - "@playwright/experimental-ct-svelte": "^1.22.2", - "@playwright/test": "^1.22.2" - }, "dependencies": { "svelte": "^3.0.0", "svelte-navigator": "^3.2.2" diff --git a/tests/components/ct-vue-cli/package.json b/tests/components/ct-vue-cli/package.json index 2e959d076f..e28d1136ec 100644 --- a/tests/components/ct-vue-cli/package.json +++ b/tests/components/ct-vue-cli/package.json @@ -24,10 +24,6 @@ "eslint": "^7.32.0", "eslint-plugin-vue": "^8.0.3" }, - "@standaloneDevDependencies": { - "@playwright/experimental-ct-vue": "^1.22.2", - "@playwright/test": "^1.22.2" - }, "eslintConfig": { "root": true, "env": { diff --git a/tests/components/ct-vue-vite/package.json b/tests/components/ct-vue-vite/package.json index 2687508698..c7491d0184 100644 --- a/tests/components/ct-vue-vite/package.json +++ b/tests/components/ct-vue-vite/package.json @@ -16,9 +16,5 @@ "@vue/tsconfig": "^0.1.3", "vite": "^4.2.1", "vue-tsc": "^1.0.0" - }, - "@standaloneDevDependencies": { - "@playwright/experimental-ct-vue": "^1.22.2", - "@playwright/test": "^1.22.2" } } diff --git a/tests/components/ct-vue2-cli/package.json b/tests/components/ct-vue2-cli/package.json index ebc160bc8f..de58a20455 100644 --- a/tests/components/ct-vue2-cli/package.json +++ b/tests/components/ct-vue2-cli/package.json @@ -23,10 +23,6 @@ "eslint": "^7.32.0", "eslint-plugin-vue": "^8.0.3" }, - "@standaloneDevDependencies": { - "@playwright/experimental-ct-vue2": "^1.22.2", - "@playwright/test": "^1.22.2" - }, "eslintConfig": { "root": true, "env": { diff --git a/utils/check_deps.js b/utils/check_deps.js index 3c083b4766..fbcf5554c3 100644 --- a/utils/check_deps.js +++ b/utils/check_deps.js @@ -21,12 +21,12 @@ const fs = require('fs'); const ts = require('typescript'); const path = require('path').posix; - +const Module = require('module'); +const builtins = new Set(Module.builtinModules); const packagesDir = path.resolve(path.join(__dirname, '..', 'packages')); const packages = new Map(); -for (const package of fs.readdirSync(packagesDir)) - packages.set(package, packagesDir + '/' + package + '/src/'); +packages.set('web', packagesDir + '/web/src/'); packages.set('injected', packagesDir + '/playwright-core/src/server/injected/'); packages.set('isomorphic', packagesDir + '/playwright-core/src/utils/isomorphic/'); packages.set('testIsomorphic', packagesDir + '/playwright-test/src/isomorphic/'); @@ -36,12 +36,13 @@ const peerDependencies = ['electron', 'react', 'react-dom', '@zip.js/zip.js']; const depsCache = {}; async function checkDeps() { - await innerCheckDeps(path.join(packagesDir, 'protocol')); - await innerCheckDeps(path.join(packagesDir, 'trace')); - await innerCheckDeps(path.join(packagesDir, 'web')); await innerCheckDeps(path.join(packagesDir, 'html-reporter')); + await innerCheckDeps(path.join(packagesDir, 'playwright-ct-core')); + await innerCheckDeps(path.join(packagesDir, 'protocol')); await innerCheckDeps(path.join(packagesDir, 'recorder')); await innerCheckDeps(path.join(packagesDir, 'trace-viewer')); + await innerCheckDeps(path.join(packagesDir, 'trace')); + await innerCheckDeps(path.join(packagesDir, 'web')); const corePackageJson = await innerCheckDeps(path.join(packagesDir, 'playwright-core')); const testPackageJson = await innerCheckDeps(path.join(packagesDir, 'playwright-test')); @@ -132,6 +133,9 @@ async function innerCheckDeps(root) { importPath = packages.get(package) + tokens.slice(1).join('/'); } + const mergedDeps = calculateDeps(fileName); + if (mergedDeps.includes('***')) + return; if (importPath) { if (!fs.existsSync(importPath)) { if (fs.existsSync(importPath + '.ts')) @@ -142,7 +146,7 @@ async function innerCheckDeps(root) { importPath = importPath + '.d.ts'; } - if (!allowImport(fileName, importPath)) + if (!allowImport(fileName, importPath, mergedDeps)) errors.push(`Disallowed import ${path.relative(root, importPath)} in ${path.relative(root, fileName)}`); return; } @@ -158,17 +162,13 @@ async function innerCheckDeps(root) { ts.forEachChild(node, x => visit(x, fileName)); } - function allowImport(from, to) { + function calculateDeps(from) { const fromDirectory = path.dirname(from); - const toDirectory = isDirectory(to) ? to : path.dirname(to); - if (to === toDirectory) - to = path.join(to, 'index.ts'); - if (fromDirectory === toDirectory) - return true; - let depsDirectory = fromDirectory; while (depsDirectory.startsWith(packagesDir) && !depsCache[depsDirectory] && !fs.existsSync(path.join(depsDirectory, 'DEPS.list'))) depsDirectory = path.dirname(depsDirectory); + if (!depsDirectory.startsWith(packagesDir)) + return []; let deps = depsCache[depsDirectory]; if (!deps) { @@ -192,7 +192,17 @@ async function innerCheckDeps(root) { depsCache[depsDirectory] = deps; } - const mergedDeps = [...(deps['*'] || []), ...(deps[path.relative(depsDirectory, from)] || [])] + return [...(deps['*'] || []), ...(deps[path.relative(depsDirectory, from)] || [])] + } + + function allowImport(from, to, mergedDeps) { + const fromDirectory = path.dirname(from); + const toDirectory = isDirectory(to) ? to : path.dirname(to); + if (to === toDirectory) + to = path.join(to, 'index.ts'); + if (fromDirectory === toDirectory) + return true; + for (const dep of mergedDeps) { if (dep === '***') return true; @@ -209,22 +219,16 @@ async function innerCheckDeps(root) { function allowExternalImport(importName, packageJSON) { // Only external imports are relevant. Files in src/web are bundled via webpack. - if (importName.startsWith('.') || importName.startsWith('@')) + if (importName.startsWith('.') || (importName.startsWith('@') && !importName.startsWith('@playwright/'))) return true; if (peerDependencies.includes(importName)) return true; - try { - const resolvedImport = require.resolve(importName); - if (!resolvedImport.includes('node_modules')) - return true; - } catch (error) { - if (error.code !== 'MODULE_NOT_FOUND') - throw error; - } if (!packageJSON) return false; const match = importName.match(/(@[\w-]+\/)?([^/]+)/); - const dependency = match[1] ? match[1] + '/' + match[2] : match[2]; + const dependency = match[1] ? match[1] + match[2] : match[2]; + if (builtins.has(dependency)) + return true; return !!(packageJSON.dependencies || {})[dependency]; } }