stack/configs/tsdown/plugins.ts
2026-02-26 17:42:09 -08:00

38 lines
1.2 KiB
TypeScript

import fs from 'fs';
import type { Rolldown } from 'tsdown';
const SOURCE_FILE_PATTERN = /\.(jsx?|tsx?)$/;
const USE_CLIENT_DIRECTIVE_PATTERN = /["']use\s+client["']/i;
const USE_CLIENT_AT_TOP_PATTERN = /^\s*["']use\s+client["']\s*;?/;
export const createBasePlugin = (_options: {}): Rolldown.Plugin => {
const packageJson = JSON.parse(fs.readFileSync("./package.json", "utf-8"));
const packageVersionLabel = `js ${packageJson.name}@${packageJson.version}`;
return {
name: 'stackframe tsdown plugin (private)',
transform(code: string, id: string) {
if (!SOURCE_FILE_PATTERN.test(id)) {
return null;
}
let transformedCode = code;
transformedCode = transformedCode.replace(/STACK_COMPILE_TIME_CLIENT_PACKAGE_VERSION_SENTINEL/g, packageVersionLabel);
transformedCode = transformedCode.replace(/import\.meta\.vitest/g, 'undefined');
if (USE_CLIENT_DIRECTIVE_PATTERN.test(transformedCode) && !USE_CLIENT_AT_TOP_PATTERN.test(transformedCode)) {
transformedCode = `"use client";\n${transformedCode}`;
}
if (transformedCode === code) {
return null;
}
return {
code: transformedCode,
map: null,
};
},
};
};