knip.ts (60 lines of code) (raw):

import { KnipConfig } from "knip"; const CSS_IMPORT_REGEX = /@import\s*(?:url\()?(?:\([^)]*\)\s*)?["']([^"']+)["'](?:\))?/g; function compileLess(text: string): string { return text.replace(CSS_IMPORT_REGEX, (_, path) => { // imports without a file extension should be treated as .less files // source: https://lesscss.org/features/#import-atrules-feature-file-extensions if (path.split('.').length === 1) { return `import "./${path}.less";` } return `import "${path}";` }); } function compileCss(text: string) { return text.replace(CSS_IMPORT_REGEX, (_, path) => { return `import "${path}";` }) } export default { entry: ["static/js/*.js", "static/css/*.{less,css}"], project: ["static/**/*.{js,less,css}!"], vite: true, vitest: true, eslint: true, ignoreDependencies: [ "addons-linter", // Disable rules causing errors "jqmodal", "jquery-pjax", "highcharts", "source-map", ], ignore: [ // Disable rules causing errors "static/css/admin/larger_raw_id.css", "static/css/devhub/search.less", "static/css/impala/footer.less", "static/css/impala/nojs.css", "static/css/moz_header/footer.css", "static/css/shield_study_10/main.css", "static/css/shield_study_11/main.css", "static/css/shield_study_12/main.css", "static/css/shield_study_13/main.css", "static/css/shield_study_15/main.css", "static/css/shield_study_14/main.css", "static/css/shield_study_16/main.css", "static/css/shield_study_3/main.css", "static/css/shield_study_4/main.css", "static/css/shield_study_5/main.css", "static/css/shield_study_6/main.css", "static/css/shield_study_7/main.css", "static/css/shield_study_8/main.css", "static/css/shield_study_9/main.css", "static/css/zamboni/blocklist.css", "static/css/zamboni/nick.css", "static/css/zamboni/themes_review.less", "static/css/zamboni/translations/trans.css", "static/js/lib/highcharts-module.js", "static/js/lib/highcharts.src.js", ], compilers: { // Custom compilers for less/css files less: compileLess, css: compileCss, }, } satisfies KnipConfig;