Github 网页图标主题

美化 Github 网页仓库图标

目前為 2023-07-21 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Github 网页图标主题
// @name:en      Github web icon theme
// @namespace    https://github.com/fwqaaq/scripts
// @version      0.4
// @description  美化 Github 网页仓库图标
// @description:en Beautify Github repo icons
// @author       fwqaaq
// @match        https://github.com/*
// @icon         https://github.githubassets.com/favicons/favicon-dark.png
// @license      MIT
// ==/UserScript==

/**
 * Defines file icons
 */
const IconPack = {
    Angular: 'angular',
    Nest: 'nest',
    Ngrx: 'angular_ngrx',
    React: 'react',
    Redux: 'react_redux',
    Qwik: 'qwik',
    Vue: 'vue',
    Vuex: 'vue_vuex',
}

const fileIcons = {
    defaultIcon: { name: 'file' },
    icons: [
        { name: 'html', fileExtensions: ['htm', 'xhtml', 'html_vm', 'asp'] },
        {
            name: 'pug',
            fileExtensions: ['jade', 'pug'],
            fileNames: ['.pug-lintrc', '.pug-lintrc.js', '.pug-lintrc.json'],
        },
        {
            name: 'markdown',
            fileExtensions: ['md', 'markdown', 'rst'],
        },
        { name: 'blink', fileExtensions: ['blink'], light: true },
        { name: 'css', fileExtensions: ['css'] },
        { name: 'sass', fileExtensions: ['scss', 'sass'] },
        { name: 'less', fileExtensions: ['less'] },
        {
            name: 'json',
            fileExtensions: [
                'json',
                'jsonc',
                'tsbuildinfo',
                'json5',
                'jsonl',
                'ndjson',
            ],
            fileNames: [
                '.jscsrc',
                '.jshintrc',
                'composer.lock',
                '.jsbeautifyrc',
                '.esformatter',
                'cdp.pid',
                '.lintstagedrc',
            ],
        },
        {
            name: 'jinja',
            fileExtensions: ['jinja', 'jinja2', 'j2', 'jinja-html'],
            light: true,
        },
        { name: 'proto', fileExtensions: ['proto'] },
        {
            name: 'playwright',
            fileNames: [
                'playwright.config.js',
                'playwright.config.mjs',
                'playwright.config.ts',
                'playwright.config.base.js',
                'playwright.config.base.mjs',
                'playwright.config.base.ts',
                'playwright-ct.config.js',
                'playwright-ct.config.mjs',
                'playwright-ct.config.ts',
            ],
        },
        {
            name: 'sublime',
            fileExtensions: ['sublime-project', 'sublime-workspace'],
        },
        { name: 'twine', fileExtensions: ['tw', 'twee'] },
        {
            name: 'yaml',
            fileExtensions: [
                'yml',
                'yaml',
                'yml.dist',
                'yaml.dist',
                'YAML-tmLanguage',
            ],
        },
        {
            name: 'xml',
            fileExtensions: [
                'xml',
                'plist',
                'xsd',
                'dtd',
                'xsl',
                'xslt',
                'resx',
                'iml',
                'xquery',
                'tmLanguage',
                'manifest',
                'project',
                'xml.dist',
                'xml.dist.sample',
                'dmn',
                'jrxml',
            ],
            fileNames: ['.htaccess'],
        },
        {
            name: 'image',
            fileExtensions: [
                'png',
                'jpeg',
                'jpg',
                'gif',
                'ico',
                'tif',
                'tiff',
                'psd',
                'psb',
                'ami',
                'apx',
                'avif',
                'bmp',
                'bpg',
                'brk',
                'cur',
                'dds',
                'dng',
                'exr',
                'fpx',
                'gbr',
                'img',
                'jbig2',
                'jb2',
                'jng',
                'jxr',
                'pgf',
                'pic',
                'raw',
                'webp',
                'eps',
                'afphoto',
                'ase',
                'aseprite',
                'clip',
                'cpt',
                'heif',
                'heic',
                'kra',
                'mdp',
                'ora',
                'pdn',
                'reb',
                'sai',
                'tga',
                'xcf',
                'jfif',
                'ppm',
                'pbm',
                'pgm',
                'pnm',
                'icns',
            ],
        },
        { name: 'javascript', fileExtensions: ['esx', 'mjs', 'js', 'cjs'] },
        { name: 'typescript' , fileExtensions: ['ts', "mts", "cts"] },
        { name: 'react', fileExtensions: ['jsx'] },
        { name: 'react_ts', fileExtensions: ['tsx'] },
        {
            name: 'routing',
            fileExtensions: [
                'routing.ts',
                'routing.tsx',
                'routing.js',
                'routing.jsx',
                'routes.ts',
                'routes.tsx',
                'routes.js',
                'routes.jsx',
            ],
            fileNames: [
                'router.js',
                'router.jsx',
                'router.ts',
                'router.tsx',
                'routes.js',
                'routes.jsx',
                'routes.ts',
                'routes.tsx',
            ],
            enabledFor: [
                IconPack.Angular,
                IconPack.Ngrx,
                IconPack.React,
                IconPack.Redux,
                IconPack.Vue,
                IconPack.Vuex,
            ],
        },
        {
            name: 'redux-action',
            fileExtensions: ['action.js', 'actions.js', 'action.ts', 'actions.ts'],
            fileNames: ['action.js', 'actions.js', 'action.ts', 'actions.ts'],
            enabledFor: [IconPack.Redux],
        },
        {
            name: 'redux-reducer',
            fileExtensions: [
                'reducer.js',
                'reducers.js',
                'reducer.ts',
                'reducers.ts',
            ],
            fileNames: ['reducer.js', 'reducers.js', 'reducer.ts', 'reducers.ts'],
            enabledFor: [IconPack.Redux],
        },
        {
            name: 'redux-selector',
            fileExtensions: [
                'selector.js',
                'selectors.js',
                'selector.ts',
                'selectors.ts',
            ],
            fileNames: ['selector.js', 'selectors.js', 'selector.ts', 'selectors.ts'],
            enabledFor: [IconPack.Redux],
        },
        {
            name: 'redux-store',
            fileExtensions: ['store.js', 'store.ts'],
            fileNames: ['store.js', 'store.ts'],
            enabledFor: [IconPack.Redux],
        },
        {
            name: 'settings',
            fileExtensions: [
                'ini',
                'dlc',
                'dll',
                'config',
                'conf',
                'properties',
                'prop',
                'settings',
                'option',
                'props',
                'toml',
                'prefs',
                'sln.dotsettings',
                'sln.dotsettings.user',
                'cfg',
            ],
            fileNames: [
                '.jshintignore',
                '.buildignore',
                '.mrconfig',
                '.yardopts',
                'manifest.mf',
                '.clang-format',
                '.clang-tidy',
            ],
        },
        {
            name: 'typescript-def',
            fileExtensions: ['d.ts', 'd.cts', 'd.mts'],
        },
        { name: 'markojs', fileExtensions: ['marko'] },
        {
            name: 'astro',
            fileExtensions: ['astro'],
            fileNames: [
                'astro.config.js',
                'astro.config.mjs',
                'astro.config.cjs',
                'astro.config.ts',
                'astro.config.cts',
                'astro.config.mts',
            ],
        },
        { name: 'pdf', fileExtensions: ['pdf'] },
        {
            name: 'table',
            fileExtensions: ['xlsx', 'xlsm', 'xls', 'csv', 'tsv', 'psv', 'ods'],
        },
        {
            name: 'vscode',
            fileExtensions: [
                'vscodeignore',
                'vsixmanifest',
                'vsix',
                'code-workplace',
                'code-workspace',
                'code-profile',
                'code-snippets',
            ],
        },
        {
            name: 'visualstudio',
            fileExtensions: [
                'csproj',
                'ruleset',
                'sln',
                'suo',
                'vb',
                'vbs',
                'vcxitems',
                'vcxitems.filters',
                'vcxproj',
                'vcxproj.filters',
            ],
        },
        {
            name: 'database',
            fileExtensions: [
                'pdb',
                'sql',
                'pks',
                'pkb',
                'accdb',
                'mdb',
                'sqlite',
                'sqlite3',
                'pgsql',
                'postgres',
                'psql',
                'db',
                'db3',
            ],
        },
        { name: 'kusto', fileExtensions: ['kql'] },
        { name: 'csharp', fileExtensions: ['cs', 'csx'] },
        { name: 'qsharp', fileExtensions: ['qs'] },
        {
            name: 'zip',
            fileExtensions: [
                'zip',
                'tar',
                'gz',
                'xz',
                'lzma',
                'lz4',
                'br',
                'bz2',
                'bzip2',
                'gzip',
                'brotli',
                '7z',
                'rar',
                'tz',
                'txz',
                'tgz',
            ],
        },
        { name: 'vala', fileExtensions: ['vala'] },
        { name: 'zig', fileExtensions: ['zig'] },
        { name: 'exe', fileExtensions: ['exe', 'msi'] },
        { name: 'hex', fileExtensions: ['dat', 'bin', 'hex'] },
        { name: 'java', fileExtensions: ['java', 'jsp'] },
        { name: 'jar', fileExtensions: ['jar'] },
        { name: 'javaclass', fileExtensions: ['class'] },
        { name: 'c', fileExtensions: ['c', 'i', 'mi'] },
        { name: 'h', fileExtensions: ['h'] },
        {
            name: 'cpp',
            fileExtensions: ['cc', 'cpp', 'cxx', 'c++', 'cp', 'mii', 'ii'],
        },
        {
            name: 'hpp',
            fileExtensions: ['hh', 'hpp', 'hxx', 'h++', 'hp', 'tcc', 'inl'],
        },
        { name: 'objective-c', fileExtensions: ['m'] },
        { name: 'objective-cpp', fileExtensions: ['mm'] },
        { name: 'rc', fileExtensions: ['rc'] },
        { name: 'go', fileExtensions: ['go'] },
        {
            name: 'go-mod',
            fileNames: ['go.mod', 'go.sum', 'go.work', 'go.work.sum'],
        },
        { name: 'python', fileExtensions: ['py'] },
        {
            name: 'python-misc',
            fileExtensions: ['pyc', 'whl'],
            fileNames: [
                'requirements.txt',
                'pipfile',
                '.python-version',
                'manifest.in',
                'pylintrc',
                '.pylintrc',
                'pyproject.toml',
            ],
        },
        { name: 'url', fileExtensions: ['url'] },
        {
            name: 'console',
            fileExtensions: [
                'sh',
                'ksh',
                'csh',
                'tcsh',
                'zsh',
                'bash',
                'bat',
                'cmd',
                'awk',
                'fish',
                'exp',
                'nu',
            ],
            fileNames: ['commit-msg', 'pre-commit', 'pre-push', 'post-merge'],
        },
        {
            name: 'powershell',
            fileExtensions: ['ps1', 'psm1', 'psd1', 'ps1xml', 'psc1', 'pssc'],
        },
        {
            name: 'gradle',
            fileExtensions: ['gradle'],
            fileNames: ['gradle.properties', 'gradlew', 'gradle-wrapper.properties'],
        },
        { name: 'word', fileExtensions: ['doc', 'docx', 'rtf', 'odt'] },
        {
            name: 'certificate',
            fileExtensions: ['cer', 'cert', 'crt'],
            fileNames: [
                'copying',
                'copying.md',
                'copying.rst',
                'copying.txt',
                'copyright',
                'copyright.md',
                'copyright.rst',
                'copyright.txt',
                'license',
                'license-agpl',
                'license-apache',
                'license-bsd',
                'license-mit',
                'license-gpl',
                'license-lgpl',
                'license.md',
                'license.rst',
                'license.txt',
                'licence',
                'licence-agpl',
                'licence-apache',
                'licence-bsd',
                'licence-mit',
                'licence-gpl',
                'licence-lgpl',
                'licence.md',
                'licence.rst',
                'licence.txt',
            ],
        },
        {
            name: 'key',
            fileExtensions: ['pub', 'key', 'pem', 'asc', 'gpg', 'passwd'],
            fileNames: ['.htpasswd'],
        },
        {
            name: 'font',
            fileExtensions: [
                'woff',
                'woff2',
                'ttf',
                'eot',
                'suit',
                'otf',
                'bmap',
                'fnt',
                'odttf',
                'ttc',
                'font',
                'fonts',
                'sui',
                'ntf',
                'mrf',
            ],
        },
        { name: 'lib', fileExtensions: ['lib', 'bib'] },
        {
            name: 'ruby',
            fileExtensions: ['rb', 'erb', 'rbs'],
            fileNames: ['.ruby-version'],
        },
        { name: 'gemfile', fileNames: ['gemfile'] },
        {
            name: 'rubocop',
            fileNames: ['.rubocop.yml', '.rubocop-todo.yml', '.rubocop_todo.yml'],
            light: true,
        },
        { name: 'fsharp', fileExtensions: ['fs', 'fsx', 'fsi', 'fsproj'] },
        { name: 'swift', fileExtensions: ['swift'] },
        { name: 'arduino', fileExtensions: ['ino'] },
        {
            name: 'docker',
            fileExtensions: [
                'dockerignore',
                'dockerfile',
                'docker-compose.yml',
                'docker-compose.yaml',
                'containerignore',
                'containerfile',
                'compose.yaml',
                'compose.yml',
            ],
            fileNames: [
                'dockerfile',
                'dockerfile.prod',
                'dockerfile.production',
                'dockerfile.alpha',
                'dockerfile.beta',
                'dockerfile.stage',
                'dockerfile.staging',
                'dockerfile.dev',
                'dockerfile.development',
                'dockerfile.local',
                'dockerfile.test',
                'dockerfile.testing',
                'dockerfile.ci',
                'dockerfile.web',
                'dockerfile.worker',

                'docker-compose.yml',
                'docker-compose.override.yml',
                'docker-compose.prod.yml',
                'docker-compose.production.yml',
                'docker-compose.alpha.yml',
                'docker-compose.beta.yml',
                'docker-compose.stage.yml',
                'docker-compose.staging.yml',
                'docker-compose.dev.yml',
                'docker-compose.development.yml',
                'docker-compose.local.yml',
                'docker-compose.test.yml',
                'docker-compose.testing.yml',
                'docker-compose.ci.yml',
                'docker-compose.web.yml',
                'docker-compose.worker.yml',

                'docker-compose.yaml',
                'docker-compose.override.yaml',
                'docker-compose.prod.yaml',
                'docker-compose.production.yaml',
                'docker-compose.alpha.yaml',
                'docker-compose.beta.yaml',
                'docker-compose.stage.yaml',
                'docker-compose.staging.yaml',
                'docker-compose.dev.yaml',
                'docker-compose.development.yaml',
                'docker-compose.local.yaml',
                'docker-compose.test.yaml',
                'docker-compose.testing.yaml',
                'docker-compose.ci.yaml',
                'docker-compose.web.yaml',
                'docker-compose.worker.yaml',

                'containerfile',
                'containerfile.prod',
                'containerfile.production',
                'containerfile.alpha',
                'containerfile.beta',
                'containerfile.stage',
                'containerfile.staging',
                'containerfile.dev',
                'containerfile.development',
                'containerfile.local',
                'containerfile.test',
                'containerfile.testing',
                'containerfile.ci',
                'containerfile.web',
                'containerfile.worker',

                'compose.yaml',
                'compose.override.yaml',
                'compose.prod.yaml',
                'compose.production.yaml',
                'compose.alpha.yaml',
                'compose.beta.yaml',
                'compose.stage.yaml',
                'compose.staging.yaml',
                'compose.dev.yaml',
                'compose.development.yaml',
                'compose.local.yaml',
                'compose.test.yaml',
                'compose.testing.yaml',
                'compose.ci.yaml',
                'compose.web.yaml',
                'compose.worker.yaml',

                'compose.yml',
                'compose.override.yml',
                'compose.prod.yml',
                'compose.production.yml',
                'compose.alpha.yml',
                'compose.beta.yml',
                'compose.stage.yml',
                'compose.staging.yml',
                'compose.dev.yml',
                'compose.development.yml',
                'compose.local.yml',
                'compose.test.yml',
                'compose.testing.yml',
                'compose.ci.yml',
                'compose.web.yml',
                'compose.worker.yml',
            ],
        },
        { name: 'tex', fileExtensions: ['tex', 'sty', 'dtx', 'ltx'] },
        {
            name: 'powerpoint',
            fileExtensions: [
                'pptx',
                'ppt',
                'pptm',
                'potx',
                'potm',
                'ppsx',
                'ppsm',
                'pps',
                'ppam',
                'ppa',
                'odp',
            ],
        },
        {
            name: 'video',
            fileExtensions: [
                'webm',
                'mkv',
                'flv',
                'vob',
                'ogv',
                'ogg',
                'gifv',
                'avi',
                'mov',
                'qt',
                'wmv',
                'yuv',
                'rm',
                'rmvb',
                'mp4',
                'm4v',
                'mpg',
                'mp2',
                'mpeg',
                'mpe',
                'mpv',
                'm2v',
            ],
        },
        { name: 'virtual', fileExtensions: ['vdi', 'vbox', 'vbox-prev'] },
        { name: 'email', fileExtensions: ['ics'], fileNames: ['.mailmap'] },
        {
            name: 'audio',
            fileExtensions: ['mp3', 'flac', 'm4a', 'wma', 'aiff', 'wav'],
        },
        { name: 'coffee', fileExtensions: ['coffee', 'cson', 'iced'] },
        { name: 'document', fileExtensions: ['txt'] },
        {
            name: 'graphql',
            fileExtensions: ['graphql', 'gql'],
            fileNames: [
                '.graphqlconfig',
                '.graphqlrc',
                '.graphqlrc.json',
                '.graphqlrc.js',
                '.graphqlrc.cjs',
                '.graphqlrc.ts',
                '.graphqlrc.toml',
                '.graphqlrc.yaml',
                '.graphqlrc.yml',
                'graphql.config.json',
                'graphql.config.js',
                'graphql.config.cjs',
                'graphql.config.ts',
                'graphql.config.toml',
                'graphql.config.yaml',
                'graphql.config.yml',
            ],
        },
        { name: 'rust', fileExtensions: ['rs', 'ron'] },
        { name: 'raml', fileExtensions: ['raml'] },
        { name: 'xaml', fileExtensions: ['xaml'] },
        { name: 'haskell', fileExtensions: ['hs'] },
        { name: 'kotlin', fileExtensions: ['kt', 'kts'] },
        { name: 'otne', fileExtensions: ['otne'] },
        {
            name: 'git',
            fileExtensions: ['patch'],
            fileNames: [
                '.git',
                '.gitignore',
                '.gitmessage',
                '.gitignore-global',
                '.gitignore_global',
                '.gitattributes',
                '.gitattributes-global',
                '.gitattributes_global',
                '.gitconfig',
                '.gitmodules',
                '.gitkeep',
                '.keep',
                '.gitpreserve',
                '.gitinclude',
                '.git-blame-ignore',
                '.git-blame-ignore-revs',
                '.git-for-windows-updater',
                'git-history',
            ],
        },
        { name: 'lua', fileExtensions: ['lua'], fileNames: ['.luacheckrc'] },
        { name: 'clojure', fileExtensions: ['clj', 'cljs', 'cljc'] },
        { name: 'groovy', fileExtensions: ['groovy'] },
        { name: 'r', fileExtensions: ['r', 'rmd'], fileNames: ['.Rhistory'] },
        { name: 'dart', fileExtensions: ['dart'], fileNames: ['.pubignore'] },
        { name: 'dart_generated', fileExtensions: ['freezed.dart', 'g.dart'] },
        { name: 'actionscript', fileExtensions: ['as'] },
        { name: 'mxml', fileExtensions: ['mxml'] },
        { name: 'autohotkey', fileExtensions: ['ahk'] },
        { name: 'flash', fileExtensions: ['swf'] },
        { name: 'swc', fileExtensions: ['swc'] },
        {
            name: 'cmake',
            fileExtensions: ['cmake'],
            fileNames: ['cmakelists.txt', 'cmakecache.txt'],
        },
        {
            name: 'assembly',
            fileExtensions: [
                'asm',
                'a51',
                'inc',
                'nasm',
                's',
                'ms',
                'agc',
                'ags',
                'aea',
                'argus',
                'mitigus',
                'binsource',
            ],
        },
        { name: 'vue', fileExtensions: ['vue'] },
        { name: 'semgrep', fileNames: ['semgrep.yml', '.semgrepignore'] },
        {
            name: 'vue-config',
            fileNames: [
                'vue.config.js',
                'vue.config.ts',
                'vetur.config.js',
                'vetur.config.ts',
                'volar.config.js',
            ],
        },
        {
            name: 'vuex-store',
            fileExtensions: ['store.js', 'store.ts'],
            fileNames: ['store.js', 'store.ts'],
            enabledFor: [IconPack.Vuex],
        },
        {
            name: 'nuxt',
            fileNames: ['nuxt.config.js', 'nuxt.config.ts', '.nuxtignore'],
        },
        { name: 'ocaml', fileExtensions: ['ml', 'mli', 'cmx'] },
        { name: 'odin', fileExtensions: ['odin'] },
        {
            name: 'javascript-map',
            fileExtensions: ['js.map', 'mjs.map', 'cjs.map'],
        },
        { name: 'css-map', fileExtensions: ['css.map'] },
        {
            name: 'lock',
            fileExtensions: ['lock'],
            fileNames: ['security.md', 'security.txt', 'security'],
        },
        { name: 'handlebars', fileExtensions: ['hbs', 'mustache'] },
        { name: 'perl', fileExtensions: ['pm', 'raku'] },
        { name: 'haxe', fileExtensions: ['hx'] },
        {
            name: 'test-ts',
            fileExtensions: [
                'spec.ts',
                'spec.cts',
                'spec.mts',
                'cy.ts',
                'e2e-spec.ts',
                'e2e-spec.cts',
                'e2e-spec.mts',
                'test.ts',
                'test.cts',
                'test.mts',
                'ts.snap',
                'spec-d.ts',
                'test-d.ts',
            ],
        },
        {
            name: 'test-jsx',
            fileExtensions: [
                'spec.tsx',
                'test.tsx',
                'tsx.snap',
                'spec.jsx',
                'test.jsx',
                'jsx.snap',
                'cy.jsx',
                'cy.tsx',
                'spec-d.tsx',
                'test-d.tsx',
            ],
        },
        {
            name: 'test-js',
            fileExtensions: [
                'spec.js',
                'spec.cjs',
                'spec.mjs',
                'e2e-spec.js',
                'e2e-spec.cjs',
                'e2e-spec.mjs',
                'test.js',
                'test.cjs',
                'test.mjs',
                'js.snap',
                'cy.js',
            ],
        },
        {
            name: 'angular',
            fileExtensions: ['module.ts', 'module.js', 'ng-template'],
            fileNames: [
                'angular-cli.json',
                '.angular-cli.json',
                'angular.json',
                'ng-package.json',
            ],
            enabledFor: [IconPack.Angular, IconPack.Ngrx],
        },
        {
            name: 'angular-component',
            fileExtensions: ['component.ts', 'component.js'],
            enabledFor: [IconPack.Angular, IconPack.Ngrx],
        },
        {
            name: 'angular-guard',
            fileExtensions: ['guard.ts', 'guard.js'],
            enabledFor: [IconPack.Angular, IconPack.Ngrx],
        },
        {
            name: 'angular-service',
            fileExtensions: ['service.ts', 'service.js'],
            enabledFor: [IconPack.Angular, IconPack.Ngrx],
        },
        {
            name: 'angular-pipe',
            fileExtensions: ['pipe.ts', 'pipe.js', 'filter.js'],
            enabledFor: [IconPack.Angular, IconPack.Ngrx],
        },
        {
            name: 'angular-directive',
            fileExtensions: ['directive.ts', 'directive.js'],
            enabledFor: [IconPack.Angular, IconPack.Ngrx],
        },
        {
            name: 'angular-resolver',
            fileExtensions: ['resolver.ts', 'resolver.js'],
            enabledFor: [IconPack.Angular, IconPack.Ngrx],
        },
        { name: 'puppet', fileExtensions: ['pp'] },
        { name: 'elixir', fileExtensions: ['ex', 'exs', 'eex', 'leex', 'heex'] },
        { name: 'livescript', fileExtensions: ['ls'] },
        { name: 'erlang', fileExtensions: ['erl'] },
        { name: 'twig', fileExtensions: ['twig'] },
        { name: 'julia', fileExtensions: ['jl'] },
        { name: 'elm', fileExtensions: ['elm'] },
        { name: 'purescript', fileExtensions: ['pure', 'purs'] },
        { name: 'smarty', fileExtensions: ['tpl'] },
        { name: 'stylus', fileExtensions: ['styl'] },
        { name: 'reason', fileExtensions: ['re', 'rei'] },
        { name: 'bucklescript', fileExtensions: ['cmj'] },
        { name: 'merlin', fileExtensions: ['merlin'] },
        { name: 'verilog', fileExtensions: ['vhd', 'sv', 'svh'] },
        { name: 'mathematica', fileExtensions: ['nb'] },
        { name: 'wolframlanguage', fileExtensions: ['wl', 'wls'] },
        { name: 'nunjucks', fileExtensions: ['njk', 'nunjucks'] },
        { name: 'robot', fileExtensions: ['robot'] },
        { name: 'solidity', fileExtensions: ['sol'] },
        { name: 'autoit', fileExtensions: ['au3'] },
        { name: 'haml', fileExtensions: ['haml'] },
        { name: 'yang', fileExtensions: ['yang'] },
        {
            name: 'mjml',
            fileExtensions: ['mjml'],
            fileNames: ['.mjmlconfig'],
        },
        {
            name: 'vercel',
            fileNames: ['vercel.json', '.vercelignore', 'now.json', '.nowignore'],
            light: true,
        },
        {
            name: 'verdaccio',
            fileNames: ['verdaccio.yml'],
        },
        {
            name: 'next',
            fileNames: [
                'next.config.js',
                'next.config.mjs',
                'next.config.ts',
                'next.config.mts',
            ],
            light: true,
        },
        {
            name: 'remix',
            fileNames: ['remix.config.js', 'remix.config.ts'],
            light: true,
        },
        {
            name: 'terraform',
            fileExtensions: ['tf', 'tf.json', 'tfvars', 'tfstate'],
        },
        {
            name: 'laravel',
            fileExtensions: ['blade.php', 'inky.php'],
            fileNames: ['artisan'],
        },
        { name: 'applescript', fileExtensions: ['applescript', 'ipa'] },
        { name: 'cake', fileExtensions: ['cake'] },
        { name: 'cucumber', fileExtensions: ['feature', 'features'] },
        { name: 'nim', fileExtensions: ['nim', 'nimble'] },
        { name: 'apiblueprint', fileExtensions: ['apib', 'apiblueprint'] },
        { name: 'riot', fileExtensions: ['riot', 'tag'] },
        { name: 'vfl', fileExtensions: ['vfl'], fileNames: ['.vfl'] },
        { name: 'kl', fileExtensions: ['kl'], fileNames: ['.kl'] },
        {
            name: 'postcss',
            fileExtensions: ['pcss', 'sss'],
            fileNames: [
                'postcss.config.js',
                'postcss.config.cjs',
                'postcss.config.ts',
                'postcss.config.cts',
                '.postcssrc.js',
                '.postcssrc.cjs',
                '.postcssrc.ts',
                '.postcssrc.cts',
                '.postcssrc',
                '.postcssrc.json',
                '.postcssrc.yaml',
                '.postcssrc.yml',
            ],
        },
        {
            name: 'posthtml',
            fileNames: [
                'posthtml.config.js',
                '.posthtmlrc.js',
                '.posthtmlrc',
                '.posthtmlrc.json',
                '.posthtmlrc.yml',
            ],
        },
        {
            name: 'todo',
            fileExtensions: ['todo'],
            fileNames: ['todo.md', 'todos.md'],
        },
        { name: 'coldfusion', fileExtensions: ['cfml', 'cfc', 'lucee', 'cfm'] },
        {
            name: 'cabal',
            fileExtensions: ['cabal'],
            fileNames: [
                'cabal.project',
                'cabal.project.freeze',
                'cabal.project.local',
            ],
        },
        { name: 'nix', fileExtensions: ['nix'] },
        { name: 'slim', fileExtensions: ['slim'] },
        { name: 'http', fileExtensions: ['http', 'rest'], fileNames: ['CNAME'] },
        { name: 'restql', fileExtensions: ['rql', 'restql'] },
        { name: 'kivy', fileExtensions: ['kv'] },
        {
            name: 'graphcool',
            fileExtensions: ['graphcool'],
            fileNames: ['project.graphcool'],
        },
        { name: 'sbt', fileExtensions: ['sbt'] },
        {
            name: 'webpack',
            fileNames: [
                'webpack.js',
                'webpack.cjs',
                'webpack.mjs',
                'webpack.ts',
                'webpack.cts',
                'webpack.mts',
                'webpack.base.js',
                'webpack.base.cjs',
                'webpack.base.mjs',
                'webpack.base.ts',
                'webpack.base.cts',
                'webpack.base.mts',
                'webpack.config.js',
                'webpack.config.cjs',
                'webpack.config.mjs',
                'webpack.config.ts',
                'webpack.config.cts',
                'webpack.config.mts',
                'webpack.common.js',
                'webpack.common.cjs',
                'webpack.common.mjs',
                'webpack.common.ts',
                'webpack.common.cts',
                'webpack.common.mts',
                'webpack.config.common.js',
                'webpack.config.common.cjs',
                'webpack.config.common.mjs',
                'webpack.config.common.ts',
                'webpack.config.common.cts',
                'webpack.config.common.mts',
                'webpack.config.common.babel.js',
                'webpack.config.common.babel.ts',
                'webpack.dev.js',
                'webpack.dev.cjs',
                'webpack.dev.mjs',
                'webpack.dev.ts',
                'webpack.dev.cts',
                'webpack.dev.mts',
                'webpack.development.js',
                'webpack.development.cjs',
                'webpack.development.mjs',
                'webpack.development.ts',
                'webpack.development.cts',
                'webpack.development.mts',
                'webpack.config.dev.js',
                'webpack.config.dev.cjs',
                'webpack.config.dev.mjs',
                'webpack.config.dev.ts',
                'webpack.config.dev.cts',
                'webpack.config.dev.mts',
                'webpack.config.dev.babel.js',
                'webpack.config.dev.babel.ts',
                'webpack.config.main.js',
                'webpack.config.renderer.ts',
                'webpack.mix.js',
                'webpack.mix.cjs',
                'webpack.mix.mjs',
                'webpack.mix.ts',
                'webpack.mix.cts',
                'webpack.mix.mts',
                'webpack.prod.js',
                'webpack.prod.cjs',
                'webpack.prod.mjs',
                'webpack.prod.ts',
                'webpack.prod.cts',
                'webpack.prod.mts',
                'webpack.prod.config.js',
                'webpack.prod.config.cjs',
                'webpack.prod.config.mjs',
                'webpack.prod.config.ts',
                'webpack.prod.config.cts',
                'webpack.prod.config.mts',
                'webpack.production.js',
                'webpack.production.cjs',
                'webpack.production.mjs',
                'webpack.production.ts',
                'webpack.production.cts',
                'webpack.production.mts',
                'webpack.server.js',
                'webpack.server.cjs',
                'webpack.server.mjs',
                'webpack.server.ts',
                'webpack.server.cts',
                'webpack.server.mts',
                'webpack.client.js',
                'webpack.client.cjs',
                'webpack.client.mjs',
                'webpack.client.ts',
                'webpack.client.cts',
                'webpack.client.mts',
                'webpack.config.server.js',
                'webpack.config.server.cjs',
                'webpack.config.server.mjs',
                'webpack.config.server.ts',
                'webpack.config.server.cts',
                'webpack.config.server.mts',
                'webpack.config.client.js',
                'webpack.config.client.cjs',
                'webpack.config.client.mjs',
                'webpack.config.client.ts',
                'webpack.config.client.cts',
                'webpack.config.client.mts',
                'webpack.config.production.babel.js',
                'webpack.config.production.babel.ts',
                'webpack.config.prod.babel.js',
                'webpack.config.prod.babel.cjs',
                'webpack.config.prod.babel.mjs',
                'webpack.config.prod.babel.ts',
                'webpack.config.prod.babel.cts',
                'webpack.config.prod.babel.mts',
                'webpack.config.prod.js',
                'webpack.config.prod.cjs',
                'webpack.config.prod.mjs',
                'webpack.config.prod.ts',
                'webpack.config.prod.cts',
                'webpack.config.prod.mts',
                'webpack.config.production.js',
                'webpack.config.production.cjs',
                'webpack.config.production.mjs',
                'webpack.config.production.ts',
                'webpack.config.production.cts',
                'webpack.config.production.mts',
                'webpack.config.staging.js',
                'webpack.config.staging.cjs',
                'webpack.config.staging.mjs',
                'webpack.config.staging.ts',
                'webpack.config.staging.cts',
                'webpack.config.staging.mts',
                'webpack.config.babel.js',
                'webpack.config.babel.ts',
                'webpack.config.base.babel.js',
                'webpack.config.base.babel.ts',
                'webpack.config.base.js',
                'webpack.config.base.cjs',
                'webpack.config.base.mjs',
                'webpack.config.base.ts',
                'webpack.config.base.cts',
                'webpack.config.base.mts',
                'webpack.config.staging.babel.js',
                'webpack.config.staging.babel.ts',
                'webpack.config.coffee',
                'webpack.config.test.js',
                'webpack.config.test.cjs',
                'webpack.config.test.mjs',
                'webpack.config.test.ts',
                'webpack.config.test.cts',
                'webpack.config.test.mts',
                'webpack.config.vendor.js',
                'webpack.config.vendor.cjs',
                'webpack.config.vendor.mjs',
                'webpack.config.vendor.ts',
                'webpack.config.vendor.cts',
                'webpack.config.vendor.mts',
                'webpack.config.vendor.production.js',
                'webpack.config.vendor.production.cjs',
                'webpack.config.vendor.production.mjs',
                'webpack.config.vendor.production.ts',
                'webpack.config.vendor.production.cts',
                'webpack.config.vendor.production.mts',
                'webpack.test.js',
                'webpack.test.cjs',
                'webpack.test.mjs',
                'webpack.test.ts',
                'webpack.test.cts',
                'webpack.test.mts',
                'webpack.dist.js',
                'webpack.dist.cjs',
                'webpack.dist.mjs',
                'webpack.dist.ts',
                'webpack.dist.cts',
                'webpack.dist.mts',
                'webpackfile.js',
                'webpackfile.cjs',
                'webpackfile.mjs',
                'webpackfile.ts',
                'webpackfile.cts',
                'webpackfile.mts',
            ],
        },
        { name: 'ionic', fileNames: ['ionic.config.json', '.io-config.json'] },
        {
            name: 'gulp',
            fileNames: [
                'gulpfile.js',
                'gulpfile.mjs',
                'gulpfile.ts',
                'gulpfile.cts',
                'gulpfile.mts',
                'gulpfile.babel.js',
            ],
        },
        {
            name: 'nodejs',
            fileNames: [
                'package.json',
                'package-lock.json',
                '.nvmrc',
                '.esmrc',
                '.node-version',
            ],
        },
        { name: 'npm', fileNames: ['.npmignore', '.npmrc'] },
        {
            name: 'yarn',
            fileNames: [
                '.yarnrc',
                'yarn.lock',
                '.yarnclean',
                '.yarn-integrity',
                'yarn-error.log',
                '.yarnrc.yml',
                '.yarnrc.yaml',
            ],
        },
        {
            name: 'android',
            fileNames: ['androidmanifest.xml'],
            fileExtensions: ['apk', 'smali', 'dex'],
        },
        {
            name: 'tune',
            fileExtensions: ['env'],
            fileNames: [
                '.env.defaults',
                '.env.example',
                '.env.sample',
                '.env.template',
                '.env.schema',
                '.env.local',
                '.env.dev',
                '.env.development',
                '.env.alpha',
                '.env.e2e',
                '.env.qa',
                '.env.dist',
                '.env.prod',
                '.env.production',
                '.env.stage',
                '.env.staging',
                '.env.preview',
                '.env.test',
                '.env.testing',
                '.env.development.local',
                '.env.qa.local',
                '.env.production.local',
                '.env.staging.local',
                '.env.test.local',
                '.env.uat',
            ],
        },
        {
            name: 'turborepo',
            light: true,
            fileNames: ['turbo.json'],
        },
        {
            name: 'babel',
            fileNames: [
                '.babelrc',
                '.babelrc.cjs',
                '.babelrc.js',
                '.babelrc.mjs',
                '.babelrc.json',
                'babel.config.cjs',
                'babel.config.js',
                'babel.config.mjs',
                'babel.config.json',
                'babel-transform.js',
                '.babel-plugin-macrosrc',
                '.babel-plugin-macrosrc.json',
                '.babel-plugin-macrosrc.yaml',
                '.babel-plugin-macrosrc.yml',
                '.babel-plugin-macrosrc.js',
                'babel-plugin-macros.config.js',
            ],
        },
        {
            name: 'blitz',
            fileNames: [
                'blitz.config.js',
                'blitz.config.ts',
                '.blitz.config.compiled.js',
            ],
        },
        {
            name: 'contributing',
            fileNames: [
                'contributing.md',
                'contributing.rst',
                'contributing.txt',
                'contributing',
            ],
        },
        {
            name: 'readme',
            fileNames: ['readme.md', 'readme.rst', 'readme.txt', 'readme'],
        },
        {
            name: 'changelog',
            fileNames: [
                'changelog',
                'changelog.md',
                'changelog.rst',
                'changelog.txt',
                'changes',
                'changes.md',
                'changes.rst',
                'changes.txt',
            ],
        },
        {
            name: 'architecture',
            fileNames: [
                'architecture.md',
                'architecture.rst',
                'architecture.txt',
                'architecture',
            ],
        },
        {
            name: 'credits',
            fileNames: ['credits.md', 'credits.rst', 'credits.txt', 'credits'],
        },
        {
            name: 'authors',
            fileNames: [
                'authors.md',
                'authors.rst',
                'authors.txt',
                'authors',
                'contributors.md',
                'contributors.rst',
                'contributors.txt',
                'contributors',
            ],
        },
        { name: 'flow', fileNames: ['.flowconfig'] },
        { name: 'favicon', fileNames: ['favicon.ico'] },
        {
            name: 'karma',
            fileNames: [
                'karma.conf.js',
                'karma.conf.ts',
                'karma.conf.coffee',
                'karma.config.js',
                'karma.config.ts',
                'karma-main.js',
                'karma-main.ts',
            ],
        },
        { name: 'bithound', fileNames: ['.bithoundrc'] },
        {
            name: 'svgo',
            fileNames: ['svgo.config.js', 'svgo.config.cjs', 'svgo.config.mjs'],
        },
        { name: 'appveyor', fileNames: ['.appveyor.yml', 'appveyor.yml'] },
        { name: 'travis', fileNames: ['.travis.yml'] },
        { name: 'codecov', fileNames: ['.codecov.yml', 'codecov.yml'] },
        {
            name: 'sonarcloud',
            fileNames: [
                'sonar-project.properties',
                '.sonarcloud.properties',
                'sonarcloud.yaml',
            ],
        },
        {
            name: 'protractor',
            fileNames: [
                'protractor.conf.js',
                'protractor.conf.ts',
                'protractor.conf.coffee',
                'protractor.config.js',
                'protractor.config.ts',
            ],
        },
        { name: 'fusebox', fileNames: ['fuse.js'] },
        { name: 'heroku', fileNames: ['procfile', 'procfile.windows'] },
        { name: 'editorconfig', fileNames: ['.editorconfig'] },
        { name: 'gitlab', fileExtensions: ['gitlab-ci.yml'] },
        { name: 'bower', fileNames: ['.bowerrc', 'bower.json'] },
        {
            name: 'eslint',
            fileNames: [
                '.eslintrc.js',
                '.eslintrc.cjs',
                '.eslintrc.yaml',
                '.eslintrc.yml',
                '.eslintrc.json',
                '.eslintrc-md.js',
                '.eslintrc-jsdoc.js',
                '.eslintrc',
                '.eslintignore',
                '.eslintcache',
                'eslint.config.js',
                'eslint.config.mjs',
                '.eslintrc.base.json',
            ],
        },
        {
            name: 'conduct',
            fileNames: [
                'code_of_conduct.md',
                'code_of_conduct.txt',
                'code_of_conduct',
            ],
        },
        { name: 'watchman', fileNames: ['.watchmanconfig'] },
        { name: 'aurelia', fileNames: ['aurelia.json'] },
        {
            name: 'auto',
            fileNames: [
                '.autorc',
                'auto.config.js',
                'auto.config.ts',
                'auto-config.json',
                'auto-config.yaml',
                'auto-config.yml',
                'auto-config.ts',
                'auto-config.js',
            ],
            light: true,
        },
        {
            name: 'mocha',
            fileNames: [
                'mocha.opts',
                '.mocharc.yml',
                '.mocharc.yaml',
                '.mocharc.js',
                '.mocharc.json',
                '.mocharc.jsonc',
            ],
        },
        {
            name: 'jenkins',
            fileNames: ['jenkinsfile'],
            fileExtensions: ['jenkinsfile', 'jenkins'],
        },
        {
            name: 'firebase',
            fileNames: [
                'firebase.json',
                '.firebaserc',
                'firestore.rules',
                'firestore.indexes.json',
            ],
        },
        {
            name: 'figma',
            fileExtensions: ['fig'],
        },
        {
            name: 'rollup',
            fileNames: [
                'rollup.config.js',
                'rollup.config.mjs',
                'rollup.config.ts',
                'rollup-config.js',
                'rollup-config.mjs',
                'rollup-config.ts',
                'rollup.config.common.js',
                'rollup.config.common.mjs',
                'rollup.config.common.ts',
                'rollup.config.base.js',
                'rollup.config.base.mjs',
                'rollup.config.base.ts',
                'rollup.config.prod.js',
                'rollup.config.prod.mjs',
                'rollup.config.prod.ts',
                'rollup.config.dev.js',
                'rollup.config.dev.mjs',
                'rollup.config.dev.ts',
                'rollup.config.prod.vendor.js',
                'rollup.config.prod.vendor.mjs',
                'rollup.config.prod.vendor.ts',
            ],
        },
        { name: 'hack', fileNames: ['.hhconfig'] },
        { name: 'hardhat', fileNames: ['hardhat.config.js', 'hardhat.config.ts'] },
        {
            name: 'stylelint',
            fileNames: [
                '.stylelintrc',
                'stylelint.config.js',
                'stylelint.config.cjs',
                '.stylelintrc.json',
                '.stylelintrc.yaml',
                '.stylelintrc.yml',
                '.stylelintrc.js',
                '.stylelintrc.cjs',
                '.stylelintignore',
                '.stylelintcache',
            ],
            light: true,
        },
        { name: 'code-climate', fileNames: ['.codeclimate.yml'], light: true },
        {
            name: 'prettier',
            fileNames: [
                '.prettierrc',
                'prettier.config.js',
                'prettier.config.cjs',
                '.prettierrc.js',
                '.prettierrc.cjs',
                '.prettierrc.json',
                '.prettierrc.json5',
                '.prettierrc.yaml',
                '.prettierrc.yml',
                '.prettierignore',
                '.prettierrc.toml',
                'prettier.config.mjs',
                '.prettierrc.mjs',
            ],
        },
        {
            name: 'renovate',
            fileNames: [
                '.renovaterc',
                '.renovaterc.json',
                'renovate-config.json',
                'renovate.json',
                'renovate.json5',
            ],
        },
        { name: 'apollo', fileNames: ['apollo.config.js'] },
        { name: 'nodemon', fileNames: ['nodemon.json', 'nodemon-debug.json'] },
        {
            name: 'ngrx-reducer',
            fileExtensions: ['reducer.ts', 'rootReducer.ts'],
            enabledFor: [IconPack.Ngrx],
        },
        {
            name: 'ngrx-state',
            fileExtensions: ['state.ts'],
            enabledFor: [IconPack.Ngrx],
        },
        {
            name: 'ngrx-actions',
            fileExtensions: ['actions.ts'],
            enabledFor: [IconPack.Ngrx],
        },
        {
            name: 'ngrx-effects',
            fileExtensions: ['effects.ts'],
            enabledFor: [IconPack.Ngrx],
        },
        {
            name: 'ngrx-entity',
            fileNames: ['.entity'],
            enabledFor: [IconPack.Ngrx],
        },
        {
            name: 'ngrx-selectors',
            fileExtensions: ['selectors.ts'],
            enabledFor: [IconPack.Ngrx],
        },
        { name: 'webhint', fileNames: ['.hintrc'] },
        {
            name: 'browserlist',
            fileNames: ['browserslist', '.browserslistrc'],
            light: true,
        },
        { name: 'crystal', fileExtensions: ['cr', 'ecr'], light: true },
        { name: 'snyk', fileNames: ['.snyk'] },
        {
            name: 'drone',
            fileExtensions: ['drone.yml'],
            fileNames: ['.drone.yml'],
            light: true,
        },
        { name: 'cuda', fileExtensions: ['cu', 'cuh'] },
        { name: 'log', fileExtensions: ['log'] },
        { name: 'dotjs', fileExtensions: ['def', 'dot', 'jst'] },
        { name: 'ejs', fileExtensions: ['ejs'] },
        { name: 'sequelize', fileNames: ['.sequelizerc'] },
        {
            name: 'gatsby',
            fileNames: [
                'gatsby-config.js',
                'gatsby-config.mjs',
                'gatsby-config.ts',
                'gatsby-node.js',
                'gatsby-node.mjs',
                'gatsby-node.ts',
                'gatsby-browser.js',
                'gatsby-browser.tsx',
                'gatsby-ssr.js',
                'gatsby-ssr.tsx',
            ],
        },
        {
            name: 'wakatime',
            fileNames: ['.wakatime-project'],
            fileExtensions: ['.wakatime-project'],
            light: true,
        },
        { name: 'circleci', fileNames: ['circle.yml'], light: true },
        { name: 'cloudfoundry', fileNames: ['.cfignore'] },
        {
            name: 'grunt',
            fileNames: [
                'gruntfile.js',
                'gruntfile.ts',
                'gruntfile.coffee',
                'gruntfile.babel.js',
                'gruntfile.babel.ts',
                'gruntfile.babel.coffee',
            ],
        },
        {
            name: 'jest',
            fileNames: [
                'jest.config.js',
                'jest.config.cjs',
                'jest.config.mjs',
                'jest.config.ts',
                'jest.config.cts',
                'jest.config.mts',
                'jest.config.json',
                'jest.e2e.config.js',
                'jest.e2e.config.cjs',
                'jest.e2e.config.mjs',
                'jest.e2e.config.ts',
                'jest.e2e.config.cts',
                'jest.e2e.config.mts',
                'jest.e2e.config.json',
                'jest.e2e.json',
                'jest-unit.config.js',
                'jest-e2e.config.js',
                'jest-e2e.config.cjs',
                'jest-e2e.config.mjs',
                'jest-e2e.config.ts',
                'jest-e2e.config.cts',
                'jest-e2e.config.mts',
                'jest-e2e.config.json',
                'jest-e2e.json',
                'jest-github-actions-reporter.js',
                'jest.setup.js',
                'jest.setup.ts',
                'jest.json',
                '.jestrc',
                '.jestrc.js',
                '.jestrc.json',
                'jest.teardown.js',
                'jest-preset.json',
                'jest-preset.js',
                'jest-preset.cjs',
                'jest-preset.mjs',
            ],
        },
        { name: 'processing', fileExtensions: ['pde'] },
        {
            name: 'storybook',
            fileExtensions: [
                'stories.js',
                'stories.jsx',
                'stories.mdx',
                'story.js',
                'story.jsx',
                'stories.ts',
                'stories.tsx',
                'story.ts',
                'story.tsx',
                'stories.svelte',
                'story.mdx',
            ],
        },
        { name: 'wepy', fileExtensions: ['wpy'] },
        { name: 'fastlane', fileNames: ['fastfile', 'appfile'] },
        { name: 'hcl', fileExtensions: ['hcl'], light: true },
        { name: 'helm', fileNames: ['.helmignore'] },
        { name: 'san', fileExtensions: ['san'] },
        { name: 'wallaby', fileNames: ['wallaby.js', 'wallaby.conf.js'] },
        { name: 'django', fileExtensions: ['djt'] },
        { name: 'stencil', fileNames: ['stencil.config.js', 'stencil.config.ts'] },
        { name: 'red', fileExtensions: ['red'] },
        {
            name: 'makefile',
            fileExtensions: ['mk'],
            fileNames: ['makefile', 'gnumakefile', 'kbuild'],
        },
        { name: 'foxpro', fileExtensions: ['fxp', 'prg'] },
        { name: 'i18n', fileExtensions: ['pot', 'po', 'mo', 'lang'] },
        { name: 'webassembly', fileExtensions: ['wat', 'wasm'] },
        {
            name: 'semantic-release',
            light: true,
            fileNames: [
                '.releaserc',
                '.releaserc.yaml',
                '.releaserc.yml',
                '.releaserc.json',
                '.releaserc.js',
                '.releaserc.cjs',
                'release.config.js',
                'release.config.cjs',
            ],
        },
        {
            name: 'bitbucket',
            fileNames: ['bitbucket-pipelines.yaml', 'bitbucket-pipelines.yml'],
        },
        { name: 'jupyter', fileExtensions: ['ipynb'] },
        { name: 'd', fileExtensions: ['d'] },
        { name: 'mdx', fileExtensions: ['mdx'] },
        { name: 'mdsvex', fileExtensions: ['svx'] },
        { name: 'ballerina', fileExtensions: ['bal', 'balx'] },
        { name: 'racket', fileExtensions: ['rkt'] },
        {
            name: 'bazel',
            fileExtensions: ['bzl', 'bazel'],
            fileNames: ['.bazelignore', '.bazelrc', '.bazelversion'],
        },
        { name: 'mint', fileExtensions: ['mint'] },
        { name: 'velocity', fileExtensions: ['vm', 'fhtml', 'vtl'] },
        { name: 'godot', fileExtensions: ['gd'] },
        {
            name: 'godot-assets',
            fileExtensions: [
                'godot',
                'tres',
                'tscn',
                'gdns',
                'gdnlib',
                'gdshader',
                'gdshaderinc',
                'gdextension',
            ],
            fileNames: ['.gdignore', '._sc_', '_sc_'],
        },
        {
            name: 'azure-pipelines',
            fileNames: ['azure-pipelines.yml', 'azure-pipelines.yaml'],
            fileExtensions: ['azure-pipelines.yml', 'azure-pipelines.yaml'],
        },
        { name: 'azure', fileExtensions: ['azcli'] },
        {
            name: 'vagrant',
            fileNames: ['vagrantfile'],
            fileExtensions: ['vagrantfile'],
        },
        { name: 'prisma', fileNames: ['prisma.yml'], fileExtensions: ['prisma'] },
        { name: 'razor', fileExtensions: ['cshtml', 'vbhtml'] },
        { name: 'abc', fileExtensions: ['abc'] },
        { name: 'asciidoc', fileExtensions: ['ad', 'adoc', 'asciidoc'] },
        { name: 'istanbul', fileNames: ['.nycrc', '.nycrc.json'] },
        { name: 'edge', fileExtensions: ['edge'] },
        { name: 'scheme', fileExtensions: ['ss', 'scm'] },
        { name: 'lisp', fileExtensions: ['lisp', 'lsp', 'cl', 'fast'] },
        {
            name: 'tailwindcss',
            fileNames: [
                'tailwind.js',
                'tailwind.ts',
                'tailwind.config.js',
                'tailwind.config.cjs',
                'tailwind.config.ts',
                'tailwind.config.cts',
            ],
        },
        {
            name: '3d',
            fileExtensions: [
                'stl',
                'stp',
                'obj',
                'ac',
                'blend',
                'fbx',
                'mesh',
                'mqo',
                'pmd',
                'pmx',
                'skp',
                'vac',
                'vdp',
                'vox',
            ],
        },
        { name: 'buildkite', fileNames: ['buildkite.yml', 'buildkite.yaml'] },
        {
            name: 'netlify',
            fileNames: [
                'netlify.json',
                'netlify.yml',
                'netlify.yaml',
                'netlify.toml',
            ],
            light: true,
        },
        { name: 'svg', fileExtensions: ['svg'] },
        {
            name: 'svelte',
            fileExtensions: ['svelte'],
            fileNames: ['svelte.config.js', 'svelte.config.cjs'],
        },
        {
            name: 'vim',
            fileExtensions: ['vimrc', 'gvimrc', 'exrc', 'vim', 'viminfo'],
        },
        {
            name: 'nest',
            fileNames: [
                'nest-cli.json',
                '.nest-cli.json',
                'nestconfig.json',
                '.nestconfig.json',
            ],
        },
        {
            name: 'nest-controller',
            fileExtensions: ['controller.ts', 'controller.js'],
            enabledFor: [IconPack.Nest],
        },
        {
            name: 'nest-middleware',
            fileExtensions: ['middleware.ts', 'middleware.js'],
            enabledFor: [IconPack.Nest],
        },
        {
            name: 'nest-module',
            fileExtensions: ['module.ts', 'module.js'],
            enabledFor: [IconPack.Nest],
        },
        {
            name: 'nest-service',
            fileExtensions: ['service.ts', 'service.js'],
            enabledFor: [IconPack.Nest],
        },
        {
            name: 'nest-decorator',
            fileExtensions: ['decorator.ts', 'decorator.js'],
            enabledFor: [IconPack.Nest],
        },
        {
            name: 'nest-pipe',
            fileExtensions: ['pipe.ts', 'pipe.js'],
            enabledFor: [IconPack.Nest],
        },
        {
            name: 'nest-filter',
            fileExtensions: ['filter.ts', 'filter.js'],
            enabledFor: [IconPack.Nest],
        },
        {
            name: 'nest-gateway',
            fileExtensions: ['gateway.ts', 'gateway.js'],
            enabledFor: [IconPack.Nest],
        },
        {
            name: 'nest-guard',
            fileExtensions: ['guard.ts', 'guard.js'],
            enabledFor: [IconPack.Nest],
        },
        {
            name: 'nest-resolver',
            fileExtensions: ['resolver.ts', 'resolver.js'],
            enabledFor: [IconPack.Nest],
        },
        { name: 'moonscript', fileExtensions: ['moon'] },
        { name: 'percy', fileNames: ['.percy.yml'] },
        { name: 'gitpod', fileNames: ['.gitpod.yml'] },
        { name: 'advpl_prw', fileExtensions: ['prw', 'prx'] },
        { name: 'advpl_ptm', fileExtensions: ['ptm'] },
        { name: 'advpl_tlpp', fileExtensions: ['tlpp'] },
        { name: 'advpl_include', fileExtensions: ['ch'] },
        { name: 'codeowners', fileNames: ['codeowners'] },
        { name: 'gcp', fileNames: ['.gcloudignore'] },
        { name: 'disc', fileExtensions: ['iso'] },
        {
            name: 'fortran',
            fileExtensions: ['f', 'f77', 'f90', 'f95', 'f03', 'f08'],
        },
        { name: 'tcl', fileExtensions: ['tcl'] },
        { name: 'liquid', fileExtensions: ['liquid'] },
        { name: 'prolog', fileExtensions: ['p', 'pro', 'pl'] },
        {
            name: 'husky',
            fileNames: [
                '.huskyrc',
                'husky.config.js',
                '.huskyrc.json',
                '.huskyrc.js',
                '.huskyrc.yaml',
                '.huskyrc.yml',
            ],
        },
        { name: 'coconut', fileExtensions: ['coco'] },
        { name: 'tilt', fileNames: ['tiltfile'] },
        {
            name: 'capacitor',
            fileNames: ['capacitor.config.json', 'capacitor.config.ts'],
        },
        { name: 'sketch', fileExtensions: ['sketch'] },
        { name: 'pawn', fileExtensions: ['pwn', 'amx'] },
        { name: 'adonis', fileNames: ['.adonisrc.json', 'ace'] },
        { name: 'forth', fileExtensions: ['4th', 'fth', 'frt'] },
        {
            name: 'uml',
            fileExtensions: ['iuml', 'pu', 'puml', 'plantuml', 'wsd'],
            light: true,
        },
        {
            name: 'meson',
            fileNames: ['meson.build', 'meson_options.txt'],
            fileExtensions: ['wrap'],
        },
        {
            name: 'commitlint',
            fileNames: [
                '.commitlintrc',
                '.commitlintrc.js',
                '.commitlintrc.cjs',
                '.commitlintrc.ts',
                '.commitlintrc.cts',
                '.commitlintrc.json',
                '.commitlintrc.yaml',
                '.commitlintrc.yml',
                '.commitlint.yaml',
                '.commitlint.yml',
                'commitlint.config.js',
                'commitlint.config.cjs',
                'commitlint.config.ts',
                'commitlint.config.cts',
            ],
        },
        { name: 'buck', fileNames: ['.buckconfig'] },
        { name: 'dhall', fileExtensions: ['dhall', 'dhallb'] },
        {
            name: 'sml',
            fileExtensions: [
                'sml',
                'mlton',
                'mlb',
                'sig',
                'fun',
                'cm',
                'lex',
                'use',
                'grm',
            ],
        },
        { name: 'nrwl', fileNames: ['nx.json', '.nxignore'] },
        { name: 'opam', fileExtensions: ['opam'] },
        {
            name: 'dune',
            fileNames: [
                'dune',
                'dune-project',
                'dune-workspace',
                'dune-workspace.dev',
            ],
        },
        { name: 'imba', fileExtensions: ['imba'] },
        { name: 'drawio', fileExtensions: ['drawio', 'dio'] },
        { name: 'pascal', fileExtensions: ['pas'] },
        { name: 'shaderlab', fileExtensions: ['unity'] },
        {
            name: 'roadmap',
            fileNames: [
                'roadmap.md',
                'roadmap.txt',
                'timeline.md',
                'timeline.txt',
                'milestones.md',
                'milestones.txt',
            ],
        },
        {
            name: 'sas',
            fileExtensions: ['sas', 'sas7bdat', 'sashdat', 'astore', 'ast', 'sast'],
        },
        {
            name: 'nuget',
            fileNames: ['nuget.config', '.nuspec', 'nuget.exe'],
            fileExtensions: ['nupkg'],
        },
        { name: 'command', fileExtensions: ['command'] },
        {
            name: 'stryker',
            fileNames: [
                'stryker.conf.json',
                'stryker.conf.js',
                'stryker.conf.cjs',
                'stryker.conf.mjs',
                '.stryker.conf.json',
                '.stryker.conf.js',
                '.stryker.conf.cjs',
                '.stryker.conf.mjs',
            ],
        },
        { name: 'denizenscript', fileExtensions: ['dsc'] },
        {
            name: 'modernizr',
            fileNames: ['.modernizrrc', '.modernizrrc.js', '.modernizrrc.json'],
        },
        { name: 'slug', fileNames: ['.slugignore'] },
        { name: 'search', fileExtensions: ['code-search'] },
        {
            name: 'stitches',
            fileNames: ['stitches.config.js', 'stitches.config.ts'],
            light: true,
        },
        {
            name: 'nginx',
            fileNames: ['nginx.conf'],
            fileExtensions: ['nginx', 'nginxconf', 'nginxconfig'],
        },
        {
            name: 'minecraft',
            fileExtensions: [
                'mcfunction',
                'mcmeta',
                'mcr',
                'mca',
                'mcgame',
                'mclevel',
                'mcworld',
                'mine',
                'mus',
                'mcstructure',
                'mcpack',
                'mcaddon',
                'mctemplate',
                'mcproject',
            ],
            fileNames: ['.mcattributes', '.mcdefinitions', '.mcignore'],
        },
        { name: 'replit', fileNames: ['.replit'] },
        { name: 'rescript', fileExtensions: ['res'] },
        { name: 'rescript-interface', fileExtensions: ['resi'] },
        {
            name: 'snowpack',
            fileNames: [
                'snowpack.config.js',
                'snowpack.config.cjs',
                'snowpack.config.mjs',
                'snowpack.config.ts',
                'snowpack.config.cts',
                'snowpack.config.mts',
                'snowpack.deps.json',
                'snowpack.config.json',
            ],
            light: true,
        },
        { name: 'brainfuck', fileExtensions: ['b', 'bf'] },
        { name: 'bicep', fileExtensions: ['bicep'] },
        { name: 'cobol', fileExtensions: ['cob', 'cbl'] },
        { name: 'grain', fileExtensions: ['gr'] },
        { name: 'lolcode', fileExtensions: ['lol'] },
        { name: 'idris', fileExtensions: ['idr', 'ibc'] },
        { name: 'quasar', fileNames: ['quasar.conf.js', 'quasar.config.js'] },
        { name: 'dependabot', fileNames: ['dependabot.yml', 'dependabot.yaml'] },
        { name: 'pipeline', fileExtensions: ['pipeline'] },
        {
            name: 'vite',
            fileNames: [
                'vite.config.js',
                'vite.config.mjs',
                'vite.config.cjs',
                'vite.config.ts',
                'vite.config.cts',
                'vite.config.mts',
            ],
        },
        {
            name: 'vitest',
            fileNames: [
                'vitest.config.ts',
                'vitest.config.mts',
                'vitest.config.cts',
                'vitest.config.js',
                'vitest.config.mjs',
                'vitest.config.cjs',
            ],
        },
        { name: 'opa', fileExtensions: ['rego'] },
        { name: 'lerna', fileNames: ['lerna.json'] },
        {
            name: 'windicss',
            fileNames: [
                'windi.config.js',
                'windi.config.cjs',
                'windi.config.ts',
                'windi.config.cts',
                'windi.config.json',
            ],
            fileExtensions: ['windi'],
        },
        {
            name: 'textlint',
            fileNames: ['.textlintrc'],
        },
        { name: 'scala', fileExtensions: ['scala', 'sc'] },
        { name: 'lilypond', fileExtensions: ['ly'] },
        { name: 'vlang', fileExtensions: ['v'], fileNames: ['vpkg.json', 'v.mod'] },
        { name: 'chess', fileExtensions: ['pgn', 'fen'], light: true },
        { name: 'gemini', fileExtensions: ['gmi', 'gemini'] },
        { name: 'sentry', fileNames: ['.sentryclirc'] },
        {
            name: 'phpunit',
            fileNames: [
                '.phpunit.result.cache',
                '.phpunit-watcher.yml',
                'phpunit.xml',
                'phpunit.xml.dist',
                'phpunit-watcher.yml',
                'phpunit-watcher.yml.dist',
            ],
        },
        {
            name: 'php-cs-fixer',
            fileNames: [
                '.php_cs',
                '.php_cs.dist',
                '.php_cs.php',
                '.php_cs.dist.php',
                '.php-cs-fixer.php',
                '.php-cs-fixer.dist.php',
            ],
        },
        { name: 'robots', fileNames: ['robots.txt'] },
        {
            name: 'tsconfig',
            fileNames: [
                'tsconfig.json',
                'tsconfig.app.json',
                'tsconfig.editor.json',
                'tsconfig.spec.json',
                'tsconfig.base.json',
                'tsconfig.build.json',
                'tsconfig.eslint.json',
                'tsconfig.lib.json',
                'tsconfig.lib.prod.json',
                'tsconfig.node.json',
                'tsconfig.test.json',
                'tsconfig.e2e.json',
                'tsconfig.web.json',
                'tsconfig.webworker.json',
                'tsconfig.worker.json',
                'tsconfig.config.json',
                'tsconfig.vitest.json',
                'tsconfig.cjs.json',
                'tsconfig.esm.json',
                'tsconfig.mjs.json',
                'tsconfig.doc.json',
                'tsconfig.paths.json',
                'tsconfig.main.json',
                'tsconfig.renderer.json',
            ],
            fileExtensions: ['tsconfig.json'],
        },
        {
            name: 'tauri',
            fileNames: [
                'tauri.conf.json',
                'tauri.config.json',
                'tauri.linux.conf.json',
                'tauri.windows.conf.json',
                'tauri.macos.conf.json',
            ],
            fileExtensions: ['tauri'],
        },
        {
            name: 'jsconfig',
            fileNames: ['jsconfig.json'],
            fileExtensions: ['jsconfig.json'],
        },
        {
            name: 'maven',
            fileNames: ['maven.config', 'jvm.config', 'pom.xml'],
        },
        { name: 'ada', fileExtensions: ['ada', 'adb', 'ads', 'ali'] },
        {
            name: 'serverless',
            fileNames: [
                'serverless.yml',
                'serverless.yaml',
                'serverless.json',
                'serverless.js',
                'serverless.ts',
            ],
        },
        {
            name: 'supabase',
            fileNames: ['supabase.js', 'supabase.py'],
        },
        {
            name: 'ember',
            fileNames: ['.ember-cli', '.ember-cli.js', 'ember-cli-builds.js'],
        },
        {
            name: 'horusec',
            fileNames: ['horusec-config.json'],
            fileExtensions: ['horusec-config.json'],
        },
        { name: 'poetry', fileNames: ['poetry.lock'] },
        { name: 'coala', fileExtensions: ['coarc', 'coafile'] },
        { name: 'parcel', fileNames: ['.parcelrc'] },
        {
            name: 'dinophp',
            fileExtensions: ['bubble', 'html.bubble', 'php.bubble'],
        },
        { name: 'teal', fileExtensions: ['tl'] },
        { name: 'template', fileExtensions: ['template'] },
        { name: 'astyle', fileNames: ['.astylerc'] },
        {
            name: 'shader',
            fileExtensions: [
                'glsl',
                'vert',
                'tesc',
                'tese',
                'geom',
                'frag',
                'comp',
                'vert.glsl',
                'tesc.glsl',
                'tese.glsl',
                'geom.glsl',
                'frag.glsl',
                'comp.glsl',
                'vertex.glsl',
                'geometry.glsl',
                'fragment.glsl',
                'compute.glsl',
                'ts.glsl',
                'gs.glsl',
                'vs.glsl',
                'fs.glsl',
                'shader',
                'vertexshader',
                'fragmentshader',
                'geometryshader',
                'computeshader',
                'hlsl',
                'pixel.hlsl',
                'geometry.hlsl',
                'compute.hlsl',
                'tessellation.hlsl',
                'px.hlsl',
                'geom.hlsl',
                'comp.hlsl',
                'tess.hlsl',
                'wgsl',
            ],
        },
        {
            name: 'lighthouse',
            fileNames: [
                '.lighthouserc.js',
                'lighthouserc.js',
                '.lighthouserc.json',
                'lighthouserc.json',
                '.lighthouserc.yml',
                'lighthouserc.yml',
                '.lighthouserc.yaml',
                'lighthouserc.yaml',
            ],
        },
        {
            name: 'svgr',
            fileNames: [
                '.svgrrc',
                'svgr.config.js',
                '.svgrrc.js',
                '.svgrrc.yaml',
                '.svgrrc.yml',
                '.svgrrc.json',
            ],
        },
        { name: 'rome', fileNames: ['rome.json'] },
        {
            name: 'cypress',
            fileNames: [
                'cypress.json',
                'cypress.env.json',
                'cypress.config.ts',
                'cypress.config.js',
                'cypress.config.cjs',
                'cypress.config.mjs',
            ],
        },
        { name: 'siyuan', fileExtensions: ['sy'] },
        { name: 'ndst', fileExtensions: ['ndst.yml', 'ndst.yaml', 'ndst.json'] },
        {
            name: 'plop',
            fileNames: ['plopfile.js', 'plopfile.cjs', 'plopfile.mjs', 'plopfile.ts'],
        },
        { name: 'tobi', fileExtensions: ['tobi'] },
        { name: 'tobimake', fileNames: ['.tobimake'] },
        { name: 'gleam', fileNames: ['gleam.toml'], fileExtensions: ['gleam'] },
        {
            name: 'pnpm',
            light: true,
            fileNames: ['pnpm-lock.yaml', 'pnpm-workspace.yaml', '.pnpmfile.cjs'],
        },
        {
            name: 'gridsome',
            fileNames: ['gridsome.config.js', 'gridsome.server.js'],
        },
        {
            name: 'steadybit',
            fileExtensions: ['steadybit.yml', 'steadybit.yaml'],
            fileNames: [
                '.steadybit.yml',
                'steadybit.yml',
                '.steadybit.yaml',
                'steadybit.yaml',
            ],
        },
        { name: 'tree', fileExtensions: ['tree'] },
        {
            name: 'cadence',
            fileExtensions: ['cdc'],
        },
        { name: 'caddy', fileNames: ['Caddyfile'] },
        { name: 'bun', fileNames: ['bun.lockb'], light: true },
        { name: 'antlr', fileExtensions: ['g4'] },
        { name: 'stylable', fileExtensions: ['st.css'] },
        { name: 'pinejs', fileExtensions: ['pine'] },
        {
            name: 'nano-staged',
            light: true,
            fileNames: [
                `.nano-staged.js`,
                `nano-staged.js`,
                `.nano-staged.cjs`,
                `nano-staged.cjs`,
                `.nano-staged.mjs`,
                `nano-staged.mjs`,
                `.nano-staged.json`,
                `nano-staged.json`,
                `.nanostagedrc`,
            ],
        },
        {
            name: 'craco',
            fileNames: [
                'craco.config.ts',
                'craco.config.js',
                'craco.config.cjs',
                '.cracorc.ts',
                '.cracorc.js',
                '.cracorc',
            ],
        },
        {
            name: 'gamemaker',
            fileExtensions: ['gml', 'yy', 'yyp', 'yyz'],
        },
        { name: 'tldraw', fileExtensions: ['tldr'], light: true },
        {
            name: 'mercurial',
            fileNames: [
                '.hg',
                '.hgignore',
                '.hgflow',
                '.hgrc',
                'hgrc',
                'mercurial.ini',
            ],
        },
        {
            name: 'deno',
            fileNames: ['deno.json', 'deno.jsonc', 'deno.lock'],
            light: true,
        },
        {
            name: 'plastic',
            fileNames: [
                'plastic.branchexplorer',
                'plastic.selector',
                'plastic.wktree',
                'plastic.workspace',
                'plastic.workspaces',
            ],
        },
        { name: 'typst', fileExtensions: ['typ'] },
        {
            name: 'unocss',
            fileNames: [
                'uno.config.js',
                'uno.config.mjs',
                'uno.config.ts',
                'uno.config.mts',
                'unocss.config.js',
                'unocss.config.mjs',
                'unocss.config.ts',
                'unocss.config.mts',
            ],
        },
        { name: 'ifanr-cloud', fileNames: ['.mincloudrc'] },
        { name: 'qwik', fileExtensions: ['tsx'], enabledFor: [IconPack.Qwik] },
        { name: 'mermaid', fileExtensions: ['mmd', 'mermaid'] },
        {
            name: 'mojo',
            fileExtensions: ['mojo', '🔥'],
        },
        {
            name: 'werf',
            fileNames: [
                'werf.yaml',
                'werf.yml',
                'werf-giterminism.yaml',
                'werf-giterminism.yml',
            ],
        },
    ],
}

