From f4b3c1963de916169ddb22d55d214189268920af Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Fri, 26 Jun 2026 17:49:56 -0400 Subject: [PATCH 01/11] refactor: remove unused files --- packages/build-info/package.json | 1 + packages/build-info/playwright.config.ts | 2 +- .../{vite.config.ts => vitest.config.ts} | 2 +- packages/edge-bundler/deno/bundle.ts | 14 ----- packages/edge-bundler/deno/config.ts | 55 ------------------- .../zip-it-and-ship-it/src/utils/timer.ts | 15 ----- 6 files changed, 3 insertions(+), 86 deletions(-) rename packages/build-info/{vite.config.ts => vitest.config.ts} (91%) delete mode 100644 packages/edge-bundler/deno/bundle.ts delete mode 100644 packages/edge-bundler/deno/config.ts delete mode 100644 packages/zip-it-and-ship-it/src/utils/timer.ts diff --git a/packages/build-info/package.json b/packages/build-info/package.json index 72a1db1177..67536f2847 100644 --- a/packages/build-info/package.json +++ b/packages/build-info/package.json @@ -27,6 +27,7 @@ ], "scripts": { "build": "tsc --project tsconfig.build.json", + "e2e:serve": "vite e2e/fixture --port 3000", "e2e": "playwright test", "test": "vitest run", "test:dev": "vitest --ui", diff --git a/packages/build-info/playwright.config.ts b/packages/build-info/playwright.config.ts index 153e10efc2..a52d4f92bf 100644 --- a/packages/build-info/playwright.config.ts +++ b/packages/build-info/playwright.config.ts @@ -55,7 +55,7 @@ export default defineConfig({ /* Run your local dev server before starting the tests */ webServer: { - command: 'npx vite e2e/fixture --port 3000', + command: 'npm run e2e:serve', port: 3000, }, }) diff --git a/packages/build-info/vite.config.ts b/packages/build-info/vitest.config.ts similarity index 91% rename from packages/build-info/vite.config.ts rename to packages/build-info/vitest.config.ts index aa694bdfba..6a08a58d14 100644 --- a/packages/build-info/vite.config.ts +++ b/packages/build-info/vitest.config.ts @@ -12,7 +12,7 @@ export default defineConfig({ // onConsoleLog: (log, type) => { // process[type].write(log) // }, - setupFiles: ['tests/test-setup.ts'], + setupFiles: ['./tests/test-setup.ts'], deps: { // this is to work inside memfs as well inline: ['find-up', 'locate-path'], diff --git a/packages/edge-bundler/deno/bundle.ts b/packages/edge-bundler/deno/bundle.ts deleted file mode 100644 index 64e3f49f7d..0000000000 --- a/packages/edge-bundler/deno/bundle.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { writeStage2 } from './lib/stage2.ts' - -const [payload] = Deno.args -const { basePath, destPath, externals, functions, importMapData, vendorDirectory } = JSON.parse(payload) - -try { - await writeStage2({ basePath, destPath, externals, functions, importMapData, vendorDirectory }) -} catch (error) { - if (error instanceof Error && error.message.includes("The module's source code could not be parsed")) { - delete error.stack - } - - throw error -} diff --git a/packages/edge-bundler/deno/config.ts b/packages/edge-bundler/deno/config.ts deleted file mode 100644 index 0fb247b981..0000000000 --- a/packages/edge-bundler/deno/config.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { type NetlifyGlobal } from 'https://edge.netlify.com/bootstrap/globals/types.ts' - -const [functionURL, collectorURL, rawExitCodes] = Deno.args -const exitCodes = JSON.parse(rawExitCodes) - -const env = { - delete: Deno.env.delete, - get: Deno.env.get, - has: Deno.env.has, - set: Deno.env.set, - toObject: Deno.env.toObject, -}; - -const Netlify: NetlifyGlobal = { - get context() { - return null; - }, - env, -}; - -globalThis.Netlify = Netlify - -let func - -try { - func = await import(functionURL) -} catch (error) { - console.error(error) - - Deno.exit(exitCodes.ImportError) -} - -if (typeof func.default !== 'function') { - Deno.exit(exitCodes.InvalidDefaultExport) -} - -if (func.config === undefined) { - Deno.exit(exitCodes.NoConfig) -} - -if (typeof func.config !== 'object') { - Deno.exit(exitCodes.InvalidExport) -} - -try { - const result = JSON.stringify(func.config) - - await Deno.writeTextFile(new URL(collectorURL), result) -} catch (error) { - console.error(error) - - Deno.exit(exitCodes.SerializationError) -} - -Deno.exit(exitCodes.Success) diff --git a/packages/zip-it-and-ship-it/src/utils/timer.ts b/packages/zip-it-and-ship-it/src/utils/timer.ts deleted file mode 100644 index 3162a1c608..0000000000 --- a/packages/zip-it-and-ship-it/src/utils/timer.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { hrtime } from 'process' - -const NANOSECS_TO_SECS = 1e9 - -export const startTimer = function () { - return hrtime() -} - -// returns the time in nanoseconds -export const endTimer = function ([startSecs, startNsecs]: [number, number]) { - const [endSecs, endNsecs] = hrtime() - const durationNs = (endSecs - startSecs) * NANOSECS_TO_SECS + endNsecs - startNsecs - - return durationNs -} From 998214b2db3ddbaa67366a1abc4df550d3d3c674 Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Fri, 26 Jun 2026 18:17:38 -0400 Subject: [PATCH 02/11] chore: remove unused dev deps and related files --- commitlint.config.js | 1 - package-lock.json | 431 ----------------------- package.json | 3 - packages/js-client/package.json | 5 +- packages/js-client/tsconfig.json | 5 +- packages/zip-it-and-ship-it/package.json | 1 - 6 files changed, 3 insertions(+), 443 deletions(-) delete mode 100644 commitlint.config.js diff --git a/commitlint.config.js b/commitlint.config.js deleted file mode 100644 index 7c4ff4d984..0000000000 --- a/commitlint.config.js +++ /dev/null @@ -1 +0,0 @@ -export default { extends: ['@commitlint/config-conventional'] } diff --git a/package-lock.json b/package-lock.json index 6873918b1b..ab6114e5e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,11 +12,8 @@ "packages/*" ], "devDependencies": { - "@commitlint/cli": "^19.0.0", - "@commitlint/config-conventional": "^19.0.0", "@eslint/compat": "^1.2.9", "@eslint/js": "^9.28.0", - "@typescript-eslint/eslint-plugin": "~8.49.0", "@vitest/eslint-plugin": "~1.4.3", "eslint": "^9.28.0", "eslint-plugin-ava": "^15.0.1", @@ -160,229 +157,6 @@ "node": ">=0.1.90" } }, - "node_modules/@commitlint/cli": { - "version": "19.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/format": "^19.8.1", - "@commitlint/lint": "^19.8.1", - "@commitlint/load": "^19.8.1", - "@commitlint/read": "^19.8.1", - "@commitlint/types": "^19.8.1", - "tinyexec": "^1.0.0", - "yargs": "^17.0.0" - }, - "bin": { - "commitlint": "cli.js" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/config-conventional": { - "version": "19.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/types": "^19.8.1", - "conventional-changelog-conventionalcommits": "^7.0.2" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/config-validator": { - "version": "19.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/types": "^19.8.1", - "ajv": "^8.11.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/ensure": { - "version": "19.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/types": "^19.8.1", - "lodash.camelcase": "^4.3.0", - "lodash.kebabcase": "^4.1.1", - "lodash.snakecase": "^4.1.1", - "lodash.startcase": "^4.4.0", - "lodash.upperfirst": "^4.3.1" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/execute-rule": { - "version": "19.8.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/format": { - "version": "19.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/types": "^19.8.1", - "chalk": "^5.3.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/is-ignored": { - "version": "19.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/types": "^19.8.1", - "semver": "^7.6.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/lint": { - "version": "19.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/is-ignored": "^19.8.1", - "@commitlint/parse": "^19.8.1", - "@commitlint/rules": "^19.8.1", - "@commitlint/types": "^19.8.1" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/load": { - "version": "19.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/config-validator": "^19.8.1", - "@commitlint/execute-rule": "^19.8.1", - "@commitlint/resolve-extends": "^19.8.1", - "@commitlint/types": "^19.8.1", - "chalk": "^5.3.0", - "cosmiconfig": "^9.0.0", - "cosmiconfig-typescript-loader": "^6.1.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "lodash.uniq": "^4.5.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/message": { - "version": "19.8.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/parse": { - "version": "19.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/types": "^19.8.1", - "conventional-changelog-angular": "^7.0.0", - "conventional-commits-parser": "^5.0.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/read": { - "version": "19.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/top-level": "^19.8.1", - "@commitlint/types": "^19.8.1", - "git-raw-commits": "^4.0.0", - "minimist": "^1.2.8", - "tinyexec": "^1.0.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/resolve-extends": { - "version": "19.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/config-validator": "^19.8.1", - "@commitlint/types": "^19.8.1", - "global-directory": "^4.0.1", - "import-meta-resolve": "^4.0.0", - "lodash.mergewith": "^4.6.2", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/rules": { - "version": "19.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/ensure": "^19.8.1", - "@commitlint/message": "^19.8.1", - "@commitlint/to-lines": "^19.8.1", - "@commitlint/types": "^19.8.1" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/to-lines": { - "version": "19.8.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/top-level": { - "version": "19.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^7.0.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/types": { - "version": "19.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/conventional-commits-parser": "^5.0.0", - "chalk": "^5.3.0" - }, - "engines": { - "node": ">=v18" - } - }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "license": "MIT", @@ -5603,16 +5377,6 @@ "assertion-error": "^2.0.1" } }, - "node_modules/@types/conventional-commits-parser": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.2.tgz", - "integrity": "sha512-BgT2szDXnVypgpNxOK8aL5SGjUdaQbC++WZNjF1Qge3Og2+zhHj+RWhmehLhYyvQwqAmvezruVfOf8+3m74W+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/deep-eql": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", @@ -5644,16 +5408,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/is-ci": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/is-ci/-/is-ci-3.0.4.tgz", - "integrity": "sha512-AkCYCmwlXeuH89DagDCzvCAyltI2v9lh3U3DqSg/GrBYoReAaWwxfXCqMx9UV5MajLZ4ZFwZzV4cABGIxk2XRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "ci-info": "^3.1.0" - } - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -9039,17 +8793,6 @@ "node": ">=16" } }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "7.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/conventional-changelog-core": { "version": "5.0.1", "dev": true, @@ -9759,23 +9502,6 @@ "node": ">=14" } }, - "node_modules/conventional-commits-parser": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-text-path": "^2.0.0", - "JSONStream": "^1.3.5", - "meow": "^12.0.1", - "split2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.mjs" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/conventional-recommended-bump": { "version": "7.0.1", "dev": true, @@ -10158,22 +9884,6 @@ } } }, - "node_modules/cosmiconfig-typescript-loader": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "jiti": "2.6.1" - }, - "engines": { - "node": ">=v18" - }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=9", - "typescript": ">=5" - } - }, "node_modules/cosmiconfig/node_modules/env-paths": { "version": "2.2.1", "dev": true, @@ -10461,17 +10171,6 @@ "node": ">=0.10.0" } }, - "node_modules/dargs": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", "license": "MIT", @@ -13214,22 +12913,6 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/git-raw-commits": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "dargs": "^8.0.0", - "meow": "^12.0.1", - "split2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.mjs" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/git-remote-origin-url": { "version": "2.0.0", "dev": true, @@ -13592,20 +13275,6 @@ "node": ">=16.17.0" } }, - "node_modules/global-directory": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "4.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globals": { "version": "14.0.0", "dev": true, @@ -14121,15 +13790,6 @@ "node": ">=8" } }, - "node_modules/import-meta-resolve": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/import-modules": { "version": "2.1.0", "dev": true, @@ -14173,14 +13833,6 @@ "version": "2.0.4", "license": "ISC" }, - "node_modules/ini": { - "version": "4.1.1", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/init-package-json": { "version": "8.2.2", "dev": true, @@ -14710,17 +14362,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-text-path": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "text-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-typed-array": { "version": "1.1.15", "license": "MIT", @@ -14971,14 +14612,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jiti": { - "version": "2.6.1", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, "node_modules/jpeg-js": { "version": "0.4.4", "license": "BSD-3-Clause" @@ -15899,45 +15532,10 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.kebabcase": { - "version": "4.1.1", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.merge": { "version": "4.6.2", "license": "MIT" }, - "node_modules/lodash.mergewith": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.snakecase": { - "version": "4.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.startcase": { - "version": "4.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.upperfirst": { - "version": "4.3.1", - "dev": true, - "license": "MIT" - }, "node_modules/log-process-errors": { "version": "11.0.1", "license": "Apache-2.0", @@ -20173,14 +19771,6 @@ "node": "*" } }, - "node_modules/split2": { - "version": "4.2.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 10.x" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "dev": true, @@ -20673,17 +20263,6 @@ "b4a": "^1.6.4" } }, - "node_modules/text-extensions": { - "version": "2.4.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/text-hex": { "version": "1.0.0", "dev": true, @@ -20763,14 +20342,6 @@ "dev": true, "license": "MIT" }, - "node_modules/tinyexec": { - "version": "1.2.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/tinyglobby": { "version": "0.2.17", "license": "MIT", @@ -23358,7 +22929,6 @@ "@types/node": "^22.12.0", "from2-string": "^1.1.0", "nock": "^13.0.0", - "ts-node": "^10.9.1", "typescript": "^5.0.0", "vitest": "^3.2.3" }, @@ -23552,7 +23122,6 @@ "@netlify/types": "2.7.0", "@opentelemetry/sdk-trace-base": "~1.24.0", "@types/archiver": "6.0.4", - "@types/is-ci": "3.0.4", "@types/node": "^22.12.0", "@types/normalize-path": "3.0.2", "@types/resolve": "1.20.6", diff --git a/package.json b/package.json index 46a55275f6..717e77d6df 100644 --- a/package.json +++ b/package.json @@ -46,11 +46,8 @@ }, "license": "MIT", "devDependencies": { - "@commitlint/cli": "^19.0.0", - "@commitlint/config-conventional": "^19.0.0", "@eslint/compat": "^1.2.9", "@eslint/js": "^9.28.0", - "@typescript-eslint/eslint-plugin": "~8.49.0", "@vitest/eslint-plugin": "~1.4.3", "eslint": "^9.28.0", "eslint-plugin-ava": "^15.0.1", diff --git a/packages/js-client/package.json b/packages/js-client/package.json index 8588dea837..53ee424857 100644 --- a/packages/js-client/package.json +++ b/packages/js-client/package.json @@ -43,14 +43,13 @@ "dependencies": { "@netlify/open-api": "^2.52.0", "node-fetch": "^3.0.0", - "picoquery": "^2.5.0", - "p-wait-for": "^5.0.0" + "p-wait-for": "^5.0.0", + "picoquery": "^2.5.0" }, "devDependencies": { "@types/node": "^22.12.0", "from2-string": "^1.1.0", "nock": "^13.0.0", - "ts-node": "^10.9.1", "typescript": "^5.0.0", "vitest": "^3.2.3" }, diff --git a/packages/js-client/tsconfig.json b/packages/js-client/tsconfig.json index f2d102c596..f976a99574 100644 --- a/packages/js-client/tsconfig.json +++ b/packages/js-client/tsconfig.json @@ -4,8 +4,5 @@ "outDir": "lib" /* Specify an output folder for all emitted files. */ }, "include": ["src/**/*.js", "src/**/*.ts"], - "exclude": ["src/**/*.test.js", "src/**/*.test.ts"], - "ts-node": { - "transpileOnly": true - } + "exclude": ["src/**/*.test.js", "src/**/*.test.ts"] } diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index 51970c0e64..06bfe2708a 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -79,7 +79,6 @@ "@netlify/types": "2.7.0", "@opentelemetry/sdk-trace-base": "~1.24.0", "@types/archiver": "6.0.4", - "@types/is-ci": "3.0.4", "@types/node": "^22.12.0", "@types/normalize-path": "3.0.2", "@types/resolve": "1.20.6", From 767715c0fbcc3dbb9c6928b04218de4d2d55d899 Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Fri, 26 Jun 2026 18:40:42 -0400 Subject: [PATCH 03/11] chore: fix some dev dep issues - c8 wasn't used in that package - typescript was assumed to be hoisted in the root but was declared instead as a dev dep in many (but not all) individual packages - ts-node was missing from one package, just happened to work due to hoisting --- package-lock.json | 26 ++++++------------- package.json | 1 + packages/build-info/package.json | 2 +- packages/cache-utils/package.json | 1 - packages/config/package.json | 3 +-- packages/edge-bundler/package.json | 1 - packages/functions-utils/package.json | 1 - packages/git-utils/package.json | 1 - packages/headers-parser/package.json | 1 - packages/js-client/package.json | 1 - packages/nock-udp/package.json | 1 - packages/opentelemetry-sdk-setup/package.json | 1 - packages/opentelemetry-utils/package.json | 1 - packages/redirect-parser/package.json | 1 - packages/run-utils/package.json | 1 - packages/testing/package.json | 4 +-- packages/zip-it-and-ship-it/package.json | 1 - 17 files changed, 12 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index ab6114e5e0..f19a0051b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "execa": "^8.0.1", "lerna": "^9.0.7", "oxfmt": "^0.46.0", + "typescript": "^5.9.3", "typescript-eslint": "~8.49.0", "vite": "^7.1.0" }, @@ -20517,6 +20518,8 @@ }, "node_modules/ts-node": { "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -20967,6 +20970,8 @@ }, "node_modules/typescript": { "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -22726,7 +22731,7 @@ "@vitest/ui": "^3.0.0", "execa": "^8.0.0", "memfs": "^4.0.0", - "typescript": "^5.0.0", + "ts-node": "^10.9.2", "unionfs": "^4.4.0", "vitest": "^3.0.0" }, @@ -22750,7 +22755,6 @@ "devDependencies": { "@types/node": "^22.12.0", "tmp-promise": "^3.0.0", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "engines": { @@ -22797,8 +22801,7 @@ "c8": "^10.0.0", "has-ansi": "^6.0.0", "is-ci": "^4.0.0", - "tmp-promise": "^3.0.2", - "typescript": "^5.0.0" + "tmp-promise": "^3.0.2" }, "engines": { "node": ">=22.12.0" @@ -22848,7 +22851,6 @@ "cpy": "^11.1.0", "nock": "^14.0.0", "npm-run-all2": "^6.0.0", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "engines": { @@ -22868,7 +22870,6 @@ "@types/node": "^22.12.0", "sort-on": "^6.0.0", "tmp-promise": "^3.0.0", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "engines": { @@ -22887,7 +22888,6 @@ }, "devDependencies": { "@types/node": "^22.12.0", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "engines": { @@ -22908,7 +22908,6 @@ }, "devDependencies": { "@types/node": "^22.12.0", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "engines": { @@ -22929,7 +22928,6 @@ "@types/node": "^22.12.0", "from2-string": "^1.1.0", "nock": "^13.0.0", - "typescript": "^5.0.0", "vitest": "^3.2.3" }, "engines": { @@ -22955,7 +22953,6 @@ "license": "MIT", "devDependencies": { "@types/node": "^22.12.0", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "engines": { @@ -22983,7 +22980,6 @@ "@opentelemetry/sdk-trace-base": "~1.24.0", "@types/node": "^22.12.0", "@vitest/ui": "^3.0.0", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "engines": { @@ -23003,7 +22999,6 @@ "@opentelemetry/sdk-trace-node": "~1.24.0", "@types/node": "^22.12.0", "@vitest/ui": "^3.0.0", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "engines": { @@ -23025,7 +23020,6 @@ }, "devDependencies": { "@types/node": "^22.12.0", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "engines": { @@ -23042,7 +23036,6 @@ "devDependencies": { "@types/node": "^22.12.0", "semver": "^7.3.8", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "engines": { @@ -23057,7 +23050,6 @@ "@types/lodash-es": "^4.17.6", "@types/node": "^22.12.0", "ava": "^5.0.0", - "c8": "^10.0.0", "cpy": "^11.0.0", "execa": "^8.0.0", "fast-safe-stringify": "^2.0.7", @@ -23069,8 +23061,7 @@ "lodash-es": "^4.17.21", "path-key": "^4.0.0", "strip-ansi": "^7.0.0", - "tmp-promise": "^3.0.2", - "typescript": "^5.0.0" + "tmp-promise": "^3.0.2" }, "engines": { "node": ">=22.12.0" @@ -23138,7 +23129,6 @@ "is-ci": "4.1.0", "lambda-local": "2.2.0", "source-map-support": "0.5.21", - "typescript": "5.9.3", "vitest": "^3.0.0" }, "engines": { diff --git a/package.json b/package.json index 717e77d6df..871ec99920 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "execa": "^8.0.1", "lerna": "^9.0.7", "oxfmt": "^0.46.0", + "typescript": "^5.9.3", "typescript-eslint": "~8.49.0", "vite": "^7.1.0" }, diff --git a/packages/build-info/package.json b/packages/build-info/package.json index 67536f2847..8a29abf7a2 100644 --- a/packages/build-info/package.json +++ b/packages/build-info/package.json @@ -62,7 +62,7 @@ "@vitest/ui": "^3.0.0", "execa": "^8.0.0", "memfs": "^4.0.0", - "typescript": "^5.0.0", + "ts-node": "^10.9.2", "unionfs": "^4.4.0", "vitest": "^3.0.0" }, diff --git a/packages/cache-utils/package.json b/packages/cache-utils/package.json index 068003ff2b..6712ed6214 100644 --- a/packages/cache-utils/package.json +++ b/packages/cache-utils/package.json @@ -61,7 +61,6 @@ "devDependencies": { "@types/node": "^22.12.0", "tmp-promise": "^3.0.0", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "engines": { diff --git a/packages/config/package.json b/packages/config/package.json index 68ccb5874b..f7d1a87573 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -90,8 +90,7 @@ "c8": "^10.0.0", "has-ansi": "^6.0.0", "is-ci": "^4.0.0", - "tmp-promise": "^3.0.2", - "typescript": "^5.0.0" + "tmp-promise": "^3.0.2" }, "engines": { "node": ">=22.12.0" diff --git a/packages/edge-bundler/package.json b/packages/edge-bundler/package.json index 0ce7a7ddb8..0bd5bb86c6 100644 --- a/packages/edge-bundler/package.json +++ b/packages/edge-bundler/package.json @@ -51,7 +51,6 @@ "cpy": "^11.1.0", "nock": "^14.0.0", "npm-run-all2": "^6.0.0", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "engines": { diff --git a/packages/functions-utils/package.json b/packages/functions-utils/package.json index d03d6f38dd..b4be49452f 100644 --- a/packages/functions-utils/package.json +++ b/packages/functions-utils/package.json @@ -58,7 +58,6 @@ "@types/node": "^22.12.0", "sort-on": "^6.0.0", "tmp-promise": "^3.0.0", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "engines": { diff --git a/packages/git-utils/package.json b/packages/git-utils/package.json index 70658a74d0..ddb12a5eb4 100644 --- a/packages/git-utils/package.json +++ b/packages/git-utils/package.json @@ -57,7 +57,6 @@ }, "devDependencies": { "@types/node": "^22.12.0", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "engines": { diff --git a/packages/headers-parser/package.json b/packages/headers-parser/package.json index e391a49a3d..d42242322d 100644 --- a/packages/headers-parser/package.json +++ b/packages/headers-parser/package.json @@ -35,7 +35,6 @@ }, "devDependencies": { "@types/node": "^22.12.0", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "repository": { diff --git a/packages/js-client/package.json b/packages/js-client/package.json index 53ee424857..1c2c2f4cde 100644 --- a/packages/js-client/package.json +++ b/packages/js-client/package.json @@ -50,7 +50,6 @@ "@types/node": "^22.12.0", "from2-string": "^1.1.0", "nock": "^13.0.0", - "typescript": "^5.0.0", "vitest": "^3.2.3" }, "engines": { diff --git a/packages/nock-udp/package.json b/packages/nock-udp/package.json index d55ed0e259..96d8d4009e 100644 --- a/packages/nock-udp/package.json +++ b/packages/nock-udp/package.json @@ -29,7 +29,6 @@ "author": "Netlify Inc.", "devDependencies": { "@types/node": "^22.12.0", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "engines": { diff --git a/packages/opentelemetry-sdk-setup/package.json b/packages/opentelemetry-sdk-setup/package.json index 48f2a3bb47..11d4d8b957 100644 --- a/packages/opentelemetry-sdk-setup/package.json +++ b/packages/opentelemetry-sdk-setup/package.json @@ -45,7 +45,6 @@ "@opentelemetry/sdk-trace-base": "~1.24.0", "@types/node": "^22.12.0", "@vitest/ui": "^3.0.0", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "engines": { diff --git a/packages/opentelemetry-utils/package.json b/packages/opentelemetry-utils/package.json index 235249c63a..47dbc0246e 100644 --- a/packages/opentelemetry-utils/package.json +++ b/packages/opentelemetry-utils/package.json @@ -35,7 +35,6 @@ "@opentelemetry/sdk-trace-node": "~1.24.0", "@types/node": "^22.12.0", "@vitest/ui": "^3.0.0", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "engines": { diff --git a/packages/redirect-parser/package.json b/packages/redirect-parser/package.json index 3149276b58..2a6d0476e5 100644 --- a/packages/redirect-parser/package.json +++ b/packages/redirect-parser/package.json @@ -33,7 +33,6 @@ }, "devDependencies": { "@types/node": "^22.12.0", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "repository": { diff --git a/packages/run-utils/package.json b/packages/run-utils/package.json index fd6fe45de4..f9060147f6 100644 --- a/packages/run-utils/package.json +++ b/packages/run-utils/package.json @@ -55,7 +55,6 @@ "devDependencies": { "@types/node": "^22.12.0", "semver": "^7.3.8", - "typescript": "^5.0.0", "vitest": "^3.0.0" }, "engines": { diff --git a/packages/testing/package.json b/packages/testing/package.json index 1a68cab963..09fbe7c722 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -21,7 +21,6 @@ "@types/lodash-es": "^4.17.6", "@types/node": "^22.12.0", "ava": "^5.0.0", - "c8": "^10.0.0", "cpy": "^11.0.0", "execa": "^8.0.0", "fast-safe-stringify": "^2.0.7", @@ -33,7 +32,6 @@ "lodash-es": "^4.17.21", "path-key": "^4.0.0", "strip-ansi": "^7.0.0", - "tmp-promise": "^3.0.2", - "typescript": "^5.0.0" + "tmp-promise": "^3.0.2" } } diff --git a/packages/zip-it-and-ship-it/package.json b/packages/zip-it-and-ship-it/package.json index 06bfe2708a..016dbfcd34 100644 --- a/packages/zip-it-and-ship-it/package.json +++ b/packages/zip-it-and-ship-it/package.json @@ -95,7 +95,6 @@ "is-ci": "4.1.0", "lambda-local": "2.2.0", "source-map-support": "0.5.21", - "typescript": "5.9.3", "vitest": "^3.0.0" }, "engines": { From 3d4e255f8f21a135bbf9966c569981971feb6aa2 Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Fri, 26 Jun 2026 18:43:08 -0400 Subject: [PATCH 04/11] build: configure knip --- .agents/skills/knip/SKILL.md | 162 ++++++ .claude/skills/knip | 1 + .github/workflows/knip.yml | 27 + knip.jsonc | 56 ++ package-lock.json | 977 +++++++++++++++++++++++++++++++++++ package.json | 2 + skills-lock.json | 11 + 7 files changed, 1236 insertions(+) create mode 100644 .agents/skills/knip/SKILL.md create mode 120000 .claude/skills/knip create mode 100644 .github/workflows/knip.yml create mode 100644 knip.jsonc create mode 100644 skills-lock.json diff --git a/.agents/skills/knip/SKILL.md b/.agents/skills/knip/SKILL.md new file mode 100644 index 0000000000..7efa6970fb --- /dev/null +++ b/.agents/skills/knip/SKILL.md @@ -0,0 +1,162 @@ +--- +name: knip +description: + Run knip to find and remove unused files, dependencies, and exports. Use for cleaning up dead code and unused + dependencies. +--- + +# Knip Code Cleanup + +Run knip to find and remove unused files, dependencies, and exports from this codebase. + +## Setup + +1. Check if knip is available: + - Run `npx knip --version` to test + - If it fails or is very slow, check if `knip` is in package.json devDependencies + - If not installed locally, install with `npm install -D knip` (or pnpm/yarn/bun equivalent based on lockfile + present) + +2. Knip does NOT remove unused imports/variables inside files — that's a linter's job. Knip finds unused files, + dependencies, and exports across the project. + +## Workflow + +Always follow this configuration-first workflow. Even for simple "run knip" or "clean up codebase" prompts, configure +knip properly before acting on reported issues. + +### Step 1: Understand the project + +- Check what frameworks and tools the project uses (look at package.json) +- Check if a knip config exists (`knip.json`, `knip.jsonc`, or `knip` key in package.json) +- If a config exists, review it for improvements (see Configuration Best Practices below) + +### Step 2: Run knip and read configuration hints first + +```bash +npx knip +``` + +Focus on **configuration hints** before anything else. These appear at the top of the output and suggest config +adjustments to reduce false positives. + +### Step 3: Address hints by adjusting knip.json + +Fix configuration hints before addressing reported issues. Common adjustments: + +- Enable/disable plugins for detected frameworks +- Add entry patterns for non-standard entry points +- Configure workspace settings for monorepos + +### Step 4: Repeat steps 2-3 + +Re-run knip after each config change. Repeat until configuration hints are resolved and false positives are minimized. + +### Step 5: Address actual issues + +Once the configuration is settled, work through reported issues. Prioritize in this order: + +1. **Unused files** — address these first ("inbox zero" approach removes the most noise) +2. **Unused dependencies** — remove from package.json +3. **Unused devDependencies** — remove from package.json +4. **Unused exports** — remove or mark as internal +5. **Unused types** — remove, or configure `ignoreExportsUsedInFile` (see below) + +### Step 6: Re-run and repeat + +Re-run knip after each batch of fixes. Removing unused files often exposes newly-unused exports and dependencies. + +## Configuration Best Practices + +When reviewing or creating a knip config, follow these rules: + +- **Never use `ignore` patterns** — `ignore` hides real issues and should almost never be used. Always prefer specific + solutions. Other `ignore*` options (like `ignoreDependencies`, `ignoreExportsUsedInFile`) are fine because they target + specific issue types. +- **Many unused exported types?** Add `ignoreExportsUsedInFile: { interface: true, type: true }` — this handles the + common case of types only used in the same file. Prefer this over broader ignore options. +- **Remove redundant patterns** — Knip already respects `.gitignore`, so ignoring `node_modules`, `dist`, `build`, + `.git` is redundant. +- **Remove entry patterns covered by defaults** — Auto-detected plugins already add standard entry points. Don't + duplicate them. +- **Config files showing as unused** (e.g. `vite.config.ts`) — Enable or disable the corresponding plugin explicitly + rather than ignoring the file. +- **Dependencies matching Node.js builtins** (e.g. `buffer`, `process`) — Add to `ignoreDependencies`. +- **Unresolved imports from path aliases** — Add `paths` to knip config (uses tsconfig.json semantics). + +## Production Mode + +Use `--production` to focus on production code only: + +```bash +npx knip --production +``` + +This excludes test files, config files, and other non-production entry points. Do NOT use `project` or `ignore` patterns +to exclude test files — use `--production` instead. + +## Cleanup Confidence Levels + +### Auto-delete (high confidence): + +- Unused exports that are clearly internal (not part of public API) +- Unused type exports +- Unused dependencies (remove from package.json) +- Unused files that are clearly orphaned (not entry points, not config files) + +### Ask first (needs clarification): + +- Files that might be entry points or dynamically imported +- Exports that might be part of a public API (index.ts, lib exports) +- Dependencies that might be used via CLI or peer dependencies +- Anything in paths like `src/index`, `lib/`, or files with "public" or "api" in the name + +Use the AskUserQuestion tool to clarify before deleting these. + +## Auto-fix + +Once configuration is settled and you're confident in the results: + +```bash +# Auto-fix safe changes (removes unused exports and dependencies) +npx knip --fix + +# Auto-fix including file deletion +npx knip --fix --allow-remove-files +``` + +Only use `--fix` after the configuration-first workflow is complete. + +## Error Handling + +If knip exits with code 2 (unexpected error like "error loading file"): + +- Check if a config file exists — if not, create `knip.json` in the project root +- Check for known issues at knip.dev +- Review the configuration reference for syntax/option errors +- Run knip again after fixes + +## Common Commands + +```bash +# Basic run +npx knip + +# Production only (excludes test/config entry points) +npx knip --production + +# Auto-fix what's safe +npx knip --fix + +# Auto-fix including file deletion +npx knip --fix --allow-remove-files + +# JSON output for parsing +npx knip --reporter json +``` + +## Notes + +- Watch for monorepo setups — may need `--workspace` flag +- Some frameworks need plugins enabled in config +- Knip does not handle unused imports/variables inside files — use ESLint or Biome for that diff --git a/.claude/skills/knip b/.claude/skills/knip new file mode 120000 index 0000000000..38102d930c --- /dev/null +++ b/.claude/skills/knip @@ -0,0 +1 @@ +../../.agents/skills/knip \ No newline at end of file diff --git a/.github/workflows/knip.yml b/.github/workflows/knip.yml new file mode 100644 index 0000000000..b5d9592f4d --- /dev/null +++ b/.github/workflows/knip.yml @@ -0,0 +1,27 @@ +name: 🧹 Knip + +on: + pull_request: + types: [opened, synchronize, reopened] +permissions: {} + +jobs: + knip: + runs-on: ubuntu-24.04-arm + permissions: + contents: read + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + fetch-depth: 0 + - name: Setup Node.js + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version: '24' + cache: 'npm' + - name: Install dependencies + run: npm ci + - name: Build packages + run: npm run build + - name: Find unused code + run: npm run knip diff --git a/knip.jsonc b/knip.jsonc new file mode 100644 index 0000000000..8c582e3302 --- /dev/null +++ b/knip.jsonc @@ -0,0 +1,56 @@ +{ + "$schema": "https://unpkg.com/knip@6/schema.json", + "ignore": ["**/fixtures/**"], + "workspaces": { + ".": {}, + "packages/*": {}, + "packages/build": { + "entry": ["test-d/**/*.ts"], + "ignoreDependencies": [ + // CLI binary spawned as a subprocess (not imported), so knip can't trace it. + "atob", + // Imported only from a test fixture, which the global `**/fixtures/**` ignore hides. + "process-exists", + // CLI binary spawned as a subprocess (not imported), so knip can't trace it. + "yarn", + // Used in tests but can't be declared as a dependency due to a circular dependency. + "@netlify/testing", + ], + }, + "packages/config": { + "ignoreDependencies": [ + // Used in tests but can't be declared as a dependency due to a circular dependency. + "@netlify/testing", + ], + }, + "packages/build-info": { + "entry": [ + "e2e/**/*.e2e.ts", + // knip doesn't pick up the playwright -> npm -> vite ->