Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
128 changes: 128 additions & 0 deletions scripts/generate-test-fixtures.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
/**
* Generates a /test folder with every mapped folder name and file extension
* from the default Material Icon Theme manifest, so you can visually verify
* all icons render correctly when the extension is active on GitHub/GitLab.
*
* Usage: npx tsx scripts/generate-test-fixtures.ts
*/

import { readFileSync, mkdirSync, writeFileSync, existsSync, rmSync } from 'node:fs';
import * as path from 'node:path';

const ROOT = path.resolve(import.meta.dirname, '..');
const TEST_DIR = path.join(ROOT, 'test');
const MANIFEST_PATH = path.join(ROOT, 'public/manifests/default.json');

interface Manifest {
fileExtensions?: Record<string, string>;
fileNames?: Record<string, string>;
folderNames?: Record<string, string>;
folderNamesExpanded?: Record<string, string>;
rootFolderNames?: Record<string, string>;
rootFolderNamesExpanded?: Record<string, string>;
light?: Manifest;
}

// Characters that are invalid or problematic in filenames across platforms
const INVALID_CHARS = /[<>:"|?*\x00-\x1f]/;
const RESERVED_NAMES = new Set([
'con', 'prn', 'aux', 'nul',
'com1', 'com2', 'com3', 'com4', 'com5', 'com6', 'com7', 'com8', 'com9',
'lpt1', 'lpt2', 'lpt3', 'lpt4', 'lpt5', 'lpt6', 'lpt7', 'lpt8', 'lpt9',
]);

function isSafeFilename(name: string): boolean {
if (!name || name.length > 200) return false;
if (INVALID_CHARS.test(name)) return false;
const base = name.replace(/\..+$/, '').toLowerCase();
if (RESERVED_NAMES.has(base)) return false;
return true;
}

function main() {
const manifest: Manifest = JSON.parse(readFileSync(MANIFEST_PATH, 'utf-8'));

// Clean previous test dir
if (existsSync(TEST_DIR)) {
rmSync(TEST_DIR, { recursive: true });
}

// --- Folders ---
const folderNames = new Set<string>();
for (const name of Object.keys(manifest.folderNames ?? {})) folderNames.add(name);
for (const name of Object.keys(manifest.folderNamesExpanded ?? {})) folderNames.add(name);
for (const name of Object.keys(manifest.rootFolderNames ?? {})) folderNames.add(name);
for (const name of Object.keys(manifest.rootFolderNamesExpanded ?? {})) folderNames.add(name);
if (manifest.light) {
for (const name of Object.keys(manifest.light.folderNames ?? {})) folderNames.add(name);
for (const name of Object.keys(manifest.light.folderNamesExpanded ?? {})) folderNames.add(name);
for (const name of Object.keys(manifest.light.rootFolderNames ?? {})) folderNames.add(name);
for (const name of Object.keys(manifest.light.rootFolderNamesExpanded ?? {})) folderNames.add(name);
}

const foldersDir = path.join(TEST_DIR, 'folders');
mkdirSync(foldersDir, { recursive: true });

const sortedFolders = [...folderNames].sort();
let folderCount = 0;
for (const name of sortedFolders) {
if (!isSafeFilename(name)) continue;
const folderPath = path.join(foldersDir, name);
mkdirSync(folderPath, { recursive: true });
// Put a .gitkeep so empty folders are tracked by git
writeFileSync(path.join(folderPath, '.gitkeep'), '');
folderCount++;
}

// --- File names (exact match files like .gitignore, Dockerfile, etc.) ---
const fileNames = new Set<string>();
for (const name of Object.keys(manifest.fileNames ?? {})) fileNames.add(name);
if (manifest.light) {
for (const name of Object.keys(manifest.light.fileNames ?? {})) fileNames.add(name);
}

const fileNamesDir = path.join(TEST_DIR, 'filenames');
mkdirSync(fileNamesDir, { recursive: true });

const sortedFileNames = [...fileNames].sort();
let fileNameCount = 0;
for (const name of sortedFileNames) {
if (!isSafeFilename(name)) continue;
// Some filenames contain path separators (e.g., ".github/dependabot.yml")
if (name.includes('/') || name.includes('\\')) continue;
const filePath = path.join(fileNamesDir, name);
writeFileSync(filePath, '');
fileNameCount++;
}

// --- File extensions ---
const fileExtensions = new Set<string>();
for (const ext of Object.keys(manifest.fileExtensions ?? {})) fileExtensions.add(ext);
if (manifest.light) {
for (const ext of Object.keys(manifest.light.fileExtensions ?? {})) fileExtensions.add(ext);
}

const extensionsDir = path.join(TEST_DIR, 'extensions');
mkdirSync(extensionsDir, { recursive: true });

const sortedExtensions = [...fileExtensions].sort();
let extensionCount = 0;
for (const ext of sortedExtensions) {
if (!ext) continue;
// Some "extensions" are compound (e.g., "spec.ts", "test.js")
// Create as "file.<ext>"
const filename = `file.${ext}`;
if (!isSafeFilename(filename)) continue;
const filePath = path.join(extensionsDir, filename);
writeFileSync(filePath, '');
extensionCount++;
}

console.log(`Generated test fixtures in ${TEST_DIR}:`);
console.log(` Folders: ${folderCount}`);
console.log(` File names: ${fileNameCount}`);
console.log(` File extensions: ${extensionCount}`);
console.log(` Total: ${folderCount + fileNameCount + extensionCount}`);
}

main();
Empty file added test/extensions/file..ncurc.js
Empty file.
Empty file.
Empty file added test/extensions/file..ncurc.yml
Empty file.
Empty file.
Empty file added test/extensions/file.001
Empty file.
Empty file added test/extensions/file.3ds
Empty file.
Empty file added test/extensions/file.3fr
Empty file.
Empty file added test/extensions/file.4th
Empty file.
Empty file added test/extensions/file.60
Empty file.
Empty file added test/extensions/file.7z
Empty file.
Empty file added test/extensions/file.8svx
Empty file.
Empty file.
Empty file added test/extensions/file.a
Empty file.
Empty file added test/extensions/file.a51
Empty file.
Empty file added test/extensions/file.aa
Empty file.
Empty file added test/extensions/file.aac
Empty file.
Empty file added test/extensions/file.aax
Empty file.
Empty file added test/extensions/file.abap
Empty file.
Empty file added test/extensions/file.abc
Empty file.
Empty file added test/extensions/file.ac
Empty file.
Empty file added test/extensions/file.ac3
Empty file.
Empty file added test/extensions/file.accdb
Empty file.
Empty file added test/extensions/file.accde
Empty file.
Empty file added test/extensions/file.acds
Empty file.
Empty file added test/extensions/file.act
Empty file.
Empty file added test/extensions/file.ad
Empty file.
Empty file added test/extensions/file.ada
Empty file.
Empty file added test/extensions/file.adb
Empty file.
Empty file added test/extensions/file.adoc
Empty file.
Empty file added test/extensions/file.adp
Empty file.
Empty file added test/extensions/file.ads
Empty file.
Empty file added test/extensions/file.aea
Empty file.
Empty file added test/extensions/file.afphoto
Empty file.
Empty file added test/extensions/file.agc
Empty file.
Empty file added test/extensions/file.ags
Empty file.
Empty file added test/extensions/file.ahk
Empty file.
Empty file added test/extensions/file.ai
Empty file.
Empty file added test/extensions/file.aif
Empty file.
Empty file added test/extensions/file.aiff
Empty file.
Empty file added test/extensions/file.ait
Empty file.
Empty file added test/extensions/file.alac
Empty file.
Empty file added test/extensions/file.ali
Empty file.
Empty file added test/extensions/file.alloy
Empty file.
Empty file added test/extensions/file.ami
Empty file.
Empty file added test/extensions/file.amr
Empty file.
Empty file added test/extensions/file.amx
Empty file.
Empty file added test/extensions/file.ape
Empty file.
Empty file added test/extensions/file.apfs
Empty file.
Empty file added test/extensions/file.apib
Empty file.
Empty file.
Empty file added test/extensions/file.apk
Empty file.
Empty file.
Empty file added test/extensions/file.apx
Empty file.
Empty file added test/extensions/file.argus
Empty file.
Empty file added test/extensions/file.ari
Empty file.
Empty file added test/extensions/file.arj
Empty file.
Empty file added test/extensions/file.arw
Empty file.
Empty file added test/extensions/file.as
Empty file.
Empty file added test/extensions/file.asc
Empty file.
Empty file added test/extensions/file.asciidoc
Empty file.
Empty file added test/extensions/file.asddls
Empty file.
Empty file added test/extensions/file.ase
Empty file.
Empty file added test/extensions/file.aseprite
Empty file.
Empty file added test/extensions/file.asm
Empty file.
Empty file added test/extensions/file.asp
Empty file.
Empty file added test/extensions/file.ass
Empty file.
Empty file added test/extensions/file.ast
Empty file.
Empty file added test/extensions/file.astore
Empty file.
Empty file added test/extensions/file.astro
Empty file.
Empty file added test/extensions/file.au3
Empty file.
Empty file added test/extensions/file.avi
Empty file.
Empty file added test/extensions/file.avif
Empty file.
Empty file added test/extensions/file.awk
Empty file.
Empty file added test/extensions/file.azcli
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file added test/extensions/file.b
Empty file.
Empty file added test/extensions/file.bak
Empty file.
Empty file added test/extensions/file.bal
Empty file.
Empty file added test/extensions/file.balx
Empty file.
Empty file added test/extensions/file.bash
Empty file.
Empty file added test/extensions/file.bat
Empty file.
Empty file added test/extensions/file.bay
Empty file.
Empty file added test/extensions/file.bazel
Empty file.
Empty file added test/extensions/file.bbx
Empty file.
Empty file added test/extensions/file.bdb
Empty file.
Empty file added test/extensions/file.bean
Empty file.
Empty file added test/extensions/file.beancount
Empty file.
Empty file added test/extensions/file.bench.cjs
Empty file.
Empty file added test/extensions/file.bench.cts
Empty file.
Empty file added test/extensions/file.bench.js
Empty file.
Empty file added test/extensions/file.bench.jsx
Empty file.
Empty file added test/extensions/file.bench.mjs
Empty file.
Empty file added test/extensions/file.bench.mts
Empty file.
Empty file added test/extensions/file.bench.ts
Empty file.
Empty file added test/extensions/file.bench.tsx
Empty file.
Empty file added test/extensions/file.bf
Empty file.
Empty file added test/extensions/file.bib
Empty file.
Empty file added test/extensions/file.bicep
Empty file.
Empty file added test/extensions/file.bin
Empty file.
Empty file added test/extensions/file.binsource
Empty file.
Empty file added test/extensions/file.blade.php
Empty file.
Empty file added test/extensions/file.blend
Empty file.
Empty file added test/extensions/file.blend1
Empty file.
Empty file added test/extensions/file.blend2
Empty file.
Empty file added test/extensions/file.blink
Empty file.
Empty file added test/extensions/file.bmap
Empty file.
Empty file added test/extensions/file.bmp
Empty file.
Empty file added test/extensions/file.bpg
Empty file.
Empty file added test/extensions/file.br
Empty file.
Empty file added test/extensions/file.braw
Empty file.
Empty file added test/extensions/file.brk
Empty file.
Empty file added test/extensions/file.brotli
Empty file.
Empty file added test/extensions/file.bru
Empty file.
Empty file added test/extensions/file.bst
Empty file.
Empty file added test/extensions/file.bubble
Empty file.
Empty file added test/extensions/file.bz2
Empty file.
Empty file added test/extensions/file.bzip2
Empty file.
Empty file added test/extensions/file.bzl
Empty file.
Empty file added test/extensions/file.c
Empty file.
Empty file added test/extensions/file.c++
Empty file.
Empty file added test/extensions/file.c3
Empty file.
Empty file added test/extensions/file.cab
Empty file.
Empty file added test/extensions/file.cabal
Empty file.
Empty file added test/extensions/file.caf
Empty file.
Empty file added test/extensions/file.cairo
Empty file.
Empty file added test/extensions/file.cake
Empty file.
Empty file added test/extensions/file.cap
Empty file.
Empty file added test/extensions/file.capnp
Empty file.
Empty file added test/extensions/file.cbl
Empty file.
Empty file added test/extensions/file.cbx
Empty file.
Empty file added test/extensions/file.cc
Empty file.
Empty file added test/extensions/file.cda
Empty file.
Empty file added test/extensions/file.cdc
Empty file.
Empty file added test/extensions/file.cdr
Empty file.
Empty file added test/extensions/file.cds
Empty file.
Empty file added test/extensions/file.cer
Empty file.
Empty file added test/extensions/file.cert
Empty file.
Empty file added test/extensions/file.cfc
Empty file.
Empty file added test/extensions/file.cfg
Empty file.
Empty file added test/extensions/file.cfm
Empty file.
Empty file added test/extensions/file.cfml
Empty file.
Empty file added test/extensions/file.ch
Empty file.
Empty file added test/extensions/file.cjs.map
Empty file.
Empty file added test/extensions/file.cl
Empty file.
Empty file added test/extensions/file.class
Empty file.
Empty file added test/extensions/file.clip
Empty file.
Empty file added test/extensions/file.clj
Empty file.
Empty file added test/extensions/file.cljc
Empty file.
Empty file added test/extensions/file.cljs
Empty file.
Empty file added test/extensions/file.cm
Empty file.
Empty file added test/extensions/file.cmake
Empty file.
Empty file added test/extensions/file.cmd
Empty file.
Empty file added test/extensions/file.cmj
Empty file.
Empty file added test/extensions/file.cmx
Empty file.
Empty file added test/extensions/file.cnf
Empty file.
Empty file added test/extensions/file.coafile
Empty file.
Empty file added test/extensions/file.coarc
Empty file.
Empty file added test/extensions/file.cob
Empty file.
Empty file added test/extensions/file.coco
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file added test/extensions/file.coffee
Empty file.
Empty file added test/extensions/file.command
Empty file.
Empty file added test/extensions/file.comp
Empty file.
Empty file added test/extensions/file.comp.glsl
Empty file.
Empty file added test/extensions/file.comp.hlsl
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file added test/extensions/file.conf
Empty file.
Empty file added test/extensions/file.config
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file added test/extensions/file.cp
Empty file.
Empty file added test/extensions/file.cpio
Empty file.
Empty file added test/extensions/file.cpn
Empty file.
Empty file added test/extensions/file.cpp
Empty file.
Empty file added test/extensions/file.cppm
Empty file.
Empty file added test/extensions/file.cpt
Empty file.
Empty file added test/extensions/file.cr
Empty file.
Empty file added test/extensions/file.cr2
Empty file.
Empty file added test/extensions/file.cr3
Empty file.
Empty file added test/extensions/file.crt
Empty file.
Empty file added test/extensions/file.crw
Empty file.
Empty file added test/extensions/file.crx
Empty file.
Empty file added test/extensions/file.cs
Empty file.
Empty file added test/extensions/file.csh
Empty file.
Empty file added test/extensions/file.csharp
Empty file.
Empty file added test/extensions/file.cshtml
Empty file.
Empty file added test/extensions/file.cson
Empty file.
Empty file added test/extensions/file.csproj
Empty file.
Empty file added test/extensions/file.css
Empty file.
Empty file added test/extensions/file.css.cjs
Empty file.
Empty file added test/extensions/file.css.js
Empty file.
Empty file added test/extensions/file.css.jsx
Empty file.
Empty file added test/extensions/file.css.map
Empty file.
Empty file added test/extensions/file.css.mjs
Empty file.
Empty file added test/extensions/file.css.ts
Empty file.
Empty file added test/extensions/file.css.tsx
Empty file.
Empty file added test/extensions/file.csv
Empty file.
Empty file added test/extensions/file.csx
Empty file.
Empty file added test/extensions/file.ctx
Empty file.
Empty file added test/extensions/file.cu
Empty file.
Empty file added test/extensions/file.cue
Empty file.
Empty file added test/extensions/file.cuh
Empty file.
Empty file added test/extensions/file.cur
Empty file.
Empty file added test/extensions/file.cxx
Empty file.
Empty file added test/extensions/file.cy.js
Empty file.
Empty file added test/extensions/file.cy.jsx
Empty file.
Empty file added test/extensions/file.cy.ts
Empty file.
Empty file added test/extensions/file.cy.tsx
Empty file.
Empty file added test/extensions/file.d
Empty file.
Empty file added test/extensions/file.d.cts
Empty file.
Empty file added test/extensions/file.d.ets
Empty file.
Empty file added test/extensions/file.d.mts
Empty file.
Empty file added test/extensions/file.d.ts
Empty file.
Empty file added test/extensions/file.dae
Empty file.
Empty file added test/extensions/file.dart
Empty file.
Empty file added test/extensions/file.dat
Empty file.
Empty file added test/extensions/file.data
Empty file.
Empty file added test/extensions/file.db
Empty file.
Empty file added test/extensions/file.db3
Empty file.
Empty file added test/extensions/file.dbf
Empty file.
Empty file added test/extensions/file.dblite
Empty file.
Empty file added test/extensions/file.dblite3
Empty file.
Empty file added test/extensions/file.dcr
Empty file.
Empty file added test/extensions/file.dcs
Empty file.
Empty file added test/extensions/file.dds
Empty file.
Empty file added test/extensions/file.deb
Empty file.
Empty file.
Empty file added test/extensions/file.def
Empty file.
Empty file added test/extensions/file.dex
Empty file.
Empty file added test/extensions/file.dfxp
Empty file.
Empty file added test/extensions/file.dhall
Empty file.
Empty file added test/extensions/file.dhallb
Empty file.
Empty file added test/extensions/file.dio
Empty file.
Empty file added test/extensions/file.djt
Empty file.
Empty file added test/extensions/file.dlc
Empty file.
Empty file added test/extensions/file.dll
Empty file.
Empty file added test/extensions/file.dmg
Empty file.
Empty file added test/extensions/file.dmn
Empty file.
Empty file added test/extensions/file.dng
Empty file.
Empty file added test/extensions/file.do
Empty file.
Empty file added test/extensions/file.doc
Empty file.
Empty file.
Empty file.
Empty file added test/extensions/file.dockerfile
Empty file.
Empty file.
Empty file added test/extensions/file.docx
Empty file.
Empty file added test/extensions/file.dot
Empty file.
Empty file added test/extensions/file.drawio
Empty file.
Empty file added test/extensions/file.drf
Empty file.
Empty file added test/extensions/file.drone.yml
Empty file.
Empty file added test/extensions/file.dsc
Empty file.
Empty file added test/extensions/file.dss
Empty file.
Empty file added test/extensions/file.dtd
Empty file.
Empty file added test/extensions/file.dtx
Empty file.
Empty file added test/extensions/file.duc
Empty file.
Empty file added test/extensions/file.dxf
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file added test/extensions/file.ec3
Empty file.
Empty file added test/extensions/file.ecr
Empty file.
Empty file added test/extensions/file.edb
Empty file.
Empty file added test/extensions/file.edge
Empty file.
Empty file added test/extensions/file.eex
Empty file.
Empty file added test/extensions/file.efs
Empty file.
Empty file added test/extensions/file.egg
Empty file.
Empty file added test/extensions/file.eip
Empty file.
Empty file added test/extensions/file.ejs
Empty file.
Empty file added test/extensions/file.elm
Empty file.
Empty file added test/extensions/file.eml
Empty file.
Empty file added test/extensions/file.emlx
Empty file.
Empty file added test/extensions/file.enc
Empty file.
Empty file added test/extensions/file.env
Empty file.
Empty file added test/extensions/file.eot
Empty file.
Empty file added test/extensions/file.eps
Empty file.
Empty file added test/extensions/file.epub
Empty file.
Empty file added test/extensions/file.erb
Empty file.
Loading
Loading