From c55b7b55fd378b45f12cea0fcd7b985a1064e3a8 Mon Sep 17 00:00:00 2001 From: Lars Kappert Date: Thu, 12 Sep 2024 20:10:23 +0200 Subject: [PATCH] Add Knip with initial custom config --- code/knip.ts | 93 +++++++++++++++++++++++++++ code/package.json | 1 + code/yarn.lock | 159 +++++++++++++++++++++++++++++++++++++++++++--- package.json | 1 + 4 files changed, 246 insertions(+), 8 deletions(-) create mode 100644 code/knip.ts diff --git a/code/knip.ts b/code/knip.ts new file mode 100644 index 000000000000..ee1a6bb99281 --- /dev/null +++ b/code/knip.ts @@ -0,0 +1,93 @@ +import { join, relative } from 'node:path'; + +import fg from 'fast-glob'; +import type { KnipConfig } from 'knip'; +import { isMatch } from 'picomatch'; + +// Files we want to exclude from analysis should be negated project patterns, not `ignores` +// docs: https://knip.dev/guides/configuring-project-files +const project = [ + 'src/**/*.{js,jsx,ts,tsx}', + '!**/__search-files-tests__/**', + '!**/__testfixtures__/**', + '!**/__mocks-ng-workspace__/**', + '!**/__mockdata__/**', +]; + +// Adding an explicit MDX "compiler", as the dependency knip looks for isn't listed (@mdx-js/mdx or astro) +// Alternatively, we could ignore a few false positives +// docs: https://knip.dev/features/compilers +const importMatcher = /import[^'"]+['"]([^'"]+)['"]/g; +const fencedCodeBlockMatcher = /```[\s\S]*?```/g; +const mdx = (text: string) => + [...text.replace(fencedCodeBlockMatcher, '').matchAll(importMatcher)].join('\n'); + +const baseConfig = { + ignoreWorkspaces: ['renderers/svelte'], // ignored: Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: No "exports" main defined in code/node_modules/@sveltejs/vite-plugin-svelte/package.json + + // storybook itself configured (only) in root + storybook: { entry: ['**/*.@(mdx|stories.@(mdx|js|jsx|mjs|ts|tsx))'] }, + + workspaces: { + '.': { + project, + }, + 'addons/*': { + project, + }, + 'builders/*': { + project, + }, + core: { + entry: ['src/index.ts', 'src/cli/bin/index.ts', 'src/*/{globals*,index,runtime}.ts'], + project, + }, + 'frameworks/*': { + entry: [ + // these extra entries we only need for frameworks/angular and frameworks/ember it seems + 'src/index.ts', + 'src/builders/{build,start}-storybook/index.ts', + 'src/**/docs/{index,config}.{js,ts}', + ], + project, + }, + 'lib/*': { + project, + }, + 'presets/*': { + project, + }, + 'renderers/*': { + project, + }, + }, + compilers: { + mdx, + }, +} satisfies KnipConfig; + +// Adds package.json#bundler.entries etc. to each workspace config `entry: []` +export const addBundlerEntries = async (config: KnipConfig) => { + const baseDir = process.cwd(); + const rootManifest = await import(join(baseDir, 'package.json')); + const workspaceDirs = await fg(rootManifest.workspaces.packages, { onlyDirectories: true }); + const workspaceDirectories = workspaceDirs.map((dir) => relative(baseDir, join(baseDir, dir))); + for (const wsDir of workspaceDirectories) { + for (const configKey of Object.keys(baseConfig.workspaces)) { + if (isMatch(wsDir, configKey)) { + const manifest = await import(join(baseDir, wsDir, 'package.json')); + const configEntries = config.workspaces[configKey].entry ?? []; + const bundler = manifest?.bundler; + for (const value of Object.values(bundler ?? {})) { + if (Array.isArray(value)) { + configEntries.push(...value); + } + } + config.workspaces[configKey].entry = Array.from(new Set(configEntries)); + } + } + } + return config; +}; + +export default addBundlerEntries(baseConfig); diff --git a/code/package.json b/code/package.json index e348ef665900..f713f32e45aa 100644 --- a/code/package.json +++ b/code/package.json @@ -200,6 +200,7 @@ "happy-dom": "^14.12.0", "http-server": "^14.1.1", "husky": "^4.3.7", + "knip": "^5.30.1", "lint-staged": "^13.2.2", "lodash": "^4.17.21", "mock-require": "^3.0.3", diff --git a/code/yarn.lock b/code/yarn.lock index 52f251440bb3..ce807183913c 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -4001,7 +4001,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": +"@nodelib/fs.walk@npm:1.2.8, @nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -5329,6 +5329,19 @@ __metadata: languageName: node linkType: hard +"@snyk/github-codeowners@npm:1.1.0": + version: 1.1.0 + resolution: "@snyk/github-codeowners@npm:1.1.0" + dependencies: + commander: "npm:^4.1.1" + ignore: "npm:^5.1.8" + p-map: "npm:^4.0.0" + bin: + github-codeowners: dist/cli.js + checksum: 10c0/92d860a904a1e67f8563d4ac4d540cc613f71193f7968933b4a4b1526e80a97f536f52d27762c158e3e39d48c2f3db4906ec78846309351c741abb1a28653af9 + languageName: node + linkType: hard + "@storybook/addon-a11y@workspace:*, @storybook/addon-a11y@workspace:addons/a11y": version: 0.0.0-use.local resolution: "@storybook/addon-a11y@workspace:addons/a11y" @@ -6908,6 +6921,7 @@ __metadata: happy-dom: "npm:^14.12.0" http-server: "npm:^14.1.1" husky: "npm:^4.3.7" + knip: "npm:^5.30.1" lint-staged: "npm:^13.2.2" lodash: "npm:^4.17.21" mock-require: "npm:^3.0.3" @@ -12095,6 +12109,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^4.1.1": + version: 4.1.1 + resolution: "commander@npm:4.1.1" + checksum: 10c0/84a76c08fe6cc08c9c93f62ac573d2907d8e79138999312c92d4155bc2325d487d64d13f669b2000c9f8caf70493c1be2dac74fec3c51d5a04f8bc3ae1830bab + languageName: node + linkType: hard + "commander@npm:^5.1.0": version: 5.1.0 resolution: "commander@npm:5.1.0" @@ -13519,6 +13540,19 @@ __metadata: languageName: node linkType: hard +"easy-table@npm:1.2.0": + version: 1.2.0 + resolution: "easy-table@npm:1.2.0" + dependencies: + ansi-regex: "npm:^5.0.1" + wcwidth: "npm:^1.0.1" + dependenciesMeta: + wcwidth: + optional: true + checksum: 10c0/2d37937cd608586ba02e1ec479f90ccec581d366b3b0d1bb26b99ee6005f8d724e32a07a873759893461ca45b99e2d08c30326529d967ce9eedc1e9b68d4aa63 + languageName: node + linkType: hard + "ecdsa-sig-formatter@npm:1.0.11, ecdsa-sig-formatter@npm:^1.0.11": version: 1.0.11 resolution: "ecdsa-sig-formatter@npm:1.0.11" @@ -13826,6 +13860,16 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^5.17.1": + version: 5.17.1 + resolution: "enhanced-resolve@npm:5.17.1" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10c0/81a0515675eca17efdba2cf5bad87abc91a528fc1191aad50e275e74f045b41506167d420099022da7181c8d787170ea41e4a11a0b10b7a16f6237daecb15370 + languageName: node + linkType: hard + "enquirer@npm:^2.3.5": version: 2.4.1 resolution: "enquirer@npm:2.4.1" @@ -17297,6 +17341,13 @@ __metadata: languageName: node linkType: hard +"ignore@npm:^5.1.8": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 + languageName: node + linkType: hard + "image-size@npm:^1.0.0, image-size@npm:^1.1.1": version: 1.1.1 resolution: "image-size@npm:1.1.1" @@ -18365,6 +18416,15 @@ __metadata: languageName: node linkType: hard +"jiti@npm:^1.21.6": + version: 1.21.6 + resolution: "jiti@npm:1.21.6" + bin: + jiti: bin/jiti.js + checksum: 10c0/05b9ed58cd30d0c3ccd3c98209339e74f50abd9a17e716f65db46b6a35812103f6bde6e134be7124d01745586bca8cc5dae1d0d952267c3ebe55171949c32e56 + languageName: node + linkType: hard + "jju@npm:^1.4.0": version: 1.4.0 resolution: "jju@npm:1.4.0" @@ -18847,6 +18907,36 @@ __metadata: languageName: node linkType: hard +"knip@npm:^5.30.1": + version: 5.30.1 + resolution: "knip@npm:5.30.1" + dependencies: + "@nodelib/fs.walk": "npm:1.2.8" + "@snyk/github-codeowners": "npm:1.1.0" + easy-table: "npm:1.2.0" + enhanced-resolve: "npm:^5.17.1" + fast-glob: "npm:^3.3.2" + jiti: "npm:^1.21.6" + js-yaml: "npm:^4.1.0" + minimist: "npm:^1.2.8" + picocolors: "npm:^1.0.0" + picomatch: "npm:^4.0.1" + pretty-ms: "npm:^9.0.0" + smol-toml: "npm:^1.1.4" + strip-json-comments: "npm:5.0.1" + summary: "npm:2.1.0" + zod: "npm:^3.22.4" + zod-validation-error: "npm:^3.0.3" + peerDependencies: + "@types/node": ">=18" + typescript: ">=5.0.4" + bin: + knip: bin/knip.js + knip-bun: bin/knip-bun.js + checksum: 10c0/1c470266d7967dad0f2fb1b1f6c8a797bc7bea6c1f0021c52dce40e067ae87217eb17ff11a4164e3a5244bf3d0672f9e8678e4c3898260c48b9c020132ebb29a + languageName: node + linkType: hard + "language-subtag-registry@npm:^0.3.20": version: 0.3.22 resolution: "language-subtag-registry@npm:0.3.22" @@ -22404,6 +22494,13 @@ __metadata: languageName: node linkType: hard +"parse-ms@npm:^4.0.0": + version: 4.0.0 + resolution: "parse-ms@npm:4.0.0" + checksum: 10c0/a7900f4f1ebac24cbf5e9708c16fb2fd482517fad353aecd7aefb8c2ba2f85ce017913ccb8925d231770404780df46244ea6fec598b3bde6490882358b4d2d16 + languageName: node + linkType: hard + "parse-node-version@npm:^1.0.1": version: 1.0.1 resolution: "parse-node-version@npm:1.0.1" @@ -22693,6 +22790,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^4.0.1": + version: 4.0.2 + resolution: "picomatch@npm:4.0.2" + checksum: 10c0/7c51f3ad2bb42c776f49ebf964c644958158be30d0a510efd5a395e8d49cb5acfed5b82c0c5b365523ce18e6ab85013c9ebe574f60305892ec3fa8eee8304ccc + languageName: node + linkType: hard + "pidtree@npm:0.6.0": version: 0.6.0 resolution: "pidtree@npm:0.6.0" @@ -23227,6 +23331,15 @@ __metadata: languageName: node linkType: hard +"pretty-ms@npm:^9.0.0": + version: 9.1.0 + resolution: "pretty-ms@npm:9.1.0" + dependencies: + parse-ms: "npm:^4.0.0" + checksum: 10c0/fd111aad8800a04dfd654e6016da69bdaa6fc6a4c280f8e727cffd8b5960558e94942f1a94d4aa6e4d179561a0fbb0366a9ebe0ccefbbb0f8ff853b129cdefb9 + languageName: node + linkType: hard + "prettyjson@npm:^1.2.1": version: 1.2.5 resolution: "prettyjson@npm:1.2.5" @@ -25869,6 +25982,13 @@ __metadata: languageName: node linkType: hard +"smol-toml@npm:^1.1.4": + version: 1.3.0 + resolution: "smol-toml@npm:1.3.0" + checksum: 10c0/442b4d033236ff6dd05bf91d57695fd9070a8221af080a5b2782cb2d9fad8bc31f698c61de5308a351907c1200202ba3ee51d52c5704f5349149e7c374f5fe90 + languageName: node + linkType: hard + "snapdragon-node@npm:^2.0.1": version: 2.1.1 resolution: "snapdragon-node@npm:2.1.1" @@ -26546,6 +26666,13 @@ __metadata: languageName: node linkType: hard +"strip-json-comments@npm:5.0.1, strip-json-comments@npm:^5.0.1": + version: 5.0.1 + resolution: "strip-json-comments@npm:5.0.1" + checksum: 10c0/c9d9d55a0167c57aa688df3aa20628cf6f46f0344038f189eaa9d159978e80b2bfa6da541a40d83f7bde8a3554596259bf6b70578b2172356536a0e3fa5a0982 + languageName: node + linkType: hard + "strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" @@ -26553,13 +26680,6 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:^5.0.1": - version: 5.0.1 - resolution: "strip-json-comments@npm:5.0.1" - checksum: 10c0/c9d9d55a0167c57aa688df3aa20628cf6f46f0344038f189eaa9d159978e80b2bfa6da541a40d83f7bde8a3554596259bf6b70578b2172356536a0e3fa5a0982 - languageName: node - linkType: hard - "strong-log-transformer@npm:^2.1.0": version: 2.1.0 resolution: "strong-log-transformer@npm:2.1.0" @@ -26646,6 +26766,13 @@ __metadata: languageName: node linkType: hard +"summary@npm:2.1.0": + version: 2.1.0 + resolution: "summary@npm:2.1.0" + checksum: 10c0/2743c1f940fb303c496ef1b085e654704a6c16872957b6b76648c34bd32c8f0b7a3c5ec4e0f8bfb71dcb8473e34d172fef31026b85562af589cf220aa901698d + languageName: node + linkType: hard + "supports-color@npm:^5.0.0, supports-color@npm:^5.3.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -29733,6 +29860,22 @@ __metadata: languageName: node linkType: hard +"zod-validation-error@npm:^3.0.3": + version: 3.3.1 + resolution: "zod-validation-error@npm:3.3.1" + peerDependencies: + zod: ^3.18.0 + checksum: 10c0/53869a8478f42cd38f51e159431fe7af9e0b456e8078c6d9d906adb212753788defa9c8bd7374e9ecd4a688b6736fcfa091aebac65054328b8cfdecce9395d8e + languageName: node + linkType: hard + +"zod@npm:^3.22.4": + version: 3.23.8 + resolution: "zod@npm:3.23.8" + checksum: 10c0/8f14c87d6b1b53c944c25ce7a28616896319d95bc46a9660fe441adc0ed0a81253b02b5abdaeffedbeb23bdd25a0bf1c29d2c12dd919aef6447652dd295e3e69 + languageName: node + linkType: hard + "zone.js@npm:^0.14.2": version: 0.14.2 resolution: "zone.js@npm:0.14.2" diff --git a/package.json b/package.json index d0eb7795735e..2104e1eb7f49 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "get-template": "cd scripts; yarn get-template", "i": "yarn --cwd scripts && yarn --cwd code", "lint": "cd code; yarn lint", + "knip": "cd code; yarn knip", "nx": "cd code; yarn nx", "pretty-docs": "cd scripts; yarn install >/dev/null; yarn docs:prettier:write", "start": "yarn task --task dev --template react-vite/default-ts --start-from=install",