/**
 * Defines folder icons
 */
const folderIcons = [
    {
        name: 'specific',
        defaultIcon: { name: 'folder' },
        rootFolder: { name: 'folder-root' },
        icons: [
            {
                name: 'folder-src',
                folderNames: ['src', 'srcs', 'source', 'sources', 'code'],
            },
            {
                name: 'folder-dist',
                folderNames: ['dist', 'out', 'build', 'release', 'bin'],
            },
            {
                name: 'folder-css',
                folderNames: ['css', 'stylesheet', 'stylesheets', 'style', 'styles'],
            },
            { name: 'folder-sass', folderNames: ['sass', '_sass', 'scss', '_scss'] },
            {
                name: 'folder-images',
                folderNames: [
                    '_images',
                    '_image',
                    '_imgs',
                    '_img',
                    'images',
                    'image',
                    'imgs',
                    'img',
                    'icons',
                    'icon',
                    'icos',
                    'ico',
                    'figures',
                    'figure',
                    'figs',
                    'fig',
                    'screenshot',
                    'screenshots',
                    'screengrab',
                    'screengrabs',
                    'pic',
                    'pics',
                    'picture',
                    'pictures',
                ],
            },
            { name: 'folder-scripts', folderNames: ['script', 'scripts'] },
            { name: 'folder-node', folderNames: ['node_modules'] },
            {
                name: 'folder-javascript',
                folderNames: ['js', 'javascript', 'javascripts'],
            },
            { name: 'folder-json', folderNames: ['json', 'jsons'] },
            { name: 'folder-font', folderNames: ['font', 'fonts'] },
            { name: 'folder-bower', folderNames: ['bower_components'] },
            {
                name: 'folder-test',
                folderNames: [
                    'test',
                    'tests',
                    'testing',
                    '__tests__',
                    '__snapshots__',
                    '__mocks__',
                    '__fixtures__',
                    '__test__',
                    'spec',
                    'specs',
                ],
            },
            {
                name: 'folder-jinja',
                folderNames: ['jinja', 'jinja2', 'j2'],
                light: true,
            },
            { name: 'folder-markdown', folderNames: ['markdown', 'md'] },
            { name: 'folder-php', folderNames: ['php'] },
            { name: 'folder-phpmailer', folderNames: ['phpmailer'] },
            { name: 'folder-sublime', folderNames: ['sublime'] },
            {
                name: 'folder-docs',
                folderNames: [
                    '_post',
                    '_posts',
                    'doc',
                    'docs',
                    'document',
                    'documents',
                    'documentation',
                    'post',
                    'posts',
                    'article',
                    'articles',
                ],
            },
            {
                name: 'folder-git',
                folderNames: [
                    '.git',
                    'patches',
                    'githooks',
                    '.githooks',
                    'submodules',
                    '.submodules',
                ],
            },
            { name: 'folder-github', folderNames: ['.github', 'github'] },
            { name: 'folder-gitlab', folderNames: ['.gitlab'] },
            { name: 'folder-vscode', folderNames: ['.vscode', '.vscode-test'] },
            {
                name: 'folder-views',
                folderNames: [
                    'view',
                    'views',
                    'screen',
                    'screens',
                    'page',
                    'pages',
                    'public_html',
                    'html',
                ],
            },
            { name: 'folder-vue', folderNames: ['vue'] },
            { name: 'folder-vuepress', folderNames: ['.vuepress'] },
            { name: 'folder-expo', folderNames: ['.expo', '.expo-shared'] },
            {
                name: 'folder-config',
                folderNames: [
                    'cfg',
                    'cfgs',
                    'conf',
                    'confs',
                    'config',
                    'configs',
                    'configuration',
                    'configurations',
                    'setting',
                    '.setting',
                    'settings',
                    '.settings',
                    'META-INF',
                ],
            },
            {
                name: 'folder-i18n',
                folderNames: [
                    'i18n',
                    'internationalization',
                    'lang',
                    'langs',
                    'language',
                    'languages',
                    'locale',
                    'locales',
                    'l10n',
                    'localization',
                    'translation',
                    'translate',
                    'translations',
                    '.tx',
                ],
            },
            {
                name: 'folder-components',
                folderNames: ['components', 'widget', 'widgets', 'fragments'],
            },
            {
                name: 'folder-verdaccio',
                folderNames: ['.verdaccio', 'verdaccio'],
            },
            { name: 'folder-aurelia', folderNames: ['aurelia_project'] },
            {
                name: 'folder-resource',
                folderNames: [
                    'resource',
                    'resources',
                    'res',
                    'asset',
                    'assets',
                    'static',
                    'report',
                    'reports',
                ],
            },
            {
                name: 'folder-lib',
                folderNames: [
                    'lib',
                    'libs',
                    'library',
                    'libraries',
                    'vendor',
                    'vendors',
                    'third-party',
                ],
            },
            {
                name: 'folder-theme',
                folderNames: [
                    'themes',
                    'theme',
                    'color',
                    'colors',
                    'design',
                    'designs',
                ],
            },
            { name: 'folder-webpack', folderNames: ['webpack', '.webpack'] },
            { name: 'folder-global', folderNames: ['global'] },
            {
                name: 'folder-public',
                folderNames: [
                    '_site',
                    'public',
                    'www',
                    'wwwroot',
                    'web',
                    'website',
                    'site',
                    'browser',
                    'browsers',
                ],
            },
            {
                name: 'folder-include',
                folderNames: [
                    'include',
                    'includes',
                    '_includes',
                    'inc',
                    'partials',
                    '_partials',
                ],
            },
            {
                name: 'folder-docker',
                folderNames: ['docker', 'dockerfiles', '.docker'],
            },
            {
                name: 'folder-ngrx-effects',
                folderNames: ['effects'],
                enabledFor: [IconPack.Ngrx],
            },
            {
                name: 'folder-ngrx-store',
                folderNames: ['store'],
                enabledFor: [IconPack.Ngrx],
            },
            {
                name: 'folder-ngrx-state',
                folderNames: ['states', 'state'],
                enabledFor: [IconPack.Ngrx],
            },
            {
                name: 'folder-ngrx-reducer',
                folderNames: ['reducers', 'reducer'],
                enabledFor: [IconPack.Ngrx],
            },
            {
                name: 'folder-ngrx-actions',
                folderNames: ['actions'],
                enabledFor: [IconPack.Ngrx],
            },
            {
                name: 'folder-ngrx-entities',
                folderNames: ['entities'],
                enabledFor: [IconPack.Ngrx],
            },
            {
                name: 'folder-ngrx-selectors',
                folderNames: ['selectors'],
                enabledFor: [IconPack.Ngrx],
            },
            {
                name: 'folder-redux-reducer',
                folderNames: ['reducers', 'reducer'],
                enabledFor: [IconPack.Redux],
            },
            {
                name: 'folder-redux-actions',
                folderNames: ['actions'],
                enabledFor: [IconPack.Redux],
            },
            {
                name: 'folder-redux-selector',
                folderNames: ['selectors', 'selector'],
                enabledFor: [IconPack.Redux],
            },
            {
                name: 'folder-redux-store',
                folderNames: ['store', 'stores'],
                enabledFor: [IconPack.Redux],
            },
            {
                name: 'folder-react-components',
                folderNames: ['components', 'react', 'jsx', 'reactjs'],
                enabledFor: [IconPack.React, IconPack.Redux],
            },
            {
                name: 'folder-database',
                folderNames: ['db', 'database', 'databases', 'sql', 'data', '_data'],
            },
            { name: 'folder-log', folderNames: ['log', 'logs'] },
            { name: 'folder-target', folderNames: ['target'] },
            {
                name: 'folder-temp',
                folderNames: [
                    'temp',
                    '.temp',
                    'tmp',
                    '.tmp',
                    'cached',
                    'cache',
                    '.cache',
                ],
            },
            { name: 'folder-aws', folderNames: ['aws', '.aws'] },
            {
                name: 'folder-audio',
                folderNames: [
                    'aud',
                    'auds',
                    'audio',
                    'audios',
                    'music',
                    'sound',
                    'sounds',
                ],
            },
            {
                name: 'folder-video',
                folderNames: ['vid', 'vids', 'video', 'videos', 'movie', 'movies'],
            },
            {
                name: 'folder-kubernetes',
                folderNames: ['kubernetes', '.kubernetes', 'k8s', '.k8s'],
            },
            { name: 'folder-import', folderNames: ['import', 'imports', 'imported'] },
            { name: 'folder-export', folderNames: ['export', 'exports', 'exported'] },
            { name: 'folder-wakatime', folderNames: ['wakatime'] },
            { name: 'folder-circleci', folderNames: ['.circleci'] },
            {
                name: 'folder-wordpress',
                folderNames: ['.wordpress-org', 'wp-content'],
            },
            { name: 'folder-gradle', folderNames: ['gradle', '.gradle'] },
            {
                name: 'folder-coverage',
                folderNames: [
                    'coverage',
                    '.nyc-output',
                    '.nyc_output',
                    'e2e',
                    'it',
                    'integration-test',
                    'integration-tests',
                    '__integration-test__',
                    '__integration-tests__',
                ],
            },
            {
                name: 'folder-class',
                folderNames: [
                    'class',
                    'classes',
                    'model',
                    'models',
                    'schemas',
                    'schema',
                ],
            },
            {
                name: 'folder-other',
                folderNames: [
                    'other',
                    'others',
                    'misc',
                    'miscellaneous',
                    'extra',
                    'extras',
                    'etc',
                ],
            },
            { name: 'folder-lua', folderNames: ['lua'] },
            {
                name: 'folder-typescript',
                folderNames: ['typescript', 'ts', 'typings', '@types', 'types'],
            },
            { name: 'folder-graphql', folderNames: ['graphql', 'gql'] },
            { name: 'folder-routes', folderNames: ['routes', 'router', 'routers'] },
            { name: 'folder-ci', folderNames: ['.ci', 'ci'] },
            {
                name: 'folder-benchmark',
                folderNames: [
                    'benchmark',
                    'benchmarks',
                    'performance',
                    'measure',
                    'measures',
                    'measurement',
                ],
            },
            {
                name: 'folder-messages',
                folderNames: [
                    'messages',
                    'messaging',
                    'forum',
                    'chat',
                    'chats',
                    'conversation',
                    'conversations',
                ],
            },
            { name: 'folder-less', folderNames: ['less'] },
            {
                name: 'folder-gulp',
                folderNames: [
                    'gulp',
                    'gulp-tasks',
                    'gulpfile.js',
                    'gulpfile.mjs',
                    'gulpfile.ts',
                    'gulpfile.babel.js',
                ],
            },
            {
                name: 'folder-python',
                folderNames: ['python', '__pycache__', '.pytest_cache'],
            },
            {
                name: 'folder-mojo',
                folderNames: ['mojo'],
            },
            { name: 'folder-debug', folderNames: ['debug', 'debugging'] },
            { name: 'folder-fastlane', folderNames: ['fastlane'] },
            {
                name: 'folder-plugin',
                folderNames: [
                    'plugin',
                    'plugins',
                    '_plugins',
                    'extension',
                    'extensions',
                    'addon',
                    'addons',
                    'module',
                    'modules',
                ],
            },
            { name: 'folder-middleware', folderNames: ['middleware', 'middlewares'] },
            {
                name: 'folder-controller',
                folderNames: [
                    'controller',
                    'controllers',
                    'service',
                    'services',
                    'provider',
                    'providers',
                    'handler',
                    'handlers',
                ],
            },
            { name: 'folder-ansible', folderNames: ['ansible'] },
            { name: 'folder-server', folderNames: ['server', 'servers', 'backend'] },
            {
                name: 'folder-client',
                folderNames: ['client', 'clients', 'frontend', 'pwa'],
            },
            { name: 'folder-tasks', folderNames: ['tasks', 'tickets'] },
            { name: 'folder-android', folderNames: ['android'] },
            { name: 'folder-ios', folderNames: ['ios'] },
            { name: 'folder-upload', folderNames: ['uploads', 'upload'] },
            { name: 'folder-download', folderNames: ['downloads', 'download'] },
            {
                name: 'folder-tools',
                folderNames: ['tools', 'toolkit', 'toolkits', 'toolbox', 'toolboxes'],
            },
            { name: 'folder-helper', folderNames: ['helpers', 'helper'] },
            { name: 'folder-serverless', folderNames: ['.serverless', 'serverless'] },
            { name: 'folder-api', folderNames: ['api', 'apis', 'restapi'] },
            { name: 'folder-app', folderNames: ['app', 'apps'] },
            {
                name: 'folder-apollo',
                folderNames: [
                    'apollo',
                    'apollo-client',
                    'apollo-cache',
                    'apollo-config',
                ],
            },
            {
                name: 'folder-archive',
                folderNames: [
                    'arc',
                    'arcs',
                    'archive',
                    'archives',
                    'archival',
                    'bkp',
                    'bkps',
                    'bak',
                    'baks',
                    'backup',
                    'backups',
                    'back-up',
                    'back-ups',
                ],
            },
            { name: 'folder-batch', folderNames: ['batch', 'batchs', 'batches'] },
            { name: 'folder-buildkite', folderNames: ['buildkite', '.buildkite'] },
            { name: 'folder-cluster', folderNames: ['cluster', 'clusters'] },
            {
                name: 'folder-command',
                folderNames: ['command', 'commands', 'cmd', 'cli', 'clis'],
            },
            { name: 'folder-constant', folderNames: ['constant', 'constants'] },
            {
                name: 'folder-container',
                folderNames: ['container', 'containers', '.devcontainer'],
            },
            { name: 'folder-content', folderNames: ['content', 'contents'] },
            { name: 'folder-context', folderNames: ['context', 'contexts'] },
            { name: 'folder-core', folderNames: ['core'] },
            { name: 'folder-delta', folderNames: ['delta', 'deltas', 'changes'] },
            { name: 'folder-dump', folderNames: ['dump', 'dumps'] },
            {
                name: 'folder-examples',
                folderNames: [
                    'demo',
                    'demos',
                    'example',
                    'examples',
                    'sample',
                    'samples',
                    'sample-data',
                ],
            },
            {
                name: 'folder-environment',
                folderNames: [
                    '.env',
                    '.environment',
                    'env',
                    'envs',
                    'environment',
                    'environments',
                    '.venv',
                ],
            },
            {
                name: 'folder-functions',
                folderNames: [
                    'func',
                    'funcs',
                    'function',
                    'functions',
                    'lambda',
                    'lambdas',
                    'logic',
                    'math',
                    'maths',
                    'calc',
                    'calcs',
                    'calculation',
                    'calculations',
                ],
            },
            {
                name: 'folder-generator',
                folderNames: [
                    'generator',
                    'generators',
                    'generated',
                    'cfn-gen',
                    'gen',
                    'gens',
                    'auto',
                ],
            },
            {
                name: 'folder-hook',
                folderNames: ['hook', 'hooks', 'trigger', 'triggers'],
            },
            { name: 'folder-job', folderNames: ['job', 'jobs'] },
            {
                name: 'folder-keys',
                folderNames: ['keys', 'key', 'token', 'tokens', 'jwt'],
            },
            { name: 'folder-layout', folderNames: ['layout', 'layouts', '_layouts'] },
            {
                name: 'folder-mail',
                folderNames: ['mail', 'mails', 'email', 'emails', 'smtp', 'mailers'],
            },
            { name: 'folder-mappings', folderNames: ['mappings', 'mapping'] },
            { name: 'folder-meta', folderNames: ['meta'] },
            { name: 'folder-changesets', folderNames: ['.changesets', '.changeset'] },
            {
                name: 'folder-packages',
                folderNames: ['package', 'packages', 'pkg', 'pkgs'],
            },
            { name: 'folder-shared', folderNames: ['shared', 'common'] },
            {
                name: 'folder-shader',
                folderNames: ['glsl', 'hlsl', 'shader', 'shaders'],
            },
            { name: 'folder-stack', folderNames: ['stack', 'stacks'] },
            { name: 'folder-template', folderNames: ['template', 'templates'] },
            {
                name: 'folder-utils',
                folderNames: ['util', 'utils', 'utility', 'utilities'],
            },
            { name: 'folder-supabase', folderNames: ['supabase', '.supabase'] },
            { name: 'folder-private', folderNames: ['private', '.private'] },
            { name: 'folder-error', folderNames: ['error', 'errors', 'err'] },
            { name: 'folder-event', folderNames: ['event', 'events'] },
            {
                name: 'folder-secure',
                folderNames: [
                    'auth',
                    'authentication',
                    'secure',
                    'security',
                    'cert',
                    'certs',
                    'certificate',
                    'certificates',
                    'ssl',
                ],
            },
            { name: 'folder-custom', folderNames: ['custom', 'customs'] },
            {
                name: 'folder-mock',
                folderNames: [
                    '_draft',
                    '_drafts',
                    'mock',
                    'mocks',
                    'fixture',
                    'fixtures',
                    'draft',
                    'drafts',
                    'concept',
                    'concepts',
                    'sketch',
                    'sketches',
                ],
            },
            {
                name: 'folder-syntax',
                folderNames: ['syntax', 'syntaxes', 'spellcheck'],
            },
            { name: 'folder-vm', folderNames: ['vm', 'vms'] },
            { name: 'folder-stylus', folderNames: ['stylus'] },
            { name: 'folder-flow', folderNames: ['flow-typed'] },
            {
                name: 'folder-rules',
                folderNames: [
                    'rule',
                    'rules',
                    'validation',
                    'validations',
                    'validator',
                    'validators',
                ],
            },
            {
                name: 'folder-review',
                folderNames: ['review', 'reviews', 'revisal', 'revisals', 'reviewed'],
            },
            {
                name: 'folder-animation',
                folderNames: ['anim', 'anims', 'animation', 'animations', 'animated'],
            },
            { name: 'folder-guard', folderNames: ['guard', 'guards'] },
            { name: 'folder-prisma', folderNames: ['prisma'] },
            { name: 'folder-pipe', folderNames: ['pipe', 'pipes'] },
            { name: 'folder-svg', folderNames: ['svg', 'svgs'] },
            {
                name: 'folder-vuex-store',
                folderNames: ['store', 'stores'],
                enabledFor: [IconPack.Vuex],
            },
            {
                name: 'folder-nuxt',
                folderNames: ['nuxt', '.nuxt'],
                enabledFor: [IconPack.Vuex, IconPack.Vue],
            },
            {
                name: 'folder-vue-directives',
                folderNames: ['directives'],
                enabledFor: [IconPack.Vuex, IconPack.Vue],
            },
            {
                name: 'folder-vue',
                folderNames: ['components'],
                enabledFor: [IconPack.Vuex, IconPack.Vue],
            },
            { name: 'folder-terraform', folderNames: ['terraform', '.terraform'] },
            {
                name: 'folder-mobile',
                folderNames: ['mobile', 'mobiles', 'portable', 'portability'],
            },
            { name: 'folder-stencil', folderNames: ['.stencil'] },
            { name: 'folder-firebase', folderNames: ['firebase', '.firebase'] },
            { name: 'folder-svelte', folderNames: ['svelte', '.svelte-kit'] },
            {
                name: 'folder-update',
                folderNames: ['update', 'updates', 'upgrade', 'upgrades'],
            },
            { name: 'folder-intellij', folderNames: ['.idea'], light: true },
            {
                name: 'folder-azure-pipelines',
                folderNames: ['.azure-pipelines', '.azure-pipelines-ci'],
            },
            { name: 'folder-mjml', folderNames: ['mjml'] },
            { name: 'folder-admin', folderNames: ['admin', 'manager', 'moderator'] },
            { name: 'folder-scala', folderNames: ['scala'] },
            {
                name: 'folder-connection',
                folderNames: [
                    'connection',
                    'connections',
                    'integration',
                    'integrations',
                ],
            },
            { name: 'folder-quasar', folderNames: ['.quasar'] },
            { name: 'folder-next', folderNames: ['.next'] },
            { name: 'folder-cobol', folderNames: ['cobol'] },
            { name: 'folder-yarn', folderNames: ['yarn', '.yarn'] },
            { name: 'folder-husky', folderNames: ['husky', '.husky'] },
            {
                name: 'folder-storybook',
                folderNames: ['.storybook', 'storybook', 'stories', '__stories__'],
            },
            { name: 'folder-base', folderNames: ['base', '.base', 'bases'] },
            {
                name: 'folder-cart',
                folderNames: ['cart', 'shopping-cart', 'shopping', 'shop'],
            },
            {
                name: 'folder-home',
                folderNames: ['home', '.home', 'start', '.start'],
            },
            {
                name: 'folder-project',
                folderNames: ['project', 'projects', '.project', '.projects'],
            },
            {
                name: 'folder-interface',
                folderNames: ['interface', 'interfaces'],
            },
            { name: 'folder-netlify', folderNames: ['.netlify'] },
            {
                name: 'folder-contract',
                folderNames: [
                    'pact',
                    'pacts',
                    'contract',
                    '.contract',
                    'contracts',
                    'contract-testing',
                    'contract-test',
                    'contract-tests',
                ],
            },
            {
                name: 'folder-queue',
                folderNames: ['queue', 'queues', 'bull', 'mq'],
            },
            {
                name: 'folder-vercel',
                folderNames: ['vercel', '.vercel', 'now', '.now'],
            },
            {
                name: 'folder-cypress',
                folderNames: ['cypress', '.cypress'],
            },
            {
                name: 'folder-decorators',
                folderNames: ['decorator', 'decorators'],
            },
            {
                name: 'folder-java',
                folderNames: ['java'],
            },
            {
                name: 'folder-resolver',
                folderNames: ['resolver', 'resolvers'],
            },
            {
                name: 'folder-angular',
                folderNames: ['angular', '.angular'],
            },
            {
                name: 'folder-unity',
                folderNames: ['unity'],
            },
            {
                name: 'folder-pdf',
                folderNames: ['pdf', 'pdfs'],
            },
            {
                name: 'folder-proto',
                folderNames: ['protobufs', 'proto'],
            },
            {
                name: 'folder-plastic',
                folderNames: ['plastic', '.plastic'],
            },
            {
                name: 'folder-gamemaker',
                folderNames: ['gamemaker', 'gamemaker2'],
            },
            {
                name: 'folder-mercurial',
                folderNames: ['.hg', 'hghooks', '.hghooks', '.hgext'],
            },
            {
                name: 'folder-godot',
                folderNames: ['godot', '.godot', 'godot-cpp', '.godot-cpp'],
            },
        ],
    },
    {
        name: 'classic',
        defaultIcon: { name: 'folder' },
        rootFolder: { name: 'folder-root' },
    },
    { name: 'none', defaultIcon: { name: '' } },
]

