From c3821ee730b2da5e225a798d621e1a83450724f8 Mon Sep 17 00:00:00 2001 From: Roman Date: Sat, 14 Feb 2026 01:08:24 +0000 Subject: [PATCH] create a plugin for virtual 'usts:runtime' module --- packages/usts/package.json | 3 ++- packages/usts/src/core/build/options.ts | 30 ++++++++++++++++++++++--- packages/usts/src/core/build/watch.ts | 2 +- packages/usts/src/types/virtual.d.ts | 4 ++++ packages/usts/tsdown.config.ts | 9 +++++++- 5 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 packages/usts/src/types/virtual.d.ts diff --git a/packages/usts/package.json b/packages/usts/package.json index 3749b42..167e9f3 100644 --- a/packages/usts/package.json +++ b/packages/usts/package.json @@ -22,7 +22,8 @@ "./bin/cli": "./dist/bin/cli.mjs", "./config": "./dist/config.mjs", "./core": "./dist/core.mjs", - "./package.json": "./package.json" + "./package.json": "./package.json", + "./types": "./virtual.d.ts" }, "bin": { "usts": "./dist/bin/cli.mjs" diff --git a/packages/usts/src/core/build/options.ts b/packages/usts/src/core/build/options.ts index 1e6eafc..7804530 100644 --- a/packages/usts/src/core/build/options.ts +++ b/packages/usts/src/core/build/options.ts @@ -1,8 +1,29 @@ import * as path from "node:path"; -import type { InputOptions, OutputOptions } from "rolldown"; +import type { InputOptions, OutputOptions, Plugin } from "rolldown"; import type { ResolvedUserscriptConfig } from "~/config/schema"; import { serializeMetaHeader } from "./meta-header"; +function userscriptPlugin(options?: { dev?: boolean }) { + const id = "usts:runtime"; + const resolvedId = `\0${id}`; + return { + name: "userscript-plugin", + resolveId(source) { + if (source === id) { + return resolvedId; + } + return null; + }, + load(id) { + if (id === resolvedId) { + return `const IS_DEV = ${options?.dev ?? false}; + export { IS_DEV };`; + } + return null; + }, + } satisfies Plugin; +} + interface ResolvedOutputOptions extends OutputOptions { readonly file: string; } @@ -15,7 +36,7 @@ interface ResolvedOptions extends InputOptions { export function resolveOptions( config: ResolvedUserscriptConfig, - options?: { write?: boolean }, + options?: { write?: boolean; dev?: boolean }, ): ResolvedOptions { const header = serializeMetaHeader(config.header); @@ -25,7 +46,7 @@ export function resolveOptions( return { input: config.entryPoint, tsconfig: true, - plugins: [config.plugins], + plugins: [config.plugins, userscriptPlugin({ dev: options?.dev })], output: { format: "iife", sourcemap: false, @@ -34,6 +55,9 @@ export function resolveOptions( cleanDir: config.clean, file: outFile, }, + transform: { + define: { "process.env.NODE_ENV": `"${process.env.NODE_ENV}"` }, + }, write: options?.write ?? false, }; } diff --git a/packages/usts/src/core/build/watch.ts b/packages/usts/src/core/build/watch.ts index d649277..485eb1b 100644 --- a/packages/usts/src/core/build/watch.ts +++ b/packages/usts/src/core/build/watch.ts @@ -10,7 +10,7 @@ async function watchUserscript( options?: { port?: number }, ): Promise { const USERSCRIPT_OUTPUT_FILE_NAME = "index.user.js"; - const watchOptions = resolveOptions(config); + const watchOptions = resolveOptions(config, { dev: true }); rolldown.watch(watchOptions); await serve({ port: options?.port ?? 3000, diff --git a/packages/usts/src/types/virtual.d.ts b/packages/usts/src/types/virtual.d.ts new file mode 100644 index 0000000..5b08b28 --- /dev/null +++ b/packages/usts/src/types/virtual.d.ts @@ -0,0 +1,4 @@ +declare module "usts:runtime" { + const IS_DEV: boolean; + export { IS_DEV }; +} diff --git a/packages/usts/tsdown.config.ts b/packages/usts/tsdown.config.ts index e3e8d18..7122e3f 100644 --- a/packages/usts/tsdown.config.ts +++ b/packages/usts/tsdown.config.ts @@ -6,7 +6,14 @@ export default defineConfig({ config: "src/config/index.ts", "bin/cli": "src/bin/cli.ts", }, - exports: true, + copy: { from: "src/types/*.d.ts", to: "dist" }, + exports: { + enabled: true, + customExports(pkg) { + pkg["./types"] = "./virtual.d.ts"; + return pkg; + }, + }, hash: false, outputOptions: { minify: "dce-only", minifyInternalExports: false }, dts: true,