85 lines
2.2 KiB
TypeScript
85 lines
2.2 KiB
TypeScript
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<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();
|
|
|
|
/**
|
|
* 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,
|
|
};
|
|
},
|
|
});
|