function getFileDict() {
    const fileDict = new Map()
    fileIcons.icons.forEach((icon) => {
        (icon.fileExtensions || []).forEach((ext) => {
            fileDict.set(ext, icon.name)
        });
        (icon.fileNames || []).forEach((name) => {
            fileDict.set(name, icon.name)
        })
    })
    return fileDict
}

function getDirDict() {
    const dirDict = new Map()

    folderIcons[0].icons.forEach((icon) => {
        (icon.folderNames || []).forEach((name) => {
            dirDict.set(name, icon.name)
        });
    });
    return dirDict;
}

function splitFileAndDir() {
    const repoPage = document.querySelector('div[data-hpc]') || document.querySelector('tbody')
    // 没有直接返回
    if (!repoPage) return [false, false]
    const dir = new Map();
    const file = new Map();

    let row = repoPage.querySelectorAll('div[role="row"][class^="Box-row"], tr[id*="folder"] td[colspan] div.react-directory-filename-column')

    if (document.querySelector('div[data-hpc]')) {
        // Only when on the repo homepage
        row.forEach(item => {
            if (item.querySelector('[aria-label="Directory"]')) setMap(item, dir)
            if (item.querySelector('[aria-label="File"]')) setMap(item, file)
        })
    }

    if (document.querySelector('tbody')) {
        row.forEach(item => {
            const last = item.lastElementChild
            const type = last.lastElementChild.innerText
            if (type.includes('File')) setMap(item, file)
            if (type.includes('Directory')) setMap(item, dir)
        })
    }

    return [dir, file]
}

async function handleFileIcons(file, item, fileDict) {
    const key = matchFile(file, fileDict)
    // 后缀名匹配
    if (key !== '') {
        await replaceIcons(fileDict.get(key), item)
        return
    }
    // 文件名匹配
    if (fileDict.has(file)) {
        await replaceIcons(fileDict.get(file), item)
    }
}

function matchFile(file, fileDict) {
    const names = file.split('.')
    let name = names.at(-1), betterName = ''
    for (let i = names.length - 2; i >= 0; i--) {
        if (fileDict.has(name)) {
            betterName = name
        }
        name = names[i] + '.' + name
    }
    return betterName
}

async function handleDirIcons(file, item, dirDict) {
    if (dirDict.has(file)) {
        const name = dirDict.get(file)
        await replaceIcons(name, item)
    }
}

async function replaceIcons(name, item) {
    const url = `https://raw.githubusercontent.com/PKief/vscode-material-icon-theme/main/icons/${name}.svg`

    const svg = item.querySelector('div[role="gridcell"] > svg') || item.querySelector('svg')
    // 如果修改过,则直接返回
    if (!svg) return
    const newNode = document.createElement('img')
    newNode.src = url
    newNode.height = '16'
    svg.replaceWith(newNode)
}

function setMap(item, map) {
    const title = item.querySelector('a[title]')?.title ?? item.querySelector('h3 > div[title]').innerText
    map.set(title.toLowerCase(), item)
}

function collectTasks() {
    const [dir, file] = splitFileAndDir()
    if (dir === false || file === false) return Promise.reject('Not on the repo page')

    const fileDict = getFileDict()
    const dirDict = getDirDict()
    const tasks = []
    for (const [fileName, item] of file) {
        tasks.push(handleFileIcons(fileName, item, fileDict))
    }
    for (const [dirName, item] of dir) {
        tasks.push(handleDirIcons(dirName, item, dirDict))
    }
    return tasks
}

function main() {
    new Promise(
        resolve => setTimeout(resolve, 500)
    ).then(
        () => Promise.allSettled(collectTasks())
    ).catch(
        reason => console.log(reason)
    )
}

let intervalId = setInterval(() => main(), 1000)

main()

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址