@srvkit/rsbuild 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"ssr.js","names":[],"sources":["../../src/functions/ssr.ts"],"sourcesContent":["import type { Rspack } from \"@rsbuild/core\";\nimport type { Runtime } from \"@srvkit/common/@types/options/complete\";\n\nconst getSsrTarget = (runtime: Runtime): Rspack.Target => {\n switch (runtime) {\n case \"workerd\":\n return \"webworker\";\n default:\n return \"node\";\n }\n};\n\nexport { getSsrTarget };\n"],"mappings":";;;;;;;;;AAGA,MAAM,gBAAgB,YAAoC;CACtD,QAAQ,SAAR;EACI,KAAK,WACD,OAAO;EACX,SACI,OAAO;CACf;AACJ"}
1
+ {"version":3,"file":"ssr.js","names":[],"sources":["../../src/functions/ssr.ts"],"sourcesContent":["import type { Rspack } from \"@rsbuild/core\";\nimport type { Runtime } from \"@srvkit/common/@types/options/complete\";\n\nconst getSsrTarget = (runtime: Runtime): Rspack.Target => {\n switch (runtime) {\n // Cloudflare Workers runs in a Web Worker, not Node\n case \"workerd\":\n return \"webworker\";\n // Deno and Bun are Node-compatible for SSR purposes\n default:\n return \"node\";\n }\n};\n\nexport { getSsrTarget };\n"],"mappings":";;;;;;;;;AAGA,MAAM,gBAAgB,YAAoC;CACtD,QAAQ,SAAR;EAEI,KAAK,WACD,OAAO;EAEX,SACI,OAAO;CACf;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"ssr.mjs","names":[],"sources":["../../src/functions/ssr.ts"],"sourcesContent":["import type { Rspack } from \"@rsbuild/core\";\nimport type { Runtime } from \"@srvkit/common/@types/options/complete\";\n\nconst getSsrTarget = (runtime: Runtime): Rspack.Target => {\n switch (runtime) {\n case \"workerd\":\n return \"webworker\";\n default:\n return \"node\";\n }\n};\n\nexport { getSsrTarget };\n"],"mappings":";;;;;;;;AAGA,MAAM,gBAAgB,YAAoC;CACtD,QAAQ,SAAR;EACI,KAAK,WACD,OAAO;EACX,SACI,OAAO;CACf;AACJ"}
1
+ {"version":3,"file":"ssr.mjs","names":[],"sources":["../../src/functions/ssr.ts"],"sourcesContent":["import type { Rspack } from \"@rsbuild/core\";\nimport type { Runtime } from \"@srvkit/common/@types/options/complete\";\n\nconst getSsrTarget = (runtime: Runtime): Rspack.Target => {\n switch (runtime) {\n // Cloudflare Workers runs in a Web Worker, not Node\n case \"workerd\":\n return \"webworker\";\n // Deno and Bun are Node-compatible for SSR purposes\n default:\n return \"node\";\n }\n};\n\nexport { getSsrTarget };\n"],"mappings":";;;;;;;;AAGA,MAAM,gBAAgB,YAAoC;CACtD,QAAQ,SAAR;EAEI,KAAK,WACD,OAAO;EAEX,SACI,OAAO;CACf;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["getSsrTarget","VIRTUAL_ENTRY","name","builtinModules"],"sources":["../../../src/plugins/build/index.ts"],"sourcesContent":["import type {\n ModifyBundlerChainUtils,\n RsbuildConfig,\n RsbuildPlugin,\n RsbuildPluginAPI,\n Rspack,\n RspackChain,\n} from \"@rsbuild/core\";\nimport type {\n ResolvedBuildOptions,\n ResolvedOptions,\n} from \"@srvkit/common/@types/options/resolved\";\nimport type { PackageJson } from \"@srvkit/common/functions/package/package-json\";\n\nimport { builtinModules } from \"node:module\";\n\nimport { createVirtualEntryCode } from \"@srvkit/common/functions/build/virtual-entry\";\nimport { getPackageJson } from \"@srvkit/common/functions/package/package-json\";\n\nimport { VIRTUAL_ENTRY } from \"#/constants/path\";\nimport { getSsrTarget } from \"#/functions/ssr\";\nimport { name } from \"#/root/package.json\";\n\nconst buildPlugin = (opts: ResolvedOptions): RsbuildPlugin => {\n const build: ResolvedBuildOptions = opts.build;\n\n const packageJson: PackageJson = getPackageJson(opts.cwd);\n\n return {\n name: \"srvkit:build\",\n apply: \"build\",\n async setup(api: RsbuildPluginAPI): Promise<void> {\n const ssrTarget: Rspack.Target = getSsrTarget(opts.runtime);\n\n api.modifyRsbuildConfig(\n (\n config: RsbuildConfig,\n { mergeRsbuildConfig },\n ): RsbuildConfig => {\n const overrideConfig: RsbuildConfig = {\n source: {\n entry: {\n index: VIRTUAL_ENTRY,\n },\n },\n output: {\n target: \"node\",\n distPath: build.outputDir,\n copy: void 0,\n },\n };\n\n // Enforce the bundler to apply SWC configuration to third-party dependencies\n if (build.bundle === \"standalone\") {\n overrideConfig.source = {\n ...overrideConfig.source,\n include: [\n ...(overrideConfig.source?.include ?? []),\n /[\\\\/]node_modules[\\\\/]/,\n ],\n };\n }\n\n return mergeRsbuildConfig(config, overrideConfig);\n },\n );\n\n api.modifyBundlerChain(\n (\n chain: RspackChain,\n { rspack }: ModifyBundlerChainUtils,\n ): void => {\n // Avoid externalizing chunks\n chain\n .plugin(\"limit-chunk\")\n .use(rspack.optimize.LimitChunkCountPlugin, [\n {\n maxChunks: 1,\n },\n ]);\n\n // Add support for virtual modules\n chain\n .plugin(\"virtual-modules\")\n .use(rspack.experiments.VirtualModulesPlugin, [\n {\n [VIRTUAL_ENTRY]: createVirtualEntryCode({\n ...opts,\n packageName: name,\n }),\n },\n ]);\n },\n );\n\n api.modifyRspackConfig(\n (config, { mergeConfig }): Rspack.Configuration => {\n const isModule: boolean = packageJson.type === \"module\";\n\n const nodeExternals: (string | RegExp)[] = [\n ...builtinModules,\n /^node:/,\n ];\n\n const overrideConfig: Rspack.Configuration = {\n resolve: {\n /** @see https://rspack.rs/config/resolve#extend-default-value */\n conditionNames: [\n opts.runtime,\n \"...\", // Default values\n ],\n },\n target: ssrTarget,\n node: {\n __dirname: false,\n __filename: false,\n },\n optimization: {\n minimize: build.minify,\n splitChunks: false,\n runtimeChunk: false,\n },\n };\n\n // bundle: external\n\n if (build.bundle === \"external\") {\n const depNames: string[] = [\n ...Object.keys(packageJson.dependencies ?? {}),\n ...Object.keys(packageJson.peerDependencies ?? {}),\n ...Object.keys(\n packageJson.optionalDependencies ?? {},\n ),\n ];\n\n const depExternals: RegExp[] = depNames.map(\n (name: string): RegExp =>\n new RegExp(\n `^${name.replace(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`)}([\\\\/]|$)`,\n ),\n );\n\n overrideConfig.externals = [\n ...nodeExternals,\n ...depExternals,\n ];\n\n overrideConfig.externalsType = isModule\n ? \"module-import\"\n : \"commonjs\";\n }\n\n // bundle: standalone\n\n if (build.bundle === \"standalone\") {\n overrideConfig.externals = nodeExternals;\n }\n\n // target: server\n\n if (build.target === \"server\") {\n overrideConfig.output = {\n ...overrideConfig.output,\n filename: build.outputFile,\n library: void 0,\n ...(isModule\n ? {\n module: true,\n }\n : {}),\n };\n }\n\n // target: handler\n\n if (build.target === \"handler\") {\n overrideConfig.output = {\n ...overrideConfig.output,\n filename: build.outputFile,\n library: {\n type: isModule ? \"module\" : \"commonjs2\",\n export: \"default\",\n },\n ...(isModule\n ? {\n module: true,\n }\n : {}),\n };\n }\n\n return mergeConfig(config, overrideConfig);\n },\n );\n },\n };\n};\n\nexport { buildPlugin };\n"],"mappings":";;;;;;;;;;;;;;;;AAuBA,MAAM,eAAe,SAAyC;CAC1D,MAAM,QAA8B,KAAK;CAEzC,MAAM,gFAA0C,KAAK,GAAG;CAExD,OAAO;EACH,MAAM;EACN,OAAO;EACP,MAAM,MAAM,KAAsC;GAC9C,MAAM,YAA2BA,yBAAa,KAAK,OAAO;GAE1D,IAAI,qBAEI,QACA,EAAE,yBACc;IAChB,MAAM,iBAAgC;KAClC,QAAQ,EACJ,OAAO,EACH,OAAOC,2BACX,EACJ;KACA,QAAQ;MACJ,QAAQ;MACR,UAAU,MAAM;MAChB,MAAM,KAAK;KACf;IACJ;IAGA,IAAI,MAAM,WAAW,cACjB,eAAe,SAAS;KACpB,GAAG,eAAe;KAClB,SAAS,CACL,GAAI,eAAe,QAAQ,WAAW,CAAC,GACvC,wBACJ;IACJ;IAGJ,OAAO,mBAAmB,QAAQ,cAAc;GACpD,CACJ;GAEA,IAAI,oBAEI,OACA,EAAE,aACK;IAEP,MACK,OAAO,aAAa,CAAC,CACrB,IAAI,OAAO,SAAS,uBAAuB,CACxC,EACI,WAAW,EACf,CACJ,CAAC;IAGL,MACK,OAAO,iBAAiB,CAAC,CACzB,IAAI,OAAO,YAAY,sBAAsB,CAC1C,GACKA,sGAAuC;KACpC,GAAG;KACH,aAAaC;IACjB,CAAC,EACL,CACJ,CAAC;GACT,CACJ;GAEA,IAAI,oBACC,QAAQ,EAAE,kBAAwC;IAC/C,MAAM,WAAoB,YAAY,SAAS;IAE/C,MAAM,gBAAqC,CACvC,GAAGC,4BACH,QACJ;IAEA,MAAM,iBAAuC;KACzC,SAAS;;AAEL,gBAAgB,CACZ,KAAK,SACL,KACJ,EACJ;KACA,QAAQ;KACR,MAAM;MACF,WAAW;MACX,YAAY;KAChB;KACA,cAAc;MACV,UAAU,MAAM;MAChB,aAAa;MACb,cAAc;KAClB;IACJ;IAIA,IAAI,MAAM,WAAW,YAAY;KAS7B,MAAM,eAAyB;MAP3B,GAAG,OAAO,KAAK,YAAY,gBAAgB,CAAC,CAAC;MAC7C,GAAG,OAAO,KAAK,YAAY,oBAAoB,CAAC,CAAC;MACjD,GAAG,OAAO,KACN,YAAY,wBAAwB,CAAC,CACzC;KAGkC,CAAC,CAAC,KACnC,SACG,IAAI,OACA,IAAI,KAAK,QAAQ,uBAAuB,OAAO,GAAG,KAAK,EAAE,UAC7D,CACR;KAEA,eAAe,YAAY,CACvB,GAAG,eACH,GAAG,YACP;KAEA,eAAe,gBAAgB,WACzB,kBACA;IACV;IAIA,IAAI,MAAM,WAAW,cACjB,eAAe,YAAY;IAK/B,IAAI,MAAM,WAAW,UACjB,eAAe,SAAS;KACpB,GAAG,eAAe;KAClB,UAAU,MAAM;KAChB,SAAS,KAAK;KACd,GAAI,WACE,EACI,QAAQ,KACZ,IACA,CAAC;IACX;IAKJ,IAAI,MAAM,WAAW,WACjB,eAAe,SAAS;KACpB,GAAG,eAAe;KAClB,UAAU,MAAM;KAChB,SAAS;MACL,MAAM,WAAW,WAAW;MAC5B,QAAQ;KACZ;KACA,GAAI,WACE,EACI,QAAQ,KACZ,IACA,CAAC;IACX;IAGJ,OAAO,YAAY,QAAQ,cAAc;GAC7C,CACJ;EACJ;CACJ;AACJ"}
1
+ {"version":3,"file":"index.js","names":["getSsrTarget","VIRTUAL_ENTRY","name","builtinModules"],"sources":["../../../src/plugins/build/index.ts"],"sourcesContent":["import type {\n ModifyBundlerChainUtils,\n RsbuildConfig,\n RsbuildPlugin,\n RsbuildPluginAPI,\n Rspack,\n RspackChain,\n} from \"@rsbuild/core\";\nimport type {\n ResolvedBuildOptions,\n ResolvedOptions,\n} from \"@srvkit/common/@types/options/resolved\";\nimport type { PackageJson } from \"@srvkit/common/functions/package/package-json\";\n\nimport { builtinModules } from \"node:module\";\n\nimport { createVirtualEntryCode } from \"@srvkit/common/functions/build/virtual-entry\";\nimport { getPackageJson } from \"@srvkit/common/functions/package/package-json\";\n\nimport { VIRTUAL_ENTRY } from \"#/constants/path\";\nimport { getSsrTarget } from \"#/functions/ssr\";\nimport { name } from \"#/root/package.json\";\n\nconst buildPlugin = (opts: ResolvedOptions): RsbuildPlugin => {\n const build: ResolvedBuildOptions = opts.build;\n\n const packageJson: PackageJson = getPackageJson(opts.cwd);\n\n return {\n name: \"srvkit:build\",\n apply: \"build\",\n async setup(api: RsbuildPluginAPI): Promise<void> {\n const ssrTarget: Rspack.Target = getSsrTarget(opts.runtime);\n\n api.modifyRsbuildConfig(\n (\n config: RsbuildConfig,\n { mergeRsbuildConfig },\n ): RsbuildConfig => {\n const overrideConfig: RsbuildConfig = {\n source: {\n entry: {\n index: VIRTUAL_ENTRY,\n },\n },\n output: {\n target: \"node\",\n distPath: build.outputDir,\n copy: void 0, // Handled by copyPlugin instead\n },\n };\n\n // In standalone mode, force the bundler to process node_modules through SWC\n // so transpilation config (e.g. decorators, class properties) applies to deps too.\n // Without this, Rsbuild skips transforming node_modules by default.\n if (build.bundle === \"standalone\") {\n overrideConfig.source = {\n ...overrideConfig.source,\n include: [\n ...(overrideConfig.source?.include ?? []),\n /[\\\\/]node_modules[\\\\/]/,\n ],\n };\n }\n\n return mergeRsbuildConfig(config, overrideConfig);\n },\n );\n\n api.modifyBundlerChain(\n (\n chain: RspackChain,\n { rspack }: ModifyBundlerChainUtils,\n ): void => {\n // Avoid externalizing chunks\n chain\n .plugin(\"limit-chunk\")\n .use(rspack.optimize.LimitChunkCountPlugin, [\n {\n maxChunks: 1,\n },\n ]);\n\n // Add support for virtual modules\n chain\n .plugin(\"virtual-modules\")\n .use(rspack.experiments.VirtualModulesPlugin, [\n {\n [VIRTUAL_ENTRY]: createVirtualEntryCode({\n ...opts,\n packageName: name,\n }),\n },\n ]);\n },\n );\n\n api.modifyRspackConfig(\n (config, { mergeConfig }): Rspack.Configuration => {\n const isModule: boolean = packageJson.type === \"module\";\n\n const nodeExternals: (string | RegExp)[] = [\n ...builtinModules,\n /^node:/,\n ];\n\n const overrideConfig: Rspack.Configuration = {\n resolve: {\n /** @see https://rspack.rs/config/resolve#extend-default-value */\n conditionNames: [\n opts.runtime,\n \"...\", // Default values\n ],\n },\n target: ssrTarget,\n // Preserve real __dirname/__filename values instead of injecting\n // Rspack polyfills — server code should use the real Node values\n node: {\n __dirname: false,\n __filename: false,\n },\n optimization: {\n minimize: build.minify,\n splitChunks: false,\n runtimeChunk: false,\n },\n };\n\n // bundle: external\n\n if (build.bundle === \"external\") {\n const depNames: string[] = [\n ...Object.keys(packageJson.dependencies ?? {}),\n ...Object.keys(packageJson.peerDependencies ?? {}),\n ...Object.keys(\n packageJson.optionalDependencies ?? {},\n ),\n ];\n\n const depExternals: RegExp[] = depNames.map(\n (name: string): RegExp =>\n new RegExp(\n `^${name.replace(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`)}([\\\\/]|$)`,\n ),\n );\n\n overrideConfig.externals = [\n ...nodeExternals,\n ...depExternals,\n ];\n\n overrideConfig.externalsType = isModule\n ? \"module-import\"\n : \"commonjs\";\n }\n\n // bundle: standalone\n\n if (build.bundle === \"standalone\") {\n overrideConfig.externals = nodeExternals;\n }\n\n // target: server\n\n if (build.target === \"server\") {\n overrideConfig.output = {\n ...overrideConfig.output,\n filename: build.outputFile,\n library: void 0, // Server target is self-starting\n ...(isModule\n ? {\n module: true,\n }\n : {}),\n };\n }\n\n // target: handler\n\n if (build.target === \"handler\") {\n overrideConfig.output = {\n ...overrideConfig.output,\n filename: build.outputFile,\n library: {\n type: isModule ? \"module\" : \"commonjs2\",\n export: \"default\",\n },\n ...(isModule\n ? {\n module: true,\n }\n : {}),\n };\n }\n\n return mergeConfig(config, overrideConfig);\n },\n );\n },\n };\n};\n\nexport { buildPlugin };\n"],"mappings":";;;;;;;;;;;;;;;;AAuBA,MAAM,eAAe,SAAyC;CAC1D,MAAM,QAA8B,KAAK;CAEzC,MAAM,gFAA0C,KAAK,GAAG;CAExD,OAAO;EACH,MAAM;EACN,OAAO;EACP,MAAM,MAAM,KAAsC;GAC9C,MAAM,YAA2BA,yBAAa,KAAK,OAAO;GAE1D,IAAI,qBAEI,QACA,EAAE,yBACc;IAChB,MAAM,iBAAgC;KAClC,QAAQ,EACJ,OAAO,EACH,OAAOC,2BACX,EACJ;KACA,QAAQ;MACJ,QAAQ;MACR,UAAU,MAAM;MAChB,MAAM,KAAK;KACf;IACJ;IAKA,IAAI,MAAM,WAAW,cACjB,eAAe,SAAS;KACpB,GAAG,eAAe;KAClB,SAAS,CACL,GAAI,eAAe,QAAQ,WAAW,CAAC,GACvC,wBACJ;IACJ;IAGJ,OAAO,mBAAmB,QAAQ,cAAc;GACpD,CACJ;GAEA,IAAI,oBAEI,OACA,EAAE,aACK;IAEP,MACK,OAAO,aAAa,CAAC,CACrB,IAAI,OAAO,SAAS,uBAAuB,CACxC,EACI,WAAW,EACf,CACJ,CAAC;IAGL,MACK,OAAO,iBAAiB,CAAC,CACzB,IAAI,OAAO,YAAY,sBAAsB,CAC1C,GACKA,sGAAuC;KACpC,GAAG;KACH,aAAaC;IACjB,CAAC,EACL,CACJ,CAAC;GACT,CACJ;GAEA,IAAI,oBACC,QAAQ,EAAE,kBAAwC;IAC/C,MAAM,WAAoB,YAAY,SAAS;IAE/C,MAAM,gBAAqC,CACvC,GAAGC,4BACH,QACJ;IAEA,MAAM,iBAAuC;KACzC,SAAS;;AAEL,gBAAgB,CACZ,KAAK,SACL,KACJ,EACJ;KACA,QAAQ;KAGR,MAAM;MACF,WAAW;MACX,YAAY;KAChB;KACA,cAAc;MACV,UAAU,MAAM;MAChB,aAAa;MACb,cAAc;KAClB;IACJ;IAIA,IAAI,MAAM,WAAW,YAAY;KAS7B,MAAM,eAAyB;MAP3B,GAAG,OAAO,KAAK,YAAY,gBAAgB,CAAC,CAAC;MAC7C,GAAG,OAAO,KAAK,YAAY,oBAAoB,CAAC,CAAC;MACjD,GAAG,OAAO,KACN,YAAY,wBAAwB,CAAC,CACzC;KAGkC,CAAC,CAAC,KACnC,SACG,IAAI,OACA,IAAI,KAAK,QAAQ,uBAAuB,OAAO,GAAG,KAAK,EAAE,UAC7D,CACR;KAEA,eAAe,YAAY,CACvB,GAAG,eACH,GAAG,YACP;KAEA,eAAe,gBAAgB,WACzB,kBACA;IACV;IAIA,IAAI,MAAM,WAAW,cACjB,eAAe,YAAY;IAK/B,IAAI,MAAM,WAAW,UACjB,eAAe,SAAS;KACpB,GAAG,eAAe;KAClB,UAAU,MAAM;KAChB,SAAS,KAAK;KACd,GAAI,WACE,EACI,QAAQ,KACZ,IACA,CAAC;IACX;IAKJ,IAAI,MAAM,WAAW,WACjB,eAAe,SAAS;KACpB,GAAG,eAAe;KAClB,UAAU,MAAM;KAChB,SAAS;MACL,MAAM,WAAW,WAAW;MAC5B,QAAQ;KACZ;KACA,GAAI,WACE,EACI,QAAQ,KACZ,IACA,CAAC;IACX;IAGJ,OAAO,YAAY,QAAQ,cAAc;GAC7C,CACJ;EACJ;CACJ;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/plugins/build/index.ts"],"sourcesContent":["import type {\n ModifyBundlerChainUtils,\n RsbuildConfig,\n RsbuildPlugin,\n RsbuildPluginAPI,\n Rspack,\n RspackChain,\n} from \"@rsbuild/core\";\nimport type {\n ResolvedBuildOptions,\n ResolvedOptions,\n} from \"@srvkit/common/@types/options/resolved\";\nimport type { PackageJson } from \"@srvkit/common/functions/package/package-json\";\n\nimport { builtinModules } from \"node:module\";\n\nimport { createVirtualEntryCode } from \"@srvkit/common/functions/build/virtual-entry\";\nimport { getPackageJson } from \"@srvkit/common/functions/package/package-json\";\n\nimport { VIRTUAL_ENTRY } from \"#/constants/path\";\nimport { getSsrTarget } from \"#/functions/ssr\";\nimport { name } from \"#/root/package.json\";\n\nconst buildPlugin = (opts: ResolvedOptions): RsbuildPlugin => {\n const build: ResolvedBuildOptions = opts.build;\n\n const packageJson: PackageJson = getPackageJson(opts.cwd);\n\n return {\n name: \"srvkit:build\",\n apply: \"build\",\n async setup(api: RsbuildPluginAPI): Promise<void> {\n const ssrTarget: Rspack.Target = getSsrTarget(opts.runtime);\n\n api.modifyRsbuildConfig(\n (\n config: RsbuildConfig,\n { mergeRsbuildConfig },\n ): RsbuildConfig => {\n const overrideConfig: RsbuildConfig = {\n source: {\n entry: {\n index: VIRTUAL_ENTRY,\n },\n },\n output: {\n target: \"node\",\n distPath: build.outputDir,\n copy: void 0,\n },\n };\n\n // Enforce the bundler to apply SWC configuration to third-party dependencies\n if (build.bundle === \"standalone\") {\n overrideConfig.source = {\n ...overrideConfig.source,\n include: [\n ...(overrideConfig.source?.include ?? []),\n /[\\\\/]node_modules[\\\\/]/,\n ],\n };\n }\n\n return mergeRsbuildConfig(config, overrideConfig);\n },\n );\n\n api.modifyBundlerChain(\n (\n chain: RspackChain,\n { rspack }: ModifyBundlerChainUtils,\n ): void => {\n // Avoid externalizing chunks\n chain\n .plugin(\"limit-chunk\")\n .use(rspack.optimize.LimitChunkCountPlugin, [\n {\n maxChunks: 1,\n },\n ]);\n\n // Add support for virtual modules\n chain\n .plugin(\"virtual-modules\")\n .use(rspack.experiments.VirtualModulesPlugin, [\n {\n [VIRTUAL_ENTRY]: createVirtualEntryCode({\n ...opts,\n packageName: name,\n }),\n },\n ]);\n },\n );\n\n api.modifyRspackConfig(\n (config, { mergeConfig }): Rspack.Configuration => {\n const isModule: boolean = packageJson.type === \"module\";\n\n const nodeExternals: (string | RegExp)[] = [\n ...builtinModules,\n /^node:/,\n ];\n\n const overrideConfig: Rspack.Configuration = {\n resolve: {\n /** @see https://rspack.rs/config/resolve#extend-default-value */\n conditionNames: [\n opts.runtime,\n \"...\", // Default values\n ],\n },\n target: ssrTarget,\n node: {\n __dirname: false,\n __filename: false,\n },\n optimization: {\n minimize: build.minify,\n splitChunks: false,\n runtimeChunk: false,\n },\n };\n\n // bundle: external\n\n if (build.bundle === \"external\") {\n const depNames: string[] = [\n ...Object.keys(packageJson.dependencies ?? {}),\n ...Object.keys(packageJson.peerDependencies ?? {}),\n ...Object.keys(\n packageJson.optionalDependencies ?? {},\n ),\n ];\n\n const depExternals: RegExp[] = depNames.map(\n (name: string): RegExp =>\n new RegExp(\n `^${name.replace(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`)}([\\\\/]|$)`,\n ),\n );\n\n overrideConfig.externals = [\n ...nodeExternals,\n ...depExternals,\n ];\n\n overrideConfig.externalsType = isModule\n ? \"module-import\"\n : \"commonjs\";\n }\n\n // bundle: standalone\n\n if (build.bundle === \"standalone\") {\n overrideConfig.externals = nodeExternals;\n }\n\n // target: server\n\n if (build.target === \"server\") {\n overrideConfig.output = {\n ...overrideConfig.output,\n filename: build.outputFile,\n library: void 0,\n ...(isModule\n ? {\n module: true,\n }\n : {}),\n };\n }\n\n // target: handler\n\n if (build.target === \"handler\") {\n overrideConfig.output = {\n ...overrideConfig.output,\n filename: build.outputFile,\n library: {\n type: isModule ? \"module\" : \"commonjs2\",\n export: \"default\",\n },\n ...(isModule\n ? {\n module: true,\n }\n : {}),\n };\n }\n\n return mergeConfig(config, overrideConfig);\n },\n );\n },\n };\n};\n\nexport { buildPlugin };\n"],"mappings":";;;;;;;;;;;;;;;AAuBA,MAAM,eAAe,SAAyC;CAC1D,MAAM,QAA8B,KAAK;CAEzC,MAAM,cAA2B,eAAe,KAAK,GAAG;CAExD,OAAO;EACH,MAAM;EACN,OAAO;EACP,MAAM,MAAM,KAAsC;GAC9C,MAAM,YAA2B,aAAa,KAAK,OAAO;GAE1D,IAAI,qBAEI,QACA,EAAE,yBACc;IAChB,MAAM,iBAAgC;KAClC,QAAQ,EACJ,OAAO,EACH,OAAO,cACX,EACJ;KACA,QAAQ;MACJ,QAAQ;MACR,UAAU,MAAM;MAChB,MAAM,KAAK;KACf;IACJ;IAGA,IAAI,MAAM,WAAW,cACjB,eAAe,SAAS;KACpB,GAAG,eAAe;KAClB,SAAS,CACL,GAAI,eAAe,QAAQ,WAAW,CAAC,GACvC,wBACJ;IACJ;IAGJ,OAAO,mBAAmB,QAAQ,cAAc;GACpD,CACJ;GAEA,IAAI,oBAEI,OACA,EAAE,aACK;IAEP,MACK,OAAO,aAAa,CAAC,CACrB,IAAI,OAAO,SAAS,uBAAuB,CACxC,EACI,WAAW,EACf,CACJ,CAAC;IAGL,MACK,OAAO,iBAAiB,CAAC,CACzB,IAAI,OAAO,YAAY,sBAAsB,CAC1C,GACK,gBAAgB,uBAAuB;KACpC,GAAG;KACH,aAAa;IACjB,CAAC,EACL,CACJ,CAAC;GACT,CACJ;GAEA,IAAI,oBACC,QAAQ,EAAE,kBAAwC;IAC/C,MAAM,WAAoB,YAAY,SAAS;IAE/C,MAAM,gBAAqC,CACvC,GAAG,gBACH,QACJ;IAEA,MAAM,iBAAuC;KACzC,SAAS;;AAEL,gBAAgB,CACZ,KAAK,SACL,KACJ,EACJ;KACA,QAAQ;KACR,MAAM;MACF,WAAW;MACX,YAAY;KAChB;KACA,cAAc;MACV,UAAU,MAAM;MAChB,aAAa;MACb,cAAc;KAClB;IACJ;IAIA,IAAI,MAAM,WAAW,YAAY;KAS7B,MAAM,eAAyB;MAP3B,GAAG,OAAO,KAAK,YAAY,gBAAgB,CAAC,CAAC;MAC7C,GAAG,OAAO,KAAK,YAAY,oBAAoB,CAAC,CAAC;MACjD,GAAG,OAAO,KACN,YAAY,wBAAwB,CAAC,CACzC;KAGkC,CAAC,CAAC,KACnC,SACG,IAAI,OACA,IAAI,KAAK,QAAQ,uBAAuB,OAAO,GAAG,KAAK,EAAE,UAC7D,CACR;KAEA,eAAe,YAAY,CACvB,GAAG,eACH,GAAG,YACP;KAEA,eAAe,gBAAgB,WACzB,kBACA;IACV;IAIA,IAAI,MAAM,WAAW,cACjB,eAAe,YAAY;IAK/B,IAAI,MAAM,WAAW,UACjB,eAAe,SAAS;KACpB,GAAG,eAAe;KAClB,UAAU,MAAM;KAChB,SAAS,KAAK;KACd,GAAI,WACE,EACI,QAAQ,KACZ,IACA,CAAC;IACX;IAKJ,IAAI,MAAM,WAAW,WACjB,eAAe,SAAS;KACpB,GAAG,eAAe;KAClB,UAAU,MAAM;KAChB,SAAS;MACL,MAAM,WAAW,WAAW;MAC5B,QAAQ;KACZ;KACA,GAAI,WACE,EACI,QAAQ,KACZ,IACA,CAAC;IACX;IAGJ,OAAO,YAAY,QAAQ,cAAc;GAC7C,CACJ;EACJ;CACJ;AACJ"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/plugins/build/index.ts"],"sourcesContent":["import type {\n ModifyBundlerChainUtils,\n RsbuildConfig,\n RsbuildPlugin,\n RsbuildPluginAPI,\n Rspack,\n RspackChain,\n} from \"@rsbuild/core\";\nimport type {\n ResolvedBuildOptions,\n ResolvedOptions,\n} from \"@srvkit/common/@types/options/resolved\";\nimport type { PackageJson } from \"@srvkit/common/functions/package/package-json\";\n\nimport { builtinModules } from \"node:module\";\n\nimport { createVirtualEntryCode } from \"@srvkit/common/functions/build/virtual-entry\";\nimport { getPackageJson } from \"@srvkit/common/functions/package/package-json\";\n\nimport { VIRTUAL_ENTRY } from \"#/constants/path\";\nimport { getSsrTarget } from \"#/functions/ssr\";\nimport { name } from \"#/root/package.json\";\n\nconst buildPlugin = (opts: ResolvedOptions): RsbuildPlugin => {\n const build: ResolvedBuildOptions = opts.build;\n\n const packageJson: PackageJson = getPackageJson(opts.cwd);\n\n return {\n name: \"srvkit:build\",\n apply: \"build\",\n async setup(api: RsbuildPluginAPI): Promise<void> {\n const ssrTarget: Rspack.Target = getSsrTarget(opts.runtime);\n\n api.modifyRsbuildConfig(\n (\n config: RsbuildConfig,\n { mergeRsbuildConfig },\n ): RsbuildConfig => {\n const overrideConfig: RsbuildConfig = {\n source: {\n entry: {\n index: VIRTUAL_ENTRY,\n },\n },\n output: {\n target: \"node\",\n distPath: build.outputDir,\n copy: void 0, // Handled by copyPlugin instead\n },\n };\n\n // In standalone mode, force the bundler to process node_modules through SWC\n // so transpilation config (e.g. decorators, class properties) applies to deps too.\n // Without this, Rsbuild skips transforming node_modules by default.\n if (build.bundle === \"standalone\") {\n overrideConfig.source = {\n ...overrideConfig.source,\n include: [\n ...(overrideConfig.source?.include ?? []),\n /[\\\\/]node_modules[\\\\/]/,\n ],\n };\n }\n\n return mergeRsbuildConfig(config, overrideConfig);\n },\n );\n\n api.modifyBundlerChain(\n (\n chain: RspackChain,\n { rspack }: ModifyBundlerChainUtils,\n ): void => {\n // Avoid externalizing chunks\n chain\n .plugin(\"limit-chunk\")\n .use(rspack.optimize.LimitChunkCountPlugin, [\n {\n maxChunks: 1,\n },\n ]);\n\n // Add support for virtual modules\n chain\n .plugin(\"virtual-modules\")\n .use(rspack.experiments.VirtualModulesPlugin, [\n {\n [VIRTUAL_ENTRY]: createVirtualEntryCode({\n ...opts,\n packageName: name,\n }),\n },\n ]);\n },\n );\n\n api.modifyRspackConfig(\n (config, { mergeConfig }): Rspack.Configuration => {\n const isModule: boolean = packageJson.type === \"module\";\n\n const nodeExternals: (string | RegExp)[] = [\n ...builtinModules,\n /^node:/,\n ];\n\n const overrideConfig: Rspack.Configuration = {\n resolve: {\n /** @see https://rspack.rs/config/resolve#extend-default-value */\n conditionNames: [\n opts.runtime,\n \"...\", // Default values\n ],\n },\n target: ssrTarget,\n // Preserve real __dirname/__filename values instead of injecting\n // Rspack polyfills — server code should use the real Node values\n node: {\n __dirname: false,\n __filename: false,\n },\n optimization: {\n minimize: build.minify,\n splitChunks: false,\n runtimeChunk: false,\n },\n };\n\n // bundle: external\n\n if (build.bundle === \"external\") {\n const depNames: string[] = [\n ...Object.keys(packageJson.dependencies ?? {}),\n ...Object.keys(packageJson.peerDependencies ?? {}),\n ...Object.keys(\n packageJson.optionalDependencies ?? {},\n ),\n ];\n\n const depExternals: RegExp[] = depNames.map(\n (name: string): RegExp =>\n new RegExp(\n `^${name.replace(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`)}([\\\\/]|$)`,\n ),\n );\n\n overrideConfig.externals = [\n ...nodeExternals,\n ...depExternals,\n ];\n\n overrideConfig.externalsType = isModule\n ? \"module-import\"\n : \"commonjs\";\n }\n\n // bundle: standalone\n\n if (build.bundle === \"standalone\") {\n overrideConfig.externals = nodeExternals;\n }\n\n // target: server\n\n if (build.target === \"server\") {\n overrideConfig.output = {\n ...overrideConfig.output,\n filename: build.outputFile,\n library: void 0, // Server target is self-starting\n ...(isModule\n ? {\n module: true,\n }\n : {}),\n };\n }\n\n // target: handler\n\n if (build.target === \"handler\") {\n overrideConfig.output = {\n ...overrideConfig.output,\n filename: build.outputFile,\n library: {\n type: isModule ? \"module\" : \"commonjs2\",\n export: \"default\",\n },\n ...(isModule\n ? {\n module: true,\n }\n : {}),\n };\n }\n\n return mergeConfig(config, overrideConfig);\n },\n );\n },\n };\n};\n\nexport { buildPlugin };\n"],"mappings":";;;;;;;;;;;;;;;AAuBA,MAAM,eAAe,SAAyC;CAC1D,MAAM,QAA8B,KAAK;CAEzC,MAAM,cAA2B,eAAe,KAAK,GAAG;CAExD,OAAO;EACH,MAAM;EACN,OAAO;EACP,MAAM,MAAM,KAAsC;GAC9C,MAAM,YAA2B,aAAa,KAAK,OAAO;GAE1D,IAAI,qBAEI,QACA,EAAE,yBACc;IAChB,MAAM,iBAAgC;KAClC,QAAQ,EACJ,OAAO,EACH,OAAO,cACX,EACJ;KACA,QAAQ;MACJ,QAAQ;MACR,UAAU,MAAM;MAChB,MAAM,KAAK;KACf;IACJ;IAKA,IAAI,MAAM,WAAW,cACjB,eAAe,SAAS;KACpB,GAAG,eAAe;KAClB,SAAS,CACL,GAAI,eAAe,QAAQ,WAAW,CAAC,GACvC,wBACJ;IACJ;IAGJ,OAAO,mBAAmB,QAAQ,cAAc;GACpD,CACJ;GAEA,IAAI,oBAEI,OACA,EAAE,aACK;IAEP,MACK,OAAO,aAAa,CAAC,CACrB,IAAI,OAAO,SAAS,uBAAuB,CACxC,EACI,WAAW,EACf,CACJ,CAAC;IAGL,MACK,OAAO,iBAAiB,CAAC,CACzB,IAAI,OAAO,YAAY,sBAAsB,CAC1C,GACK,gBAAgB,uBAAuB;KACpC,GAAG;KACH,aAAa;IACjB,CAAC,EACL,CACJ,CAAC;GACT,CACJ;GAEA,IAAI,oBACC,QAAQ,EAAE,kBAAwC;IAC/C,MAAM,WAAoB,YAAY,SAAS;IAE/C,MAAM,gBAAqC,CACvC,GAAG,gBACH,QACJ;IAEA,MAAM,iBAAuC;KACzC,SAAS;;AAEL,gBAAgB,CACZ,KAAK,SACL,KACJ,EACJ;KACA,QAAQ;KAGR,MAAM;MACF,WAAW;MACX,YAAY;KAChB;KACA,cAAc;MACV,UAAU,MAAM;MAChB,aAAa;MACb,cAAc;KAClB;IACJ;IAIA,IAAI,MAAM,WAAW,YAAY;KAS7B,MAAM,eAAyB;MAP3B,GAAG,OAAO,KAAK,YAAY,gBAAgB,CAAC,CAAC;MAC7C,GAAG,OAAO,KAAK,YAAY,oBAAoB,CAAC,CAAC;MACjD,GAAG,OAAO,KACN,YAAY,wBAAwB,CAAC,CACzC;KAGkC,CAAC,CAAC,KACnC,SACG,IAAI,OACA,IAAI,KAAK,QAAQ,uBAAuB,OAAO,GAAG,KAAK,EAAE,UAC7D,CACR;KAEA,eAAe,YAAY,CACvB,GAAG,eACH,GAAG,YACP;KAEA,eAAe,gBAAgB,WACzB,kBACA;IACV;IAIA,IAAI,MAAM,WAAW,cACjB,eAAe,YAAY;IAK/B,IAAI,MAAM,WAAW,UACjB,eAAe,SAAS;KACpB,GAAG,eAAe;KAClB,UAAU,MAAM;KAChB,SAAS,KAAK;KACd,GAAI,WACE,EACI,QAAQ,KACZ,IACA,CAAC;IACX;IAKJ,IAAI,MAAM,WAAW,WACjB,eAAe,SAAS;KACpB,GAAG,eAAe;KAClB,UAAU,MAAM;KAChB,SAAS;MACL,MAAM,WAAW,WAAW;MAC5B,QAAQ;KACZ;KACA,GAAI,WACE,EACI,QAAQ,KACZ,IACA,CAAC;IACX;IAGJ,OAAO,YAAY,QAAQ,cAAc;GAC7C,CACJ;EACJ;CACJ;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["getSsrTarget","VIRTUAL_ENTRY","builtinModules","Path","Fsp"],"sources":["../../../src/plugins/dev/index.ts"],"sourcesContent":["import type HTTP from \"node:http\";\n\nimport type {\n ModifyBundlerChainUtils,\n RsbuildConfig,\n RsbuildPlugin,\n RsbuildPluginAPI,\n Rspack,\n RspackChain,\n} from \"@rsbuild/core\";\nimport type {\n ResolvedBuildOptions,\n ResolvedDevOptions,\n ResolvedHttpsOptions,\n ResolvedOptions,\n} from \"@srvkit/common/@types/options/resolved\";\nimport type { Server, ServerOptions } from \"@srvkit/common/@types/server\";\nimport type { PackageJson } from \"@srvkit/common/functions/package/package-json\";\n\nimport * as Fsp from \"node:fs/promises\";\nimport { builtinModules } from \"node:module\";\nimport * as Path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport { toHeaders } from \"@srvkit/common/functions/http/request/header\";\nimport { writeHttpResponse } from \"@srvkit/common/functions/http/response/write\";\nimport { getPackageJson } from \"@srvkit/common/functions/package/package-json\";\nimport { toPosix } from \"@srvkit/common/functions/path/posix\";\nimport { createLiveServer } from \"@srvkit/common/functions/server/live\";\n\nimport { VIRTUAL_ENTRY } from \"#/constants/path\";\nimport { getSsrTarget } from \"#/functions/ssr\";\n\ntype CreateMiddlewareOptions = {\n server: Server;\n isHttps: boolean;\n port: number;\n};\n\nconst createMiddleware = ({\n server,\n isHttps,\n port,\n}: CreateMiddlewareOptions) => {\n return async (\n req: HTTP.IncomingMessage,\n res: HTTP.ServerResponse,\n ): Promise<void> => {\n const protocol: string = `http${isHttps ? \"s\" : \"\"}`;\n\n const host: string = server.options.hostname ?? \"localhost\";\n\n const path: string = req.url ?? \"\";\n\n const url: URL = new URL(`${protocol}://${host}:${port}${path}`);\n\n const body: HTTP.IncomingMessage | undefined =\n req.method !== \"GET\" && req.method !== \"HEAD\" ? req : void 0;\n\n const request: Request = new Request(url, {\n method: req.method,\n headers: toHeaders(req.headers),\n // @ts-expect-error\n body,\n duplex: \"half\",\n });\n\n const response: Response = await server.fetch(request);\n\n await writeHttpResponse({\n response,\n httpResponse: res,\n });\n };\n};\n\ntype Middleware = ReturnType<typeof createMiddleware>;\n\nconst createDevVirtualEntryCode = (opts: ResolvedOptions): string => {\n let code: string = \"\";\n\n code += `import options from \"${toPosix(opts.entry)}\";`;\n code += `export default options;`;\n\n return code;\n};\n\nconst devPlugin = (opts: ResolvedOptions): RsbuildPlugin => {\n const dev: ResolvedDevOptions = opts.dev;\n const https: ResolvedHttpsOptions = opts.dev.https ?? {};\n const build: ResolvedBuildOptions = opts.build;\n\n const isHttps: boolean = https.cert !== void 0 && https.key !== void 0;\n\n const packageJson: PackageJson = getPackageJson(opts.cwd);\n\n return {\n name: \"srvkit:dev\",\n apply: \"serve\",\n async setup(api: RsbuildPluginAPI): Promise<void> {\n let middleware: Middleware | undefined;\n\n let liveUpdate: ((options: ServerOptions) => void) | undefined;\n\n let port: number;\n\n let compileCount: number = 0;\n\n const ssrTarget: Rspack.Target = getSsrTarget(opts.runtime);\n\n api.modifyRsbuildConfig(\n (\n config: RsbuildConfig,\n { mergeRsbuildConfig },\n ): RsbuildConfig => {\n const overrideConfig: RsbuildConfig = {\n source: {\n entry: {\n index: VIRTUAL_ENTRY,\n },\n },\n output: {\n target: \"node\",\n distPath: build.outputDir,\n copy: void 0,\n },\n dev: {\n writeToDisk: true,\n },\n server: {\n host: dev.host,\n port: dev.port,\n ...(https.cert !== void 0 && https.key !== void 0\n ? {\n https: {\n cert: https.cert,\n key: https.key,\n passphrase: https.passphrase,\n },\n }\n : {}),\n },\n };\n\n return mergeRsbuildConfig(config, overrideConfig);\n },\n );\n\n api.modifyBundlerChain(\n (\n chain: RspackChain,\n { rspack }: ModifyBundlerChainUtils,\n ): void => {\n // Add support for virtual modules\n chain\n .plugin(\"virtual-modules\")\n .use(rspack.experiments.VirtualModulesPlugin, [\n {\n [VIRTUAL_ENTRY]:\n createDevVirtualEntryCode(opts),\n },\n ]);\n },\n );\n\n api.modifyRspackConfig(\n (config, { mergeConfig }): Rspack.Configuration => {\n const isModule: boolean = packageJson.type === \"module\";\n\n const nodeExternals: (string | RegExp)[] = [\n ...builtinModules,\n /^node:/,\n ];\n\n const overrideConfig: Rspack.Configuration = {\n resolve: {\n /** @see https://rspack.rs/config/resolve#extend-default-value */\n conditionNames: [\n opts.runtime,\n \"...\", // Default values\n ],\n },\n output: {\n filename: build.outputFile,\n ...(isModule\n ? {\n module: true,\n }\n : {}),\n },\n target: ssrTarget,\n node: {\n __dirname: false,\n __filename: false,\n },\n };\n\n // bundle: external\n\n if (build.bundle === \"external\") {\n const depNames: string[] = [\n ...Object.keys(packageJson.dependencies ?? {}),\n ...Object.keys(packageJson.peerDependencies ?? {}),\n ...Object.keys(\n packageJson.optionalDependencies ?? {},\n ),\n ];\n\n const depExternals: RegExp[] = depNames.map(\n (depName: string): RegExp =>\n new RegExp(\n `^${depName.replace(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`)}([\\\\/]|$)`,\n ),\n );\n\n overrideConfig.externals = [\n ...nodeExternals,\n ...depExternals,\n ];\n\n overrideConfig.externalsType = isModule\n ? \"module-import\"\n : \"commonjs\";\n }\n\n // bundle: standalone\n\n if (build.bundle === \"standalone\") {\n overrideConfig.externals = nodeExternals;\n }\n\n return mergeConfig(config, overrideConfig);\n },\n );\n\n api.onAfterDevCompile(async ({ isFirstCompile }): Promise<void> => {\n const distPath: string = api.context.distPath;\n\n const outputPath: string = Path.resolve(distPath, \"index.js\");\n\n compileCount++;\n\n // Initial compile\n\n if (isFirstCompile) {\n const serverOptions: ServerOptions = (\n await import(pathToFileURL(outputPath).href)\n ).default;\n\n const { server, update } = createLiveServer({\n gracefulShutdown: false,\n ...serverOptions,\n manual: true,\n hostname: dev.host,\n port: dev.port,\n tls: {\n cert: https.cert,\n key: https.key,\n passphrase: https.passphrase,\n },\n });\n\n liveUpdate = update;\n\n middleware = createMiddleware({\n server,\n isHttps,\n port,\n });\n\n return void 0;\n }\n\n // Live update\n\n try {\n const importPath: string = Path.resolve(\n distPath,\n `index-${compileCount}.js`,\n );\n\n await Fsp.copyFile(outputPath, importPath);\n\n const newServerOptions: ServerOptions = (\n await import(pathToFileURL(importPath).href)\n ).default;\n\n await Fsp.unlink(importPath);\n\n liveUpdate?.(newServerOptions);\n } catch {\n // Keep old handler running on error\n\n try {\n await Fsp.unlink(\n Path.resolve(distPath, `index-${compileCount}.js`),\n );\n } catch {}\n }\n });\n\n api.onBeforeStartDevServer(({ server }): void => {\n port = server.port;\n\n server.middlewares.use(\n async (\n req: HTTP.IncomingMessage,\n res: HTTP.ServerResponse,\n next: () => void,\n ): Promise<void> => {\n if (middleware === void 0) {\n next();\n\n return void 0;\n }\n\n return middleware(req, res);\n },\n );\n });\n },\n };\n};\n\nexport { devPlugin };\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["getSsrTarget","VIRTUAL_ENTRY","builtinModules","Path","Fsp"],"sources":["../../../src/plugins/dev/index.ts"],"sourcesContent":["import type HTTP from \"node:http\";\n\nimport type {\n ModifyBundlerChainUtils,\n RsbuildConfig,\n RsbuildPlugin,\n RsbuildPluginAPI,\n Rspack,\n RspackChain,\n} from \"@rsbuild/core\";\nimport type {\n ResolvedBuildOptions,\n ResolvedDevOptions,\n ResolvedHttpsOptions,\n ResolvedOptions,\n} from \"@srvkit/common/@types/options/resolved\";\nimport type { Server, ServerOptions } from \"@srvkit/common/@types/server\";\nimport type { PackageJson } from \"@srvkit/common/functions/package/package-json\";\n\nimport * as Fsp from \"node:fs/promises\";\nimport { builtinModules } from \"node:module\";\nimport * as Path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport { toHeaders } from \"@srvkit/common/functions/http/request/header\";\nimport { writeHttpResponse } from \"@srvkit/common/functions/http/response/write\";\nimport { getPackageJson } from \"@srvkit/common/functions/package/package-json\";\nimport { toPosix } from \"@srvkit/common/functions/path/posix\";\nimport { createLiveServer } from \"@srvkit/common/functions/server/live\";\n\nimport { VIRTUAL_ENTRY } from \"#/constants/path\";\nimport { getSsrTarget } from \"#/functions/ssr\";\n\ntype CreateMiddlewareOptions = {\n server: Server;\n isHttps: boolean;\n port: number;\n};\n\nconst createMiddleware = ({\n server,\n isHttps,\n port,\n}: CreateMiddlewareOptions) => {\n return async (\n req: HTTP.IncomingMessage,\n res: HTTP.ServerResponse,\n ): Promise<void> => {\n const protocol: string = `http${isHttps ? \"s\" : \"\"}`;\n\n const host: string = server.options.hostname ?? \"localhost\";\n\n const path: string = req.url ?? \"\";\n\n const url: URL = new URL(`${protocol}://${host}:${port}${path}`);\n\n // GET and HEAD requests must not have a body per HTTP spec\n const body: HTTP.IncomingMessage | undefined =\n req.method !== \"GET\" && req.method !== \"HEAD\" ? req : void 0;\n\n const request: Request = new Request(url, {\n method: req.method,\n headers: toHeaders(req.headers),\n // @ts-expect-error\n body,\n // Required for streaming request bodies in Node's fetch implementation\n duplex: \"half\",\n });\n\n const response: Response = await server.fetch(request);\n\n await writeHttpResponse({\n response,\n httpResponse: res,\n });\n };\n};\n\ntype Middleware = ReturnType<typeof createMiddleware>;\n\nconst createDevVirtualEntryCode = (opts: ResolvedOptions): string => {\n let code: string = \"\";\n\n code += `import options from \"${toPosix(opts.entry)}\";`;\n code += `export default options;`;\n\n return code;\n};\n\nconst devPlugin = (opts: ResolvedOptions): RsbuildPlugin => {\n const dev: ResolvedDevOptions = opts.dev;\n const https: ResolvedHttpsOptions = opts.dev.https ?? {};\n const build: ResolvedBuildOptions = opts.build;\n\n const isHttps: boolean = https.cert !== void 0 && https.key !== void 0;\n\n const packageJson: PackageJson = getPackageJson(opts.cwd);\n\n return {\n name: \"srvkit:dev\",\n apply: \"serve\",\n async setup(api: RsbuildPluginAPI): Promise<void> {\n let middleware: Middleware | undefined;\n\n let liveUpdate: ((options: ServerOptions) => void) | undefined;\n\n let port: number;\n\n let compileCount: number = 0;\n\n const ssrTarget: Rspack.Target = getSsrTarget(opts.runtime);\n\n api.modifyRsbuildConfig(\n (\n config: RsbuildConfig,\n { mergeRsbuildConfig },\n ): RsbuildConfig => {\n const overrideConfig: RsbuildConfig = {\n source: {\n entry: {\n index: VIRTUAL_ENTRY,\n },\n },\n output: {\n target: \"node\",\n distPath: build.outputDir,\n copy: void 0,\n },\n dev: {\n // Live reload imports the compiled file from disk,\n // so it must be written out\n writeToDisk: true,\n },\n server: {\n host: dev.host,\n port: dev.port,\n ...(https.cert !== void 0 && https.key !== void 0\n ? {\n https: {\n cert: https.cert,\n key: https.key,\n passphrase: https.passphrase,\n },\n }\n : {}),\n },\n };\n\n return mergeRsbuildConfig(config, overrideConfig);\n },\n );\n\n api.modifyBundlerChain(\n (\n chain: RspackChain,\n { rspack }: ModifyBundlerChainUtils,\n ): void => {\n // Add support for virtual modules\n chain\n .plugin(\"virtual-modules\")\n .use(rspack.experiments.VirtualModulesPlugin, [\n {\n [VIRTUAL_ENTRY]:\n createDevVirtualEntryCode(opts),\n },\n ]);\n },\n );\n\n api.modifyRspackConfig(\n (config, { mergeConfig }): Rspack.Configuration => {\n const isModule: boolean = packageJson.type === \"module\";\n\n const nodeExternals: (string | RegExp)[] = [\n ...builtinModules,\n /^node:/,\n ];\n\n const overrideConfig: Rspack.Configuration = {\n resolve: {\n /** @see https://rspack.rs/config/resolve#extend-default-value */\n conditionNames: [\n opts.runtime,\n \"...\", // Default values\n ],\n },\n output: {\n filename: build.outputFile,\n ...(isModule\n ? {\n module: true,\n }\n : {}),\n },\n target: ssrTarget,\n // Preserve real __dirname/__filename values instead of injecting\n // Rspack polyfills — server code should use the real Node values\n node: {\n __dirname: false,\n __filename: false,\n },\n };\n\n // bundle: external\n\n if (build.bundle === \"external\") {\n const depNames: string[] = [\n ...Object.keys(packageJson.dependencies ?? {}),\n ...Object.keys(packageJson.peerDependencies ?? {}),\n ...Object.keys(\n packageJson.optionalDependencies ?? {},\n ),\n ];\n\n const depExternals: RegExp[] = depNames.map(\n (depName: string): RegExp =>\n new RegExp(\n `^${depName.replace(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`)}([\\\\/]|$)`,\n ),\n );\n\n overrideConfig.externals = [\n ...nodeExternals,\n ...depExternals,\n ];\n\n overrideConfig.externalsType = isModule\n ? \"module-import\"\n : \"commonjs\";\n }\n\n // bundle: standalone\n\n if (build.bundle === \"standalone\") {\n overrideConfig.externals = nodeExternals;\n }\n\n return mergeConfig(config, overrideConfig);\n },\n );\n\n api.onAfterDevCompile(async ({ isFirstCompile }): Promise<void> => {\n const distPath: string = api.context.distPath;\n\n const outputPath: string = Path.resolve(distPath, \"index.js\");\n\n compileCount++;\n\n // Initial compile\n\n if (isFirstCompile) {\n const serverOptions: ServerOptions = (\n await import(pathToFileURL(outputPath).href)\n ).default;\n\n const { server, update } = createLiveServer({\n // Prevent srvx from installing its own SIGTERM handler\n gracefulShutdown: false,\n ...serverOptions,\n // Defer server start so middleware can be attached first\n manual: true,\n hostname: dev.host,\n port: dev.port,\n tls: {\n cert: https.cert,\n key: https.key,\n passphrase: https.passphrase,\n },\n });\n\n liveUpdate = update;\n\n middleware = createMiddleware({\n server,\n isHttps,\n port,\n });\n\n return void 0;\n }\n\n // Live update\n\n try {\n // Node caches imports by URL — using a unique path forces re-import each time\n const importPath: string = Path.resolve(\n distPath,\n `index-${compileCount}.js`,\n );\n\n await Fsp.copyFile(outputPath, importPath);\n\n const newServerOptions: ServerOptions = (\n await import(pathToFileURL(importPath).href)\n ).default;\n\n // Remove the temp copy after import to avoid accumulating stale files\n await Fsp.unlink(importPath);\n\n liveUpdate?.(newServerOptions);\n } catch {\n // Keep old handler running on error\n\n try {\n await Fsp.unlink(\n Path.resolve(distPath, `index-${compileCount}.js`),\n );\n } catch {\n // Unlink may fail if the import itself threw — file may not exist\n }\n }\n });\n\n api.onBeforeStartDevServer(({ server }): void => {\n port = server.port;\n\n server.middlewares.use(\n async (\n req: HTTP.IncomingMessage,\n res: HTTP.ServerResponse,\n next: () => void,\n ): Promise<void> => {\n // Middleware may not be ready before the first compile completes\n if (middleware === void 0) {\n next();\n\n return void 0;\n }\n\n return middleware(req, res);\n },\n );\n });\n },\n };\n};\n\nexport { devPlugin };\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/plugins/dev/index.ts"],"sourcesContent":["import type HTTP from \"node:http\";\n\nimport type {\n ModifyBundlerChainUtils,\n RsbuildConfig,\n RsbuildPlugin,\n RsbuildPluginAPI,\n Rspack,\n RspackChain,\n} from \"@rsbuild/core\";\nimport type {\n ResolvedBuildOptions,\n ResolvedDevOptions,\n ResolvedHttpsOptions,\n ResolvedOptions,\n} from \"@srvkit/common/@types/options/resolved\";\nimport type { Server, ServerOptions } from \"@srvkit/common/@types/server\";\nimport type { PackageJson } from \"@srvkit/common/functions/package/package-json\";\n\nimport * as Fsp from \"node:fs/promises\";\nimport { builtinModules } from \"node:module\";\nimport * as Path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport { toHeaders } from \"@srvkit/common/functions/http/request/header\";\nimport { writeHttpResponse } from \"@srvkit/common/functions/http/response/write\";\nimport { getPackageJson } from \"@srvkit/common/functions/package/package-json\";\nimport { toPosix } from \"@srvkit/common/functions/path/posix\";\nimport { createLiveServer } from \"@srvkit/common/functions/server/live\";\n\nimport { VIRTUAL_ENTRY } from \"#/constants/path\";\nimport { getSsrTarget } from \"#/functions/ssr\";\n\ntype CreateMiddlewareOptions = {\n server: Server;\n isHttps: boolean;\n port: number;\n};\n\nconst createMiddleware = ({\n server,\n isHttps,\n port,\n}: CreateMiddlewareOptions) => {\n return async (\n req: HTTP.IncomingMessage,\n res: HTTP.ServerResponse,\n ): Promise<void> => {\n const protocol: string = `http${isHttps ? \"s\" : \"\"}`;\n\n const host: string = server.options.hostname ?? \"localhost\";\n\n const path: string = req.url ?? \"\";\n\n const url: URL = new URL(`${protocol}://${host}:${port}${path}`);\n\n const body: HTTP.IncomingMessage | undefined =\n req.method !== \"GET\" && req.method !== \"HEAD\" ? req : void 0;\n\n const request: Request = new Request(url, {\n method: req.method,\n headers: toHeaders(req.headers),\n // @ts-expect-error\n body,\n duplex: \"half\",\n });\n\n const response: Response = await server.fetch(request);\n\n await writeHttpResponse({\n response,\n httpResponse: res,\n });\n };\n};\n\ntype Middleware = ReturnType<typeof createMiddleware>;\n\nconst createDevVirtualEntryCode = (opts: ResolvedOptions): string => {\n let code: string = \"\";\n\n code += `import options from \"${toPosix(opts.entry)}\";`;\n code += `export default options;`;\n\n return code;\n};\n\nconst devPlugin = (opts: ResolvedOptions): RsbuildPlugin => {\n const dev: ResolvedDevOptions = opts.dev;\n const https: ResolvedHttpsOptions = opts.dev.https ?? {};\n const build: ResolvedBuildOptions = opts.build;\n\n const isHttps: boolean = https.cert !== void 0 && https.key !== void 0;\n\n const packageJson: PackageJson = getPackageJson(opts.cwd);\n\n return {\n name: \"srvkit:dev\",\n apply: \"serve\",\n async setup(api: RsbuildPluginAPI): Promise<void> {\n let middleware: Middleware | undefined;\n\n let liveUpdate: ((options: ServerOptions) => void) | undefined;\n\n let port: number;\n\n let compileCount: number = 0;\n\n const ssrTarget: Rspack.Target = getSsrTarget(opts.runtime);\n\n api.modifyRsbuildConfig(\n (\n config: RsbuildConfig,\n { mergeRsbuildConfig },\n ): RsbuildConfig => {\n const overrideConfig: RsbuildConfig = {\n source: {\n entry: {\n index: VIRTUAL_ENTRY,\n },\n },\n output: {\n target: \"node\",\n distPath: build.outputDir,\n copy: void 0,\n },\n dev: {\n writeToDisk: true,\n },\n server: {\n host: dev.host,\n port: dev.port,\n ...(https.cert !== void 0 && https.key !== void 0\n ? {\n https: {\n cert: https.cert,\n key: https.key,\n passphrase: https.passphrase,\n },\n }\n : {}),\n },\n };\n\n return mergeRsbuildConfig(config, overrideConfig);\n },\n );\n\n api.modifyBundlerChain(\n (\n chain: RspackChain,\n { rspack }: ModifyBundlerChainUtils,\n ): void => {\n // Add support for virtual modules\n chain\n .plugin(\"virtual-modules\")\n .use(rspack.experiments.VirtualModulesPlugin, [\n {\n [VIRTUAL_ENTRY]:\n createDevVirtualEntryCode(opts),\n },\n ]);\n },\n );\n\n api.modifyRspackConfig(\n (config, { mergeConfig }): Rspack.Configuration => {\n const isModule: boolean = packageJson.type === \"module\";\n\n const nodeExternals: (string | RegExp)[] = [\n ...builtinModules,\n /^node:/,\n ];\n\n const overrideConfig: Rspack.Configuration = {\n resolve: {\n /** @see https://rspack.rs/config/resolve#extend-default-value */\n conditionNames: [\n opts.runtime,\n \"...\", // Default values\n ],\n },\n output: {\n filename: build.outputFile,\n ...(isModule\n ? {\n module: true,\n }\n : {}),\n },\n target: ssrTarget,\n node: {\n __dirname: false,\n __filename: false,\n },\n };\n\n // bundle: external\n\n if (build.bundle === \"external\") {\n const depNames: string[] = [\n ...Object.keys(packageJson.dependencies ?? {}),\n ...Object.keys(packageJson.peerDependencies ?? {}),\n ...Object.keys(\n packageJson.optionalDependencies ?? {},\n ),\n ];\n\n const depExternals: RegExp[] = depNames.map(\n (depName: string): RegExp =>\n new RegExp(\n `^${depName.replace(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`)}([\\\\/]|$)`,\n ),\n );\n\n overrideConfig.externals = [\n ...nodeExternals,\n ...depExternals,\n ];\n\n overrideConfig.externalsType = isModule\n ? \"module-import\"\n : \"commonjs\";\n }\n\n // bundle: standalone\n\n if (build.bundle === \"standalone\") {\n overrideConfig.externals = nodeExternals;\n }\n\n return mergeConfig(config, overrideConfig);\n },\n );\n\n api.onAfterDevCompile(async ({ isFirstCompile }): Promise<void> => {\n const distPath: string = api.context.distPath;\n\n const outputPath: string = Path.resolve(distPath, \"index.js\");\n\n compileCount++;\n\n // Initial compile\n\n if (isFirstCompile) {\n const serverOptions: ServerOptions = (\n await import(pathToFileURL(outputPath).href)\n ).default;\n\n const { server, update } = createLiveServer({\n gracefulShutdown: false,\n ...serverOptions,\n manual: true,\n hostname: dev.host,\n port: dev.port,\n tls: {\n cert: https.cert,\n key: https.key,\n passphrase: https.passphrase,\n },\n });\n\n liveUpdate = update;\n\n middleware = createMiddleware({\n server,\n isHttps,\n port,\n });\n\n return void 0;\n }\n\n // Live update\n\n try {\n const importPath: string = Path.resolve(\n distPath,\n `index-${compileCount}.js`,\n );\n\n await Fsp.copyFile(outputPath, importPath);\n\n const newServerOptions: ServerOptions = (\n await import(pathToFileURL(importPath).href)\n ).default;\n\n await Fsp.unlink(importPath);\n\n liveUpdate?.(newServerOptions);\n } catch {\n // Keep old handler running on error\n\n try {\n await Fsp.unlink(\n Path.resolve(distPath, `index-${compileCount}.js`),\n );\n } catch {}\n }\n });\n\n api.onBeforeStartDevServer(({ server }): void => {\n port = server.port;\n\n server.middlewares.use(\n async (\n req: HTTP.IncomingMessage,\n res: HTTP.ServerResponse,\n next: () => void,\n ): Promise<void> => {\n if (middleware === void 0) {\n next();\n\n return void 0;\n }\n\n return middleware(req, res);\n },\n );\n });\n },\n };\n};\n\nexport { devPlugin };\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/plugins/dev/index.ts"],"sourcesContent":["import type HTTP from \"node:http\";\n\nimport type {\n ModifyBundlerChainUtils,\n RsbuildConfig,\n RsbuildPlugin,\n RsbuildPluginAPI,\n Rspack,\n RspackChain,\n} from \"@rsbuild/core\";\nimport type {\n ResolvedBuildOptions,\n ResolvedDevOptions,\n ResolvedHttpsOptions,\n ResolvedOptions,\n} from \"@srvkit/common/@types/options/resolved\";\nimport type { Server, ServerOptions } from \"@srvkit/common/@types/server\";\nimport type { PackageJson } from \"@srvkit/common/functions/package/package-json\";\n\nimport * as Fsp from \"node:fs/promises\";\nimport { builtinModules } from \"node:module\";\nimport * as Path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport { toHeaders } from \"@srvkit/common/functions/http/request/header\";\nimport { writeHttpResponse } from \"@srvkit/common/functions/http/response/write\";\nimport { getPackageJson } from \"@srvkit/common/functions/package/package-json\";\nimport { toPosix } from \"@srvkit/common/functions/path/posix\";\nimport { createLiveServer } from \"@srvkit/common/functions/server/live\";\n\nimport { VIRTUAL_ENTRY } from \"#/constants/path\";\nimport { getSsrTarget } from \"#/functions/ssr\";\n\ntype CreateMiddlewareOptions = {\n server: Server;\n isHttps: boolean;\n port: number;\n};\n\nconst createMiddleware = ({\n server,\n isHttps,\n port,\n}: CreateMiddlewareOptions) => {\n return async (\n req: HTTP.IncomingMessage,\n res: HTTP.ServerResponse,\n ): Promise<void> => {\n const protocol: string = `http${isHttps ? \"s\" : \"\"}`;\n\n const host: string = server.options.hostname ?? \"localhost\";\n\n const path: string = req.url ?? \"\";\n\n const url: URL = new URL(`${protocol}://${host}:${port}${path}`);\n\n // GET and HEAD requests must not have a body per HTTP spec\n const body: HTTP.IncomingMessage | undefined =\n req.method !== \"GET\" && req.method !== \"HEAD\" ? req : void 0;\n\n const request: Request = new Request(url, {\n method: req.method,\n headers: toHeaders(req.headers),\n // @ts-expect-error\n body,\n // Required for streaming request bodies in Node's fetch implementation\n duplex: \"half\",\n });\n\n const response: Response = await server.fetch(request);\n\n await writeHttpResponse({\n response,\n httpResponse: res,\n });\n };\n};\n\ntype Middleware = ReturnType<typeof createMiddleware>;\n\nconst createDevVirtualEntryCode = (opts: ResolvedOptions): string => {\n let code: string = \"\";\n\n code += `import options from \"${toPosix(opts.entry)}\";`;\n code += `export default options;`;\n\n return code;\n};\n\nconst devPlugin = (opts: ResolvedOptions): RsbuildPlugin => {\n const dev: ResolvedDevOptions = opts.dev;\n const https: ResolvedHttpsOptions = opts.dev.https ?? {};\n const build: ResolvedBuildOptions = opts.build;\n\n const isHttps: boolean = https.cert !== void 0 && https.key !== void 0;\n\n const packageJson: PackageJson = getPackageJson(opts.cwd);\n\n return {\n name: \"srvkit:dev\",\n apply: \"serve\",\n async setup(api: RsbuildPluginAPI): Promise<void> {\n let middleware: Middleware | undefined;\n\n let liveUpdate: ((options: ServerOptions) => void) | undefined;\n\n let port: number;\n\n let compileCount: number = 0;\n\n const ssrTarget: Rspack.Target = getSsrTarget(opts.runtime);\n\n api.modifyRsbuildConfig(\n (\n config: RsbuildConfig,\n { mergeRsbuildConfig },\n ): RsbuildConfig => {\n const overrideConfig: RsbuildConfig = {\n source: {\n entry: {\n index: VIRTUAL_ENTRY,\n },\n },\n output: {\n target: \"node\",\n distPath: build.outputDir,\n copy: void 0,\n },\n dev: {\n // Live reload imports the compiled file from disk,\n // so it must be written out\n writeToDisk: true,\n },\n server: {\n host: dev.host,\n port: dev.port,\n ...(https.cert !== void 0 && https.key !== void 0\n ? {\n https: {\n cert: https.cert,\n key: https.key,\n passphrase: https.passphrase,\n },\n }\n : {}),\n },\n };\n\n return mergeRsbuildConfig(config, overrideConfig);\n },\n );\n\n api.modifyBundlerChain(\n (\n chain: RspackChain,\n { rspack }: ModifyBundlerChainUtils,\n ): void => {\n // Add support for virtual modules\n chain\n .plugin(\"virtual-modules\")\n .use(rspack.experiments.VirtualModulesPlugin, [\n {\n [VIRTUAL_ENTRY]:\n createDevVirtualEntryCode(opts),\n },\n ]);\n },\n );\n\n api.modifyRspackConfig(\n (config, { mergeConfig }): Rspack.Configuration => {\n const isModule: boolean = packageJson.type === \"module\";\n\n const nodeExternals: (string | RegExp)[] = [\n ...builtinModules,\n /^node:/,\n ];\n\n const overrideConfig: Rspack.Configuration = {\n resolve: {\n /** @see https://rspack.rs/config/resolve#extend-default-value */\n conditionNames: [\n opts.runtime,\n \"...\", // Default values\n ],\n },\n output: {\n filename: build.outputFile,\n ...(isModule\n ? {\n module: true,\n }\n : {}),\n },\n target: ssrTarget,\n // Preserve real __dirname/__filename values instead of injecting\n // Rspack polyfills — server code should use the real Node values\n node: {\n __dirname: false,\n __filename: false,\n },\n };\n\n // bundle: external\n\n if (build.bundle === \"external\") {\n const depNames: string[] = [\n ...Object.keys(packageJson.dependencies ?? {}),\n ...Object.keys(packageJson.peerDependencies ?? {}),\n ...Object.keys(\n packageJson.optionalDependencies ?? {},\n ),\n ];\n\n const depExternals: RegExp[] = depNames.map(\n (depName: string): RegExp =>\n new RegExp(\n `^${depName.replace(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`)}([\\\\/]|$)`,\n ),\n );\n\n overrideConfig.externals = [\n ...nodeExternals,\n ...depExternals,\n ];\n\n overrideConfig.externalsType = isModule\n ? \"module-import\"\n : \"commonjs\";\n }\n\n // bundle: standalone\n\n if (build.bundle === \"standalone\") {\n overrideConfig.externals = nodeExternals;\n }\n\n return mergeConfig(config, overrideConfig);\n },\n );\n\n api.onAfterDevCompile(async ({ isFirstCompile }): Promise<void> => {\n const distPath: string = api.context.distPath;\n\n const outputPath: string = Path.resolve(distPath, \"index.js\");\n\n compileCount++;\n\n // Initial compile\n\n if (isFirstCompile) {\n const serverOptions: ServerOptions = (\n await import(pathToFileURL(outputPath).href)\n ).default;\n\n const { server, update } = createLiveServer({\n // Prevent srvx from installing its own SIGTERM handler\n gracefulShutdown: false,\n ...serverOptions,\n // Defer server start so middleware can be attached first\n manual: true,\n hostname: dev.host,\n port: dev.port,\n tls: {\n cert: https.cert,\n key: https.key,\n passphrase: https.passphrase,\n },\n });\n\n liveUpdate = update;\n\n middleware = createMiddleware({\n server,\n isHttps,\n port,\n });\n\n return void 0;\n }\n\n // Live update\n\n try {\n // Node caches imports by URL — using a unique path forces re-import each time\n const importPath: string = Path.resolve(\n distPath,\n `index-${compileCount}.js`,\n );\n\n await Fsp.copyFile(outputPath, importPath);\n\n const newServerOptions: ServerOptions = (\n await import(pathToFileURL(importPath).href)\n ).default;\n\n // Remove the temp copy after import to avoid accumulating stale files\n await Fsp.unlink(importPath);\n\n liveUpdate?.(newServerOptions);\n } catch {\n // Keep old handler running on error\n\n try {\n await Fsp.unlink(\n Path.resolve(distPath, `index-${compileCount}.js`),\n );\n } catch {\n // Unlink may fail if the import itself threw — file may not exist\n }\n }\n });\n\n api.onBeforeStartDevServer(({ server }): void => {\n port = server.port;\n\n server.middlewares.use(\n async (\n req: HTTP.IncomingMessage,\n res: HTTP.ServerResponse,\n next: () => void,\n ): Promise<void> => {\n // Middleware may not be ready before the first compile completes\n if (middleware === void 0) {\n next();\n\n return void 0;\n }\n\n return middleware(req, res);\n },\n );\n });\n },\n };\n};\n\nexport { devPlugin };\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@srvkit/rsbuild",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "A toolkit for building JavaScript server applications",
5
5
  "keywords": [
6
6
  "srvkit",
@@ -70,7 +70,7 @@
70
70
  "dist"
71
71
  ],
72
72
  "dependencies": {
73
- "@srvkit/common": "~0.1.0"
73
+ "@srvkit/common": "~0.1.1"
74
74
  },
75
75
  "devDependencies": {
76
76
  "@rsbuild/core": "2.0.0"