From 76c7f5b7e7094deaef382eba129f6ca6f5b065d2 Mon Sep 17 00:00:00 2001 From: Josh Black Date: Mon, 9 Nov 2026 12:14:19 -0600 Subject: [PATCH 1/3] ci: update internal mirror step to check for package age --- .github/workflows/ci.yml | 10 ++ script/check-package-release-age.mts | 214 +++++++++++++++++++++++++++ 2 files changed, 224 insertions(+) create mode 100644 script/check-package-release-age.mts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bd5c9ab895b..4c23436f190 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,6 +38,8 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 + with: + fetch-depth: 0 - name: Check lockfiles for internal package feed URLs shell: bash run: | @@ -46,6 +48,14 @@ jobs: echo "::error::A lockfile contains internal package feed URLs. Replace them with public registry URLs using script/update-registry-download-urls." exit 1 fi + - name: Set up Node.js + uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 + with: + node-version-file: '.nvmrc' + - name: Check new locked packages are at least 7 days old + env: + BASE_REF: ${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha || github.event.before }} + run: node script/check-package-release-age.mts --diff "$BASE_REF" lint: runs-on: ubuntu-latest diff --git a/script/check-package-release-age.mts b/script/check-package-release-age.mts new file mode 100644 index 00000000000..047d54d19d6 --- /dev/null +++ b/script/check-package-release-age.mts @@ -0,0 +1,214 @@ +import {readFileSync} from 'node:fs' +import {execFileSync} from 'node:child_process' +import {setTimeout} from 'node:timers/promises' +import {parseArgs} from 'node:util' + +const concurrency = 20 +const retries = 3 + +interface LockfileEntry { + name?: string + version?: string + link?: boolean +} + +interface Lockfile { + packages?: Record +} + +interface RegistryMetadata { + versions?: Record + time?: Record +} + +async function fetchMetadata(name: string, registryUrl: URL): Promise { + for (let attempt = 0; ; attempt++) { + let response: Response | undefined + try { + response = await fetch(new URL(encodeURIComponent(name), registryUrl), { + signal: AbortSignal.timeout(30_000), + }) + if (response.ok) { + return await response.json() + } + } catch (error) { + if (attempt === retries) { + throw new Error(`Cannot verify ${name}: ${error instanceof Error ? error.message : String(error)}`, { + cause: error, + }) + } + response = undefined + } + + if ( + response && + (attempt === retries || (response.status < 500 && response.status !== 408 && response.status !== 429)) + ) { + if (response.status === 404) { + throw new Error(`Configured registry does not have package ${name}`) + } + throw new Error(`Cannot verify ${name}: configured registry returned HTTP ${response.status}`) + } + + await setTimeout(1000 * 2 ** attempt) + } +} + +function getLockedPackages(lockfiles: Record) { + const packages = new Map>>() + + for (const [filename, lockfile] of Object.entries(lockfiles)) { + if (!lockfile.packages) { + throw new Error(`${filename} must use lockfileVersion 2 or later to verify package release ages`) + } + + for (const [path, entry] of Object.entries(lockfile.packages)) { + if (!path.includes('node_modules/') || entry.link) { + continue + } + + const name = entry.name ?? path.slice(path.lastIndexOf('node_modules/') + 'node_modules/'.length) + if (!entry.version) { + throw new Error(`Cannot verify package version for ${name} in ${filename}`) + } + let versions = packages.get(name) + if (!versions) { + versions = new Map() + packages.set(name, versions) + } + let filenames = versions.get(entry.version) + if (!filenames) { + filenames = new Set() + versions.set(entry.version, filenames) + } + filenames.add(filename) + } + } + + return packages +} + +async function checkPackageReleaseAge( + lockfiles: Record, + baseLockfiles: Record = {}, + now = Date.now(), +) { + const packages = getLockedPackages(lockfiles) + for (const [name, versions] of getLockedPackages(baseLockfiles)) { + const currentVersions = packages.get(name) + if (!currentVersions) { + continue + } + for (const version of versions.keys()) { + currentVersions.delete(version) + } + if (currentVersions.size === 0) { + packages.delete(name) + } + } + if (packages.size === 0) { + return [] + } + + const cutoff = now - 7 * 24 * 60 * 60 * 1000 + const registry = execFileSync('npm', ['config', 'get', 'registry'], { + encoding: 'utf8', + }).trim() + const registryUrl = new URL(registry.endsWith('/') ? registry : `${registry}/`) + const errors: Array = [] + const entries = [...packages] + for (let index = 0; index < entries.length; index += concurrency) { + await Promise.all( + entries.slice(index, index + concurrency).map(async ([name, versions]) => { + const metadata = await fetchMetadata(name, registryUrl) + + for (const [version, filenames] of versions) { + const label = `${name}@${version} (${[...filenames].join(', ')})` + if (!metadata.versions || !Object.hasOwn(metadata.versions, version)) { + errors.push(`Configured registry does not have package version ${label}`) + continue + } + const timestamp = metadata.time?.[version] + const published = typeof timestamp === 'string' ? Date.parse(timestamp) : NaN + if (!Number.isFinite(published)) { + errors.push(`Cannot verify publish time for ${label}`) + } else if (published > cutoff) { + errors.push(`${label} is younger than 7 days (published ${timestamp})`) + } + } + }), + ) + } + + return errors +} + +if (import.meta.main) { + try { + const {values, positionals} = parseArgs({ + options: { + diff: { + type: 'boolean', + }, + }, + allowPositionals: true, + }) + if (positionals.length > 1 || (!values.diff && positionals.length > 0)) { + throw new Error('Usage: node script/check-package-release-age.ts [--diff [base-ref]]') + } + + const filenames = execFileSync('git', ['ls-files', '-z', '*package-lock.json', '*npm-shrinkwrap.json'], { + encoding: 'utf8', + }) + .split('\0') + .filter(Boolean) + if (filenames.length === 0) { + throw new Error('No tracked npm lockfiles found') + } + + const lockfiles: Record = Object.fromEntries( + filenames.map(filename => { + return [filename, JSON.parse(readFileSync(filename, 'utf8'))] + }), + ) + let baseLockfiles: Record = {} + if (values.diff) { + const base = execFileSync('git', ['merge-base', 'HEAD', positionals[0] ?? 'origin/main'], { + encoding: 'utf8', + }).trim() + const baseFilenames = execFileSync('git', ['ls-tree', '-r', '--name-only', '-z', base], { + encoding: 'utf8', + }) + .split('\0') + .filter(filename => { + return filename.endsWith('package-lock.json') || filename.endsWith('npm-shrinkwrap.json') + }) + baseLockfiles = Object.fromEntries( + baseFilenames.map(filename => { + return [ + filename, + JSON.parse( + execFileSync('git', ['show', `${base}:${filename}`], { + encoding: 'utf8', + maxBuffer: 50 * 1024 * 1024, + }), + ), + ] + }), + ) + } + + const errors = await checkPackageReleaseAge(lockfiles, baseLockfiles) + for (const error of errors) { + process.stderr.write(`::error::${error}\n`) + } + if (errors.length > 0) { + process.exitCode = 1 + } else { + process.stdout.write('All checked registry package versions are at least 7 days old.\n') + } + } catch (error) { + process.stderr.write(`::error::${error instanceof Error ? error.message : String(error)}\n`) + process.exitCode = 1 + } +} From 0936d04916f4f5830b49e6b94944c280e0ddffab Mon Sep 17 00:00:00 2001 From: Josh Black Date: Mon, 9 Nov 2026 12:24:21 -0600 Subject: [PATCH 2/3] chore(deps): update deps to mirror compatible versions --- .github/workflows/aat-reports.yml | 2 +- .github/workflows/ci.yml | 2 +- .github/workflows/stress-tests.yml | 2 +- .github/workflows/vrt-reports.yml | 2 +- .github/workflows/vrt.yml | 2 +- package-lock.json | 128 ++++++++++++++--------------- package.json | 4 +- packages/react/package.json | 2 +- 8 files changed, 72 insertions(+), 72 deletions(-) diff --git a/.github/workflows/aat-reports.yml b/.github/workflows/aat-reports.yml index 6258a1566e9..556758ef190 100644 --- a/.github/workflows/aat-reports.yml +++ b/.github/workflows/aat-reports.yml @@ -44,7 +44,7 @@ jobs: echo "pid=$pid" >> $GITHUB_OUTPUT sleep 5 - name: Run AAT - uses: docker://mcr.microsoft.com/playwright:v1.65.0-jammy + uses: docker://mcr.microsoft.com/playwright:v1.64.1-jammy env: STORYBOOK_URL: 'http://172.17.0.1:6006' with: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4c23436f190..a0d16b2eda1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -111,7 +111,7 @@ jobs: run: npm run build continue-on-error: ${{ matrix.react-version == 'react-19' }} - name: Run tests defined in vitest - uses: docker://mcr.microsoft.com/playwright:v1.65.0-jammy + uses: docker://mcr.microsoft.com/playwright:v1.64.1-jammy with: args: npm test diff --git a/.github/workflows/stress-tests.yml b/.github/workflows/stress-tests.yml index 4e1bd394076..c1290df4752 100644 --- a/.github/workflows/stress-tests.yml +++ b/.github/workflows/stress-tests.yml @@ -25,7 +25,7 @@ jobs: echo "pid=$pid" >> $GITHUB_OUTPUT sleep 5 - name: Run Stress Tests - uses: docker://mcr.microsoft.com/playwright:v1.65.0-jammy + uses: docker://mcr.microsoft.com/playwright:v1.64.1-jammy env: STORYBOOK_URL: 'http://172.17.0.1:6006' with: diff --git a/.github/workflows/vrt-reports.yml b/.github/workflows/vrt-reports.yml index b613a8724c3..4d096c18ffa 100644 --- a/.github/workflows/vrt-reports.yml +++ b/.github/workflows/vrt-reports.yml @@ -51,7 +51,7 @@ jobs: echo "pid=$pid" >> $GITHUB_OUTPUT sleep 5 - name: Run VRT - uses: docker://mcr.microsoft.com/playwright:v1.65.0-jammy + uses: docker://mcr.microsoft.com/playwright:v1.64.1-jammy env: STORYBOOK_URL: 'http://172.17.0.1:6006' STYLED_REACT_STORYBOOK_URL: 'http://172.17.0.1:6007' diff --git a/.github/workflows/vrt.yml b/.github/workflows/vrt.yml index 3ae65cb5aec..6570db60625 100644 --- a/.github/workflows/vrt.yml +++ b/.github/workflows/vrt.yml @@ -66,7 +66,7 @@ jobs: echo "pid=$pid" >> $GITHUB_OUTPUT sleep 5 - name: Run VRT - uses: docker://mcr.microsoft.com/playwright:v1.65.0-jammy + uses: docker://mcr.microsoft.com/playwright:v1.64.1-jammy env: STORYBOOK_URL: 'http://172.17.0.1:6006' STYLED_REACT_STORYBOOK_URL: 'http://172.17.0.1:6007' diff --git a/package-lock.json b/package-lock.json index 8aef2584256..f496caad547 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ "@github/mini-throttle": "2.1.1", "@github/prettier-config": "0.0.6", "@mdx-js/react": "1.6.22", - "@playwright/test": "^1.65.0", + "@playwright/test": "1.64.1", "@prettier/sync": "0.5.5", "@primer/stylelint-config": "13.5.0", "@size-limit/preset-big-lib": "11.2.0", @@ -62,7 +62,7 @@ "prettier": "3.4.2", "rimraf": "5.0.5", "size-limit": "11.2.0", - "storybook": "10.6.6", + "storybook": "10.6.5", "stylelint": "17.4.0", "turbo": "^2.9.18", "typescript": "^6.0.3", @@ -548,13 +548,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.13", - "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.29.13.tgz", - "integrity": "sha512-T5FRo+RzVHvGjWOuF1Ljc44b+NXAOazodHkGUHp4I3zCkQ4/sNVJm56h1S278LMR0bY5xBhztGziSbli8zObIw==", + "version": "7.29.12", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.12.tgz", + "integrity": "sha512-2W76mhjrpQFO1lK5e8IvGYB2D0YZ7S2R1Z2BjO2ZUYuW+amcpK/z60U6ZZmzskwoa7sJ6XohP/Wg8H5KxXI/IA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.13", + "@babel/parser": "^7.29.12", "@babel/types": "^7.29.11", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", @@ -678,15 +678,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.29.13", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.13.tgz", - "integrity": "sha512-/U96wOz+SCoZ7Da/8kjDGltcNY280JPQcRNPK0Hk3PTbdpaiBDQImtC6JsbVwb1HGMr3usZQU2WsWVjhYNmRzw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha1-sGJ0elmXuhOGNyATKLv/d5YFdK4=", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.13" + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -747,9 +747,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.29.13", - "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.29.13.tgz", - "integrity": "sha512-fWegr+WsEsiMVW4KUNdIIzzMTZSzNiqhy0//6+2MRi2d5NFNsL/AYwBQW8eBnRbTBVRnDVzjaJEUqKaCWjMMdQ==", + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.11.tgz", + "integrity": "sha512-snZbO7MEDOof+hvNa97EjEY7qD7h2kwvQr5AJC3ZhQudKW5dnej6k3kP9NQV88hJwaS8vDqRLFo9rivLEhle2g==", "dev": true, "license": "MIT", "engines": { @@ -867,9 +867,9 @@ "license": "MIT" }, "node_modules/@babel/parser": { - "version": "7.29.13", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.13.tgz", - "integrity": "sha512-fJM50YYjlTiBhgdkGmC1tBpv+FMAyo4annf2X6Aks+0yRlaiVkYW/3f07xAfVVkYIoZ9fFZp+mEThUFnuybhkQ==", + "version": "7.29.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.12.tgz", + "integrity": "sha512-WJ7JBp/Q4+z/ImydtI7jS6NVco5++632ExBemSX+Ysb+G1lCwQ5BVo3SY+jGGOcZXI4ZccbZSUSJLNBW6eEpJg==", "dev": true, "license": "MIT", "dependencies": { @@ -1745,16 +1745,16 @@ } }, "node_modules/@babel/traverse": { - "version": "7.29.13", - "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.29.13.tgz", - "integrity": "sha512-0ve0xMlFA73dgY1oyJRY6RoW+/bncdcOQqg6jjYcVfXBK90OdLXjm9R6lmRetdZVrPjXkKIoMVBqYFPjcAlZ4Q==", + "version": "7.29.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.12.tgz", + "integrity": "sha512-MscXe/NAZcOkYEsRajHZFt3ynsb22PUi6CTrp5U7+RYycR9By84mn9mFN54YgfITiqK4hFx3Ju3tZSyzfpS5ew==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.13", + "@babel/generator": "^7.29.12", "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.13", + "@babel/parser": "^7.29.12", "@babel/template": "^7.29.7", "@babel/types": "^7.29.11", "debug": "^4.3.1" @@ -7568,13 +7568,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.65.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.65.0.tgz", - "integrity": "sha512-iGURLGuKDLakSEl7Pgfv8h7f+XLT+V861Wfhz0zlEl5nyFuKUopdkFBPKqTllTUp06aOwPuH8iuUEb3yp3MpbQ==", + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.64.1.tgz", + "integrity": "sha512-IaYGml/nSOiZWROfPtuIL7neuu9qDOZ3TNvNljUIrhDMxiGTgPjzj/g9p9RxpS2tSepPDRY+UwAaEeiKtUvIAg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.65.0" + "playwright": "1.64.1" }, "bin": { "playwright": "cli.js" @@ -9348,9 +9348,9 @@ } }, "node_modules/@storybook/addon-mcp": { - "version": "10.6.6", - "resolved": "https://registry.npmmirror.com/@storybook/addon-mcp/-/addon-mcp-10.6.6.tgz", - "integrity": "sha512-JMXgHRuJCI5tbjxE4mk38VMUmaETHOGwAYlxVcPI3SwGHeVWUTHhLMJiLZN6JIkkAT71J75o5q1Zi9kFUoXBOg==", + "version": "10.6.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-mcp/-/addon-mcp-10.6.5.tgz", + "integrity": "sha512-i8TNgzBWguyGdb45+7VTcAqQr/wn3nSDSD6aW8yZtvVee+jv3CtaEjVFGmQbCdNHIQjYN0hqWW4Cg7vmqlISGg==", "dev": true, "license": "MIT", "dependencies": { @@ -9364,8 +9364,8 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@storybook/addon-vitest": "^10.6.6", - "storybook": "^10.6.6" + "@storybook/addon-vitest": "^10.6.5", + "storybook": "^10.6.5" }, "peerDependenciesMeta": { "@storybook/addon-vitest": { @@ -23233,13 +23233,13 @@ } }, "node_modules/playwright": { - "version": "1.65.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.65.0.tgz", - "integrity": "sha512-F3AMWcR44qMBt4kq+6Kb6mX7bjGXshktKFOPULd7reED6ZJWevjbNRqysP7q+AATE9kdPEZBibex1BYsvpVoeA==", + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.64.1.tgz", + "integrity": "sha512-HCrVhHr5QQuwYoswEUGTb7gGp522yflbv/ST8nF4sFWGuLjQCt17Q/EubpGGSNKYn1tsTCPZxqHhHCfVURu7UA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.65.0" + "playwright-core": "1.64.1" }, "bin": { "playwright": "cli.js" @@ -23249,9 +23249,9 @@ } }, "node_modules/playwright-core": { - "version": "1.65.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.65.0.tgz", - "integrity": "sha512-vNSKgH6YqtN7cdT/L334zo0a+YwkrpicyrHJlWWPIm/Q+Nn2SWInil01oT0mbu96U4GgoRtCYQD9CzJQgju+lA==", + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.64.1.tgz", + "integrity": "sha512-BC4s8y6SEVA6Q1rSxZTto8hI1KUI3xXlHGZgvGqP4IqPdI/a6FX9H29IDNz7vKo9l21b6LfYosScPL6M3xxyDQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -25284,7 +25284,7 @@ }, "node_modules/react-docgen/node_modules/@babel/compat-data": { "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", @@ -25293,21 +25293,21 @@ } }, "node_modules/react-docgen/node_modules/@babel/core": { - "version": "7.29.13", - "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.29.13.tgz", - "integrity": "sha512-j1nvOQCZYSgp7HLmisnCXFTpVvFODiijQ9QHkORfGKWH6YDtskTEeCJS7eV545GZ9UBzrq0e2xsOd5QQ5PjIqw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.13", - "@babel/helper-compilation-targets": "^7.29.13", - "@babel/helper-module-transforms": "^7.29.13", - "@babel/helpers": "^7.29.13", - "@babel/parser": "^7.29.13", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.13", - "@babel/types": "^7.29.11", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -25324,9 +25324,9 @@ } }, "node_modules/react-docgen/node_modules/@babel/helper-compilation-targets": { - "version": "7.29.13", - "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.13.tgz", - "integrity": "sha512-8WxJ4/Vmes3ghacj8VOJy3NW8eyHiFY/4thU/LSBuBE470+igjR/j1ZTNn8fV5VdNrLx6iXUwig526UdOvfP0w==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", "dependencies": { @@ -25341,14 +25341,14 @@ } }, "node_modules/react-docgen/node_modules/@babel/helpers": { - "version": "7.29.13", - "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.29.13.tgz", - "integrity": "sha512-laoRpD/kO/iA4CDlgJbixHekg7oPvWALK0PQyK3Ob2I2njZRvVAD77RfWCIImtqWCq6KijoBoZK7bp/HlTWASQ==", + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.10.tgz", + "integrity": "sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.29.7", - "@babel/types": "^7.29.11" + "@babel/types": "^7.29.8" }, "engines": { "node": ">=6.9.0" @@ -25356,7 +25356,7 @@ }, "node_modules/react-docgen/node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", @@ -25365,13 +25365,13 @@ } }, "node_modules/react-docgen/node_modules/semver": { - "version": "6.3.2", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.2.tgz", - "integrity": "sha512-GYrCADwpu6yV5OAvchkQ27Z5wwMxWAEMg5NNWjyHh/5DboFFqbdbvYNIvZouQpxXyeMPoTOh0vdPYKlf0ZswdQ==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { - "semver": "bin/semver.js" + "semver": "./bin/semver.js" } }, "node_modules/react-docgen/node_modules/strip-indent": { @@ -27006,9 +27006,9 @@ "license": "MIT" }, "node_modules/storybook": { - "version": "10.6.6", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.6.6.tgz", - "integrity": "sha512-lCROrR6Fj+WDBoJu4yp6o/cqcg376Sg85hiUnTh00I0EStk8xFRvTdzRuNWHlLA8itQrkz6Lo/IqFZ1FVXMiAA==", + "version": "10.6.5", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.6.5.tgz", + "integrity": "sha512-qurC38Nx4PDF9YIq6GO95dpUx8a3B9AZwlcHBo4cOI9At09ifjQRsqcwcdOf2YX0cpVhFKmHkI20SWCrxqYQrg==", "dev": true, "license": "MIT", "dependencies": { @@ -30983,7 +30983,7 @@ "rolldown-plugin-dts": "^0.26.0", "rolldown-plugin-import-css": "^0.0.0", "rolldown-plugin-preserve-directives": "^0.0.0", - "storybook": "10.6.6", + "storybook": "10.6.5", "terser": "5.36.0", "ts-toolbelt": "9.6.0", "tsx": "4.20.3", diff --git a/package.json b/package.json index 83f39211b6c..acf91747d67 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "@github/mini-throttle": "2.1.1", "@github/prettier-config": "0.0.6", "@mdx-js/react": "1.6.22", - "@playwright/test": "^1.65.0", + "@playwright/test": "1.64.1", "@prettier/sync": "0.5.5", "@primer/stylelint-config": "13.5.0", "@size-limit/preset-big-lib": "11.2.0", @@ -91,7 +91,7 @@ "prettier": "3.4.2", "rimraf": "5.0.5", "size-limit": "11.2.0", - "storybook": "10.6.6", + "storybook": "10.6.5", "stylelint": "17.4.0", "turbo": "^2.9.18", "typescript": "^6.0.3", diff --git a/packages/react/package.json b/packages/react/package.json index 162b48cbc5b..8d6c78156e6 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -169,7 +169,7 @@ "rolldown-plugin-dts": "^0.26.0", "rolldown-plugin-import-css": "^0.0.0", "rolldown-plugin-preserve-directives": "^0.0.0", - "storybook": "10.6.6", + "storybook": "10.6.5", "terser": "5.36.0", "ts-toolbelt": "9.6.0", "tsx": "4.20.3", From 65720af695bfc50c301e73c03eeaa396a13ad540 Mon Sep 17 00:00:00 2001 From: Josh Black Date: Mon, 9 Nov 2026 12:24:21 -0600 Subject: [PATCH 3/3] ci: update workflows for copilot setup and review --- .github/workflows/copilot-code-review.yml | 33 +++++++++++++++++++++++ .github/workflows/copilot-setup-steps.yml | 6 ++++- 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/copilot-code-review.yml diff --git a/.github/workflows/copilot-code-review.yml b/.github/workflows/copilot-code-review.yml new file mode 100644 index 00000000000..74943e7fb00 --- /dev/null +++ b/.github/workflows/copilot-code-review.yml @@ -0,0 +1,33 @@ +name: 'Copilot Code Review' +on: + workflow_dispatch: + pull_request: + paths: + - .github/workflows/copilot-code-review.yml + +jobs: + copilot-setup-steps: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Checkout repository + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 + - name: Set up Node.js + uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 + with: + node-version-file: '.nvmrc' + cache: 'npm' + - name: Set up turbo cache + uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 + with: + path: .turbo + key: ${{ runner.os }}-turbo-${{ github.job }}-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-turbo-${{ github.job }}- + - name: Install dependencies + run: npm ci + - name: Build + run: npm run build + - name: Setup Playwright + run: npx playwright install --with-deps diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml index 9facdb70fd2..736957a029e 100644 --- a/.github/workflows/copilot-setup-steps.yml +++ b/.github/workflows/copilot-setup-steps.yml @@ -1,5 +1,9 @@ name: 'Copilot Setup Steps' -on: workflow_dispatch +on: + workflow_dispatch: + pull_request: + paths: + - .github/workflows/copilot-setup-steps.yml jobs: copilot-setup-steps: