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({ writeToDisk: true }), rewriteBoardgameImports(), yarnSpinnerPlugin(), ], esbuildOptions(options) { options.alias = { "@": srcDir, }; }, });