From a84aa2426b0f89c2d8ad65ebeeee60c90e1227f7 Mon Sep 17 00:00:00 2001 From: hypercross Date: Tue, 7 Apr 2026 11:37:05 +0800 Subject: [PATCH] refactor: add samples to export & use inline-schema's esbuild plugin --- .qwenignore | 1 + package.json | 5 ++++ src/samples/tic-tac-toe.ts | 7 +++--- tsup.samples.config.ts | 47 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 .qwenignore create mode 100644 tsup.samples.config.ts diff --git a/.qwenignore b/.qwenignore new file mode 100644 index 0000000..22fb128 --- /dev/null +++ b/.qwenignore @@ -0,0 +1 @@ +!node_modules \ No newline at end of file diff --git a/package.json b/package.json index 6fa43bf..97b7478 100644 --- a/package.json +++ b/package.json @@ -9,10 +9,15 @@ ".": { "types": "./dist/index.d.ts", "import": "./dist/index.js" + }, + "./samples/*": { + "types": "./dist/samples/*.d.ts", + "import": "./dist/samples/*.js" } }, "scripts": { "build": "tsup", + "build:samples": "tsup --config tsup.samples.config.ts", "prepare": "npm run build", "test": "vitest", "test:run": "vitest run", diff --git a/src/samples/tic-tac-toe.ts b/src/samples/tic-tac-toe.ts index b76ec39..a6c9649 100644 --- a/src/samples/tic-tac-toe.ts +++ b/src/samples/tic-tac-toe.ts @@ -1,7 +1,6 @@ -import { - createGameCommandRegistry, Part, createRegion, - IGameContext, createPromptDef -} from '@/index'; +import {Part} from "boardgame-core"; +import {createRegion} from "boardgame-core"; +import {createGameCommandRegistry, createPromptDef, IGameContext} from "boardgame-core"; const BOARD_SIZE = 3; const MAX_TURNS = BOARD_SIZE * BOARD_SIZE; diff --git a/tsup.samples.config.ts b/tsup.samples.config.ts new file mode 100644 index 0000000..af1e6cc --- /dev/null +++ b/tsup.samples.config.ts @@ -0,0 +1,47 @@ +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'; + +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(); + +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()], + esbuildOptions(options) { + options.alias = { + '@': srcDir, + }; + }, +});