refactor: add samples to export & use inline-schema's esbuild plugin

This commit is contained in:
hypercross 2026-04-07 11:37:05 +08:00
parent 83658c9898
commit a84aa2426b
4 changed files with 56 additions and 4 deletions

1
.qwenignore Normal file
View File

@ -0,0 +1 @@
!node_modules

View File

@ -9,10 +9,15 @@
".": { ".": {
"types": "./dist/index.d.ts", "types": "./dist/index.d.ts",
"import": "./dist/index.js" "import": "./dist/index.js"
},
"./samples/*": {
"types": "./dist/samples/*.d.ts",
"import": "./dist/samples/*.js"
} }
}, },
"scripts": { "scripts": {
"build": "tsup", "build": "tsup",
"build:samples": "tsup --config tsup.samples.config.ts",
"prepare": "npm run build", "prepare": "npm run build",
"test": "vitest", "test": "vitest",
"test:run": "vitest run", "test:run": "vitest run",

View File

@ -1,7 +1,6 @@
import { import {Part} from "boardgame-core";
createGameCommandRegistry, Part, createRegion, import {createRegion} from "boardgame-core";
IGameContext, createPromptDef import {createGameCommandRegistry, createPromptDef, IGameContext} from "boardgame-core";
} from '@/index';
const BOARD_SIZE = 3; const BOARD_SIZE = 3;
const MAX_TURNS = BOARD_SIZE * BOARD_SIZE; const MAX_TURNS = BOARD_SIZE * BOARD_SIZE;

47
tsup.samples.config.ts Normal file
View File

@ -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<string, string> {
const entries: Record<string, string> = {};
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,
};
},
});