diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d974dd33..336d7f25 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,6 +37,9 @@ jobs: - name: Typecheck run: pnpm typecheck + - name: Integrity + run: pnpm integrity + - name: Build extension run: pnpm build diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index da7e324b..6ff5f237 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -34,6 +34,9 @@ jobs: - name: Typecheck run: pnpm typecheck + - name: Integrity + run: pnpm integrity + - name: Build extension run: pnpm build diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index de4bc944..fd048e94 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -41,6 +41,7 @@ We provide a set of npm scripts to make development and contribution easier: | `build` | Builds the extension and themes to `dist`. | | `catwalk` | Generates the main preview (requires `catwalk`). | | `icons` | CLI to optimize/generate icons and icon previews. | +| `integrity` | Ensures all default associations refer to existing icons. | | `pack` | Generates VSIX extension file. | ### Notes diff --git a/package.json b/package.json index ba7cafe9..9ebd5d6b 100644 --- a/package.json +++ b/package.json @@ -120,6 +120,7 @@ "build": "tsx scripts/build.ts", "catwalk": "tsx scripts/catwalk.ts", "icons": "tsx scripts/icons.ts", + "integrity": "tsx scripts/integrity.ts", "lint": "eslint .", "lint:fix": "eslint . --fix", "pack": "vsce package --no-dependencies", diff --git a/scripts/build.ts b/scripts/build.ts index 36509f6a..250e6034 100644 --- a/scripts/build.ts +++ b/scripts/build.ts @@ -1,3 +1,7 @@ +/** + * Build themes and extension. + */ + import { cp, readdir, writeFile } from 'node:fs/promises' import { basename, join } from 'node:path' import { exit } from 'node:process' diff --git a/scripts/catwalk.ts b/scripts/catwalk.ts index 6f1ff00f..6d6f3013 100644 --- a/scripts/catwalk.ts +++ b/scripts/catwalk.ts @@ -1,3 +1,7 @@ +/** + * Generate main preview using Catwalk. + */ + import { exec } from 'node:child_process' import { readdir, writeFile } from 'node:fs/promises' import { join, resolve } from 'node:path' diff --git a/scripts/icons.ts b/scripts/icons.ts index 95a8a7e7..01212d85 100644 --- a/scripts/icons.ts +++ b/scripts/icons.ts @@ -1,3 +1,7 @@ +/** + * CLI for icon SVG file manipulation. + */ + import { readFileSync, readdirSync, writeFileSync } from 'node:fs' import { readFile, readdir, writeFile } from 'node:fs/promises' import { join, resolve } from 'node:path' diff --git a/scripts/integrity.ts b/scripts/integrity.ts new file mode 100644 index 00000000..6bad9a1c --- /dev/null +++ b/scripts/integrity.ts @@ -0,0 +1,44 @@ +/** + * Ensure all default associations refer to existing icons. + */ + +import { readdir } from 'node:fs/promises' +import { basename, join, resolve } from 'node:path' +import { exit } from 'node:process' +import { consola } from 'consola' +import { fileIcons } from '~/defaults/fileIcons' +import { folderIcons } from '~/defaults/folderIcons' + +let exitCode = 0 + +const ICONS = 'icons' +const flavors = await readdir(resolve(ICONS)) + +consola.info('Running integrity check...') + +await Promise.all(flavors.map(async (f) => { + const icons = await readdir(resolve(join(ICONS, f))) + + Object.keys(fileIcons).forEach((fi) => { + if (!icons.some(i => basename(i, '.svg') === fi)) { + consola.error(`Missing ${f} icon for ${fi}`) + exitCode++ + } + }) + + Object.keys(folderIcons).forEach((fi) => { + if (!icons.some(i => basename(i, '.svg') === `folder_${fi}`)) { + consola.error(`Missing ${f} folder icon for ${fi}`) + exitCode++ + } + if (!icons.some(i => basename(i, '.svg') === `folder_${fi}_open`)) { + consola.error(`Missing ${f} open folder icon for ${fi}`) + exitCode++ + } + }) +})) + +if (exitCode === 0) + consola.success('Integrity check passed.') + +exit(exitCode) diff --git a/src/defaults/fileIcons.ts b/src/defaults/fileIcons.ts index 5d84f4f3..da9428f3 100644 --- a/src/defaults/fileIcons.ts +++ b/src/defaults/fileIcons.ts @@ -2607,4 +2607,4 @@ const { languageIds, fileExtensions, fileNames } = Object.entries(fileIcons).red }, ) -export { languageIds, fileExtensions, fileNames } +export { languageIds, fileExtensions, fileNames, fileIcons } diff --git a/src/defaults/folderIcons.ts b/src/defaults/folderIcons.ts index 0e8a8cb2..cb08601c 100644 --- a/src/defaults/folderIcons.ts +++ b/src/defaults/folderIcons.ts @@ -652,4 +652,4 @@ const { folderNames } = Object.entries(folderIcons).reduce( }, ) -export { folderNames } +export { folderNames, folderIcons }