import { defineConfig } from 'tsup'; import { fileURLToPath } from 'url'; import * as fs from 'fs'; import * as path from 'path'; import {csvLoader} from 'inline-schema/csv-loader/esbuild'; import {yarnSpinnerPlugin} from 'yarn-spinner-loader/esbuild'; import type { Plugin } from 'esbuild'; const srcDir = fileURLToPath(new URL('./src', import.meta.url)); const samplesDir = fileURLToPath(new URL('./src/samples', import.meta.url)); // Auto-discover samples entry points function getSamplesEntries(): Record { const entries: Record = {}; if (!fs.existsSync(samplesDir)) return entries; for (const item of fs.readdirSync(samplesDir)) { const fullPath = path.join(samplesDir, item); if (fs.statSync(fullPath).isDirectory()) { // Directory sample (e.g. boop) - look for index.ts const indexPath = path.join(fullPath, 'index.ts'); if (fs.existsSync(indexPath)) { entries[item] = indexPath; } } else if (item.endsWith('.ts')) { // Single file sample (e.g. tic-tac-toe.ts) entries[item.replace('.ts', '')] = fullPath; } } return entries; } const samplesEntries = getSamplesEntries(); /** * Plugin to rewrite @/core/* and @/utils/* imports to use 'boardgame-core' */ function rewriteBoardgameImports(): Plugin { return { name: 'rewrite-boardgame-imports', setup(build) { build.onResolve({ filter: /^@\/(core|utils)\// }, args => { // Mark these as external and rewrite to 'boardgame-core' return { path: 'boardgame-core', external: true, }; }); // Also handle @/index imports build.onResolve({ filter: /^@\/index$/ }, args => { return { path: 'boardgame-core', external: true, }; }); }, }; } export default defineConfig({ entry: samplesEntries, format: ['esm'], dts: true, clean: true, sourcemap: true, outDir: 'dist/samples', external: ['@preact/signals-core', 'mutative', 'inline-schema', 'boardgame-core'], esbuildPlugins: [csvLoader(), rewriteBoardgameImports(), yarnSpinnerPlugin()], });