Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/lukebennett88/luke-ui. ui.lukebennett.dev
Something went wrong. Try again.
TypeScript
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';import { tmpdir } from 'node:os';import { join } from 'node:path';import { afterEach, expect, test } from 'vite-plus/test';import { cleanGeneratedPropsPages } from './clean-generated-props-pages.js';
const testDirectories: Array<string> = [];
const GENERATOR_MARKER = '{/* Generated by scripts/generate-props-pages.ts. Do not edit. */}';
function generatedPropsMdx(): string { return `---\ntitle: Button\n---\n\n${GENERATOR_MARKER}\n`;}
afterEach(() => { for (const directory of testDirectories) { rmSync(directory, { force: true, recursive: true }); } testDirectories.length = 0;});
function createTempDir(): string { const directory = mkdtempSync(join(tmpdir(), 'luke-ui-clean-generated-props-')); testDirectories.push(directory); return directory;}
test('removes generator-owned props.mdx and meta.json and the now-empty directory', () => { const root = createTempDir(); const componentDir = join(root, 'actions', 'button'); mkdirSync(componentDir, { recursive: true }); writeFileSync(join(componentDir, 'props.mdx'), generatedPropsMdx()); writeFileSync(join(componentDir, 'meta.json'), '{}');
const result = cleanGeneratedPropsPages(root);
expect(result.removedCount).toBe(2); expect(existsSync(componentDir)).toBe(false);});
test('does not remove a component directory that still contains an unrelated file', () => { const root = createTempDir(); const componentDir = join(root, 'actions', 'button'); mkdirSync(componentDir, { recursive: true }); writeFileSync(join(componentDir, 'props.mdx'), generatedPropsMdx()); writeFileSync(join(componentDir, 'notes.txt'), 'keep me');
const result = cleanGeneratedPropsPages(root);
expect(result.removedCount).toBe(1); expect(existsSync(componentDir)).toBe(true); expect(existsSync(join(componentDir, 'props.mdx'))).toBe(false); expect(existsSync(join(componentDir, 'notes.txt'))).toBe(true); expect(readFileSync(join(componentDir, 'notes.txt'), 'utf8')).toBe('keep me');});
test('leaves authored guides and group-level meta.json untouched', () => { const root = createTempDir(); const groupDir = join(root, 'actions'); const componentDir = join(groupDir, 'button'); mkdirSync(componentDir, { recursive: true }); writeFileSync(join(groupDir, 'button.mdx'), '# Button guide'); writeFileSync(join(groupDir, 'meta.json'), '{"pages": ["button"]}'); writeFileSync(join(componentDir, 'props.mdx'), generatedPropsMdx()); writeFileSync(join(componentDir, 'meta.json'), '{}');
const result = cleanGeneratedPropsPages(root);
expect(result.removedCount).toBe(2); expect(existsSync(componentDir)).toBe(false); expect(existsSync(join(groupDir, 'button.mdx'))).toBe(true); expect(readFileSync(join(groupDir, 'button.mdx'), 'utf8')).toBe('# Button guide'); expect(existsSync(join(groupDir, 'meta.json'))).toBe(true); expect(readFileSync(join(groupDir, 'meta.json'), 'utf8')).toBe('{"pages": ["button"]}');});
test('is a no-op when the components directory does not exist', () => { const root = createTempDir();
const result = cleanGeneratedPropsPages(join(root, 'does-not-exist'));
expect(result.removedCount).toBe(0);});
test('is a no-op when a group subdirectory has no component directories', () => { const root = createTempDir(); mkdirSync(join(root, 'actions'), { recursive: true }); writeFileSync(join(root, 'actions', 'button.mdx'), '# Button guide');
const result = cleanGeneratedPropsPages(root);
expect(result.removedCount).toBe(0); expect(existsSync(join(root, 'actions', 'button.mdx'))).toBe(true);});
test('ignores a component directory that has neither generator-owned file', () => { const root = createTempDir(); const componentDir = join(root, 'actions', 'button'); mkdirSync(componentDir, { recursive: true }); writeFileSync(join(componentDir, 'notes.txt'), 'keep me');
const result = cleanGeneratedPropsPages(root);
expect(result.removedCount).toBe(0); expect(existsSync(componentDir)).toBe(true); expect(existsSync(join(componentDir, 'notes.txt'))).toBe(true);});
test('leaves an authored props.mdx without the marker untouched, and its directory is not removed', () => { const root = createTempDir(); const componentDir = join(root, 'actions', 'button'); mkdirSync(componentDir, { recursive: true }); writeFileSync( join(componentDir, 'props.mdx'), '# Authored props page\n\nSome hand-written content.', );
const result = cleanGeneratedPropsPages(root);
expect(result.removedCount).toBe(0); expect(existsSync(componentDir)).toBe(true); expect(existsSync(join(componentDir, 'props.mdx'))).toBe(true); expect(readFileSync(join(componentDir, 'props.mdx'), 'utf8')).toBe( '# Authored props page\n\nSome hand-written content.', );});
test('leaves an authored props.mdx without the marker and its sibling meta.json both untouched', () => { const root = createTempDir(); const componentDir = join(root, 'actions', 'button'); mkdirSync(componentDir, { recursive: true }); writeFileSync(join(componentDir, 'props.mdx'), '# Authored props page'); writeFileSync(join(componentDir, 'meta.json'), '{"title": "Props"}');
const result = cleanGeneratedPropsPages(root);
expect(result.removedCount).toBe(0); expect(existsSync(componentDir)).toBe(true); expect(existsSync(join(componentDir, 'props.mdx'))).toBe(true); expect(readFileSync(join(componentDir, 'props.mdx'), 'utf8')).toBe('# Authored props page'); expect(existsSync(join(componentDir, 'meta.json'))).toBe(true); expect(readFileSync(join(componentDir, 'meta.json'), 'utf8')).toBe('{"title": "Props"}');});
test('leaves a standalone meta.json with no props.mdx untouched, and its directory is not removed', () => { const root = createTempDir(); const componentDir = join(root, 'actions', 'button'); mkdirSync(componentDir, { recursive: true }); writeFileSync(join(componentDir, 'meta.json'), '{"pages": ["overview"]}');
const result = cleanGeneratedPropsPages(root);
expect(result.removedCount).toBe(0); expect(existsSync(componentDir)).toBe(true); expect(existsSync(join(componentDir, 'meta.json'))).toBe(true); expect(readFileSync(join(componentDir, 'meta.json'), 'utf8')).toBe('{"pages": ["overview"]}');});
test('removes a marked generated props.mdx (and meta.json) next to an unrelated authored file, but keeps the directory', () => { const root = createTempDir(); const componentDir = join(root, 'actions', 'button'); mkdirSync(componentDir, { recursive: true }); writeFileSync(join(componentDir, 'props.mdx'), generatedPropsMdx()); writeFileSync(join(componentDir, 'meta.json'), '{}'); writeFileSync(join(componentDir, 'notes.txt'), 'keep me');
const result = cleanGeneratedPropsPages(root);
expect(result.removedCount).toBe(2); expect(existsSync(componentDir)).toBe(true); expect(existsSync(join(componentDir, 'props.mdx'))).toBe(false); expect(existsSync(join(componentDir, 'meta.json'))).toBe(false); expect(existsSync(join(componentDir, 'notes.txt'))).toBe(true); expect(readFileSync(join(componentDir, 'notes.txt'), 'utf8')).toBe('keep me');});