@srvkit/rsbuild 0.1.1 → 0.2.0

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.
Files changed (45) hide show
  1. package/README.md +1 -1
  2. package/dist/_virtual/_rolldown/runtime.js +0 -8
  3. package/dist/constants/path.js +0 -8
  4. package/dist/constants/path.js.map +1 -1
  5. package/dist/constants/path.mjs +0 -8
  6. package/dist/constants/path.mjs.map +1 -1
  7. package/dist/functions/ssr.js +0 -8
  8. package/dist/functions/ssr.js.map +1 -1
  9. package/dist/functions/ssr.mjs +0 -8
  10. package/dist/functions/ssr.mjs.map +1 -1
  11. package/dist/index.d.ts +0 -2
  12. package/dist/index.js +0 -8
  13. package/dist/index.mjs +0 -8
  14. package/dist/node.d.ts +0 -2
  15. package/dist/node.js +0 -8
  16. package/dist/node.mjs +0 -8
  17. package/dist/package.js +0 -8
  18. package/dist/package.mjs +0 -8
  19. package/dist/plugin.d.ts +3 -3
  20. package/dist/plugin.js +13 -8
  21. package/dist/plugin.mjs +2 -9
  22. package/dist/plugins/build/index.d.ts +0 -2
  23. package/dist/plugins/build/index.js +13 -20
  24. package/dist/plugins/build/index.js.map +1 -1
  25. package/dist/plugins/build/index.mjs +13 -20
  26. package/dist/plugins/build/index.mjs.map +1 -1
  27. package/dist/plugins/copy/index.d.ts +0 -2
  28. package/dist/plugins/copy/index.js +0 -8
  29. package/dist/plugins/copy/index.js.map +1 -1
  30. package/dist/plugins/copy/index.mjs +0 -8
  31. package/dist/plugins/copy/index.mjs.map +1 -1
  32. package/dist/plugins/dev/index.d.ts +0 -2
  33. package/dist/plugins/dev/index.js +35 -36
  34. package/dist/plugins/dev/index.js.map +1 -1
  35. package/dist/plugins/dev/index.mjs +35 -36
  36. package/dist/plugins/dev/index.mjs.map +1 -1
  37. package/dist/plugins/index.d.ts +0 -2
  38. package/dist/plugins/index.js +0 -8
  39. package/dist/plugins/index.js.map +1 -1
  40. package/dist/plugins/index.mjs +0 -8
  41. package/dist/plugins/index.mjs.map +1 -1
  42. package/dist/runtime.d.ts +0 -2
  43. package/dist/runtime.js +0 -8
  44. package/dist/runtime.mjs +0 -8
  45. package/package.json +3 -3
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @srvkit/rsbuild
2
2
 
3
- A toolkit for building JavaScript server applications.
3
+ A toolkit for building APIs.
4
4
 
5
5
  ## Documentation
6
6
 
@@ -1,11 +1,3 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  var __create = Object.create;
10
2
  var __defProp = Object.defineProperty;
11
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -1,12 +1,4 @@
1
1
 
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
-
10
2
  const VIRTUAL_ENTRY = "./__srvkit_entry__.js";
11
3
 
12
4
  exports.VIRTUAL_ENTRY = VIRTUAL_ENTRY;
@@ -1 +1 @@
1
- {"version":3,"file":"path.js","names":[],"sources":["../../src/constants/path.ts"],"sourcesContent":["const VIRTUAL_ENTRY = \"./__srvkit_entry__.js\" as const;\n\nexport { VIRTUAL_ENTRY };\n"],"mappings":";;;;;;;;;AAAA,MAAM,gBAAgB"}
1
+ {"version":3,"file":"path.js","names":[],"sources":["../../src/constants/path.ts"],"sourcesContent":["const VIRTUAL_ENTRY = \"./__srvkit_entry__.js\" as const;\n\nexport { VIRTUAL_ENTRY };\n"],"mappings":";AAAA,MAAM,gBAAgB"}
@@ -1,11 +1,3 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  const VIRTUAL_ENTRY = "./__srvkit_entry__.js";
10
2
 
11
3
  export { VIRTUAL_ENTRY };
@@ -1 +1 @@
1
- {"version":3,"file":"path.mjs","names":[],"sources":["../../src/constants/path.ts"],"sourcesContent":["const VIRTUAL_ENTRY = \"./__srvkit_entry__.js\" as const;\n\nexport { VIRTUAL_ENTRY };\n"],"mappings":";;;;;;;;AAAA,MAAM,gBAAgB"}
1
+ {"version":3,"file":"path.mjs","names":[],"sources":["../../src/constants/path.ts"],"sourcesContent":["const VIRTUAL_ENTRY = \"./__srvkit_entry__.js\" as const;\n\nexport { VIRTUAL_ENTRY };\n"],"mappings":"AAAA,MAAM,gBAAgB"}
@@ -1,12 +1,4 @@
1
1
 
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
-
10
2
  const getSsrTarget = (runtime) => {
11
3
  switch (runtime) {
12
4
  case "workerd": return "webworker";
@@ -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 // 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
+ {"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,11 +1,3 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  const getSsrTarget = (runtime) => {
10
2
  switch (runtime) {
11
3
  case "workerd": return "webworker";
@@ -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 // 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
+ {"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,3 @@
1
- import __tsdown_shims_path from 'node:path';
2
- import __tsdown_shims_url from 'node:url';
3
1
  import { ErrorHandler, Server, ServerHandler, ServerMiddleware, ServerOptions, ServerPlugin, ServerRequest } from "@srvkit/common/@types/server";
4
2
  import { defineServer } from "@srvkit/common/functions/server/define";
5
3
  export { type ErrorHandler, type Server, type ServerHandler, type ServerMiddleware, type ServerOptions, type ServerPlugin, type ServerRequest, defineServer };
package/dist/index.js CHANGED
@@ -1,11 +1,3 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
10
2
  let _srvkit_common_functions_server_define = require("@srvkit/common/functions/server/define");
11
3
 
package/dist/index.mjs CHANGED
@@ -1,11 +1,3 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  import { defineServer } from "@srvkit/common/functions/server/define";
10
2
 
11
3
  export { defineServer };
package/dist/node.d.ts CHANGED
@@ -1,5 +1,3 @@
1
- import __tsdown_shims_path from 'node:path';
2
- import __tsdown_shims_url from 'node:url';
3
1
  import { AdapterMeta, FetchHandler, NodeHttpHandler } from "@srvkit/common/@types/node";
4
2
  import { toFetchHandler } from "@srvkit/common/node";
5
3
  export { type AdapterMeta, type FetchHandler, type NodeHttpHandler, toFetchHandler };
package/dist/node.js CHANGED
@@ -1,11 +1,3 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
10
2
  let _srvkit_common_node = require("@srvkit/common/node");
11
3
 
package/dist/node.mjs CHANGED
@@ -1,11 +1,3 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  import { toFetchHandler } from "@srvkit/common/node";
10
2
 
11
3
  export { toFetchHandler };
package/dist/package.js CHANGED
@@ -1,12 +1,4 @@
1
1
 
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
-
10
2
  var name = "@srvkit/rsbuild";
11
3
 
12
4
  Object.defineProperty(exports, 'name', {
package/dist/package.mjs CHANGED
@@ -1,11 +1,3 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  var name = "@srvkit/rsbuild";
10
2
 
11
3
  export { name };
package/dist/plugin.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import __tsdown_shims_path from 'node:path';
2
- import __tsdown_shims_url from 'node:url';
3
1
  import { plugin } from "./plugins/index.js";
2
+ import { ResolvableNumber, ResolvableString } from "@srvkit/common/@types/env";
4
3
  import { Runtime } from "@srvkit/common/@types/options/complete";
5
4
  import { BuildTarget, BundleMode } from "@srvkit/common/@types/options/complete/build";
6
5
  import { BuildOptions, DevOptions, HttpsOptions, Options } from "@srvkit/common/@types/options/default";
7
- export { type BuildOptions, type BuildTarget, type BundleMode, type DevOptions, type HttpsOptions, type Options, type Runtime, plugin as pluginSrvkit };
6
+ import { EnvBoolean, EnvFunctions, EnvNumber, EnvString, EnvValue, Infer, IsFunctions, env, is } from "@srvkit/common/plugin";
7
+ export { type BuildOptions, type BuildTarget, type BundleMode, type DevOptions, type EnvBoolean, type EnvFunctions, type EnvNumber, type EnvString, type EnvValue, type HttpsOptions, type Infer, type IsFunctions, type Options, type ResolvableNumber, type ResolvableString, type Runtime, env, is, plugin as pluginSrvkit };
package/dist/plugin.js CHANGED
@@ -1,12 +1,17 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
10
2
  const require_index = require('./plugins/index.js');
3
+ let _srvkit_common_plugin = require("@srvkit/common/plugin");
11
4
 
5
+ Object.defineProperty(exports, 'env', {
6
+ enumerable: true,
7
+ get: function () {
8
+ return _srvkit_common_plugin.env;
9
+ }
10
+ });
11
+ Object.defineProperty(exports, 'is', {
12
+ enumerable: true,
13
+ get: function () {
14
+ return _srvkit_common_plugin.is;
15
+ }
16
+ });
12
17
  exports.pluginSrvkit = require_index.plugin;
package/dist/plugin.mjs CHANGED
@@ -1,11 +1,4 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  import { plugin } from "./plugins/index.mjs";
2
+ import { env, is } from "@srvkit/common/plugin";
10
3
 
11
- export { plugin as pluginSrvkit };
4
+ export { env, is, plugin as pluginSrvkit };
@@ -1,5 +1,3 @@
1
- import __tsdown_shims_path from 'node:path';
2
- import __tsdown_shims_url from 'node:url';
3
1
  import { RsbuildPlugin } from "@rsbuild/core";
4
2
  import { ResolvedOptions } from "@srvkit/common/@types/options/resolved";
5
3
  declare const buildPlugin: (opts: ResolvedOptions) => RsbuildPlugin;
@@ -1,11 +1,3 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
10
2
  const require_path = require('../../constants/path.js');
11
3
  const require_ssr = require('../../functions/ssr.js');
@@ -21,7 +13,17 @@ const buildPlugin = (opts) => {
21
13
  name: "srvkit:build",
22
14
  apply: "build",
23
15
  async setup(api) {
16
+ const isModule = packageJson.type === "module";
24
17
  const ssrTarget = require_ssr.getSsrTarget(opts.runtime);
18
+ const externals = [...node_module.builtinModules, /^cloudflare:/];
19
+ if (build.bundle === "external") {
20
+ const depExternals = [
21
+ ...Object.keys(packageJson.dependencies ?? {}),
22
+ ...Object.keys(packageJson.peerDependencies ?? {}),
23
+ ...Object.keys(packageJson.optionalDependencies ?? {})
24
+ ].map((depName) => new RegExp(`^${depName.replace(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`)}([\\/]|$)`));
25
+ externals.push(...depExternals);
26
+ }
25
27
  api.modifyRsbuildConfig((config, { mergeRsbuildConfig }) => {
26
28
  const overrideConfig = {
27
29
  source: { entry: { index: require_path.VIRTUAL_ENTRY } },
@@ -43,15 +45,16 @@ const buildPlugin = (opts) => {
43
45
  ...opts,
44
46
  packageName: require_package.name
45
47
  }) }]);
48
+ if (opts.runtime === "workerd") chain.plugin("workerd-externals").use(rspack.ExternalsPlugin, [isModule ? "module-import" : "commonjs", externals]);
46
49
  });
47
50
  api.modifyRspackConfig((config, { mergeConfig }) => {
48
- const isModule = packageJson.type === "module";
49
- const nodeExternals = [...node_module.builtinModules, /^node:/];
50
51
  const overrideConfig = {
51
52
  resolve: {
52
53
  /** @see https://rspack.rs/config/resolve#extend-default-value */
53
54
  conditionNames: [opts.runtime, "..."] },
54
55
  target: ssrTarget,
56
+ externals,
57
+ externalsType: isModule ? "module-import" : "commonjs",
55
58
  node: {
56
59
  __dirname: false,
57
60
  __filename: false
@@ -62,16 +65,6 @@ conditionNames: [opts.runtime, "..."] },
62
65
  runtimeChunk: false
63
66
  }
64
67
  };
65
- if (build.bundle === "external") {
66
- const depExternals = [
67
- ...Object.keys(packageJson.dependencies ?? {}),
68
- ...Object.keys(packageJson.peerDependencies ?? {}),
69
- ...Object.keys(packageJson.optionalDependencies ?? {})
70
- ].map((name) => new RegExp(`^${name.replace(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`)}([\\/]|$)`));
71
- overrideConfig.externals = [...nodeExternals, ...depExternals];
72
- overrideConfig.externalsType = isModule ? "module-import" : "commonjs";
73
- }
74
- if (build.bundle === "standalone") overrideConfig.externals = nodeExternals;
75
68
  if (build.target === "server") overrideConfig.output = {
76
69
  ...overrideConfig.output,
77
70
  filename: build.outputFile,
@@ -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, // 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
+ {"version":3,"file":"index.js","names":["getSsrTarget","builtinModules","VIRTUAL_ENTRY","name"],"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 isModule: boolean = packageJson.type === \"module\";\n\n const ssrTarget: Rspack.Target = getSsrTarget(opts.runtime);\n\n const externals: (string | RegExp)[] = [\n ...builtinModules,\n /^cloudflare:/,\n ];\n\n if (build.bundle === \"external\") {\n const depNames: string[] = [\n ...Object.keys(packageJson.dependencies ?? {}),\n ...Object.keys(packageJson.peerDependencies ?? {}),\n ...Object.keys(packageJson.optionalDependencies ?? {}),\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 externals.push(...depExternals);\n }\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 // When `target` is `webworker`, all modules will be bundled.\n // Therefore, this plugin is used to make them external again.\n if (opts.runtime === \"workerd\") {\n chain\n .plugin(\"workerd-externals\")\n .use(rspack.ExternalsPlugin, [\n isModule ? \"module-import\" : \"commonjs\",\n externals,\n ]);\n }\n },\n );\n\n api.modifyRspackConfig(\n (config, { mergeConfig }): Rspack.Configuration => {\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 externals,\n externalsType: isModule ? \"module-import\" : \"commonjs\",\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 // 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,WAAoB,YAAY,SAAS;GAE/C,MAAM,YAA2BA,yBAAa,KAAK,OAAO;GAE1D,MAAM,YAAiC,CACnC,GAAGC,4BACH,cACJ;GAEA,IAAI,MAAM,WAAW,YAAY;IAO7B,MAAM,eAAyB;KAL3B,GAAG,OAAO,KAAK,YAAY,gBAAgB,CAAC,CAAC;KAC7C,GAAG,OAAO,KAAK,YAAY,oBAAoB,CAAC,CAAC;KACjD,GAAG,OAAO,KAAK,YAAY,wBAAwB,CAAC,CAAC;IAGnB,CAAC,CAAC,KACnC,YACG,IAAI,OACA,IAAI,QAAQ,QAAQ,uBAAuB,OAAO,GAAG,KAAK,EAAE,UAChE,CACR;IAEA,UAAU,KAAK,GAAG,YAAY;GAClC;GAEA,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;IAIL,IAAI,KAAK,YAAY,WACjB,MACK,OAAO,mBAAmB,CAAC,CAC3B,IAAI,OAAO,iBAAiB,CACzB,WAAW,kBAAkB,YAC7B,SACJ,CAAC;GAEb,CACJ;GAEA,IAAI,oBACC,QAAQ,EAAE,kBAAwC;IAC/C,MAAM,iBAAuC;KACzC,SAAS;;AAEL,gBAAgB,CACZ,KAAK,SACL,KACJ,EACJ;KACA,QAAQ;KACR;KACA,eAAe,WAAW,kBAAkB;KAG5C,MAAM;MACF,WAAW;MACX,YAAY;KAChB;KACA,cAAc;MACV,UAAU,MAAM;MAChB,aAAa;MACb,cAAc;KAClB;IACJ;IAIA,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,11 +1,3 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  import { VIRTUAL_ENTRY } from "../../constants/path.mjs";
10
2
  import { getSsrTarget } from "../../functions/ssr.mjs";
11
3
  import { name } from "../../package.mjs";
@@ -20,7 +12,17 @@ const buildPlugin = (opts) => {
20
12
  name: "srvkit:build",
21
13
  apply: "build",
22
14
  async setup(api) {
15
+ const isModule = packageJson.type === "module";
23
16
  const ssrTarget = getSsrTarget(opts.runtime);
17
+ const externals = [...builtinModules, /^cloudflare:/];
18
+ if (build.bundle === "external") {
19
+ const depExternals = [
20
+ ...Object.keys(packageJson.dependencies ?? {}),
21
+ ...Object.keys(packageJson.peerDependencies ?? {}),
22
+ ...Object.keys(packageJson.optionalDependencies ?? {})
23
+ ].map((depName) => new RegExp(`^${depName.replace(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`)}([\\/]|$)`));
24
+ externals.push(...depExternals);
25
+ }
24
26
  api.modifyRsbuildConfig((config, { mergeRsbuildConfig }) => {
25
27
  const overrideConfig = {
26
28
  source: { entry: { index: VIRTUAL_ENTRY } },
@@ -42,15 +44,16 @@ const buildPlugin = (opts) => {
42
44
  ...opts,
43
45
  packageName: name
44
46
  }) }]);
47
+ if (opts.runtime === "workerd") chain.plugin("workerd-externals").use(rspack.ExternalsPlugin, [isModule ? "module-import" : "commonjs", externals]);
45
48
  });
46
49
  api.modifyRspackConfig((config, { mergeConfig }) => {
47
- const isModule = packageJson.type === "module";
48
- const nodeExternals = [...builtinModules, /^node:/];
49
50
  const overrideConfig = {
50
51
  resolve: {
51
52
  /** @see https://rspack.rs/config/resolve#extend-default-value */
52
53
  conditionNames: [opts.runtime, "..."] },
53
54
  target: ssrTarget,
55
+ externals,
56
+ externalsType: isModule ? "module-import" : "commonjs",
54
57
  node: {
55
58
  __dirname: false,
56
59
  __filename: false
@@ -61,16 +64,6 @@ conditionNames: [opts.runtime, "..."] },
61
64
  runtimeChunk: false
62
65
  }
63
66
  };
64
- if (build.bundle === "external") {
65
- const depExternals = [
66
- ...Object.keys(packageJson.dependencies ?? {}),
67
- ...Object.keys(packageJson.peerDependencies ?? {}),
68
- ...Object.keys(packageJson.optionalDependencies ?? {})
69
- ].map((name) => new RegExp(`^${name.replace(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`)}([\\/]|$)`));
70
- overrideConfig.externals = [...nodeExternals, ...depExternals];
71
- overrideConfig.externalsType = isModule ? "module-import" : "commonjs";
72
- }
73
- if (build.bundle === "standalone") overrideConfig.externals = nodeExternals;
74
67
  if (build.target === "server") overrideConfig.output = {
75
68
  ...overrideConfig.output,
76
69
  filename: build.outputFile,
@@ -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, // 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
+ {"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 isModule: boolean = packageJson.type === \"module\";\n\n const ssrTarget: Rspack.Target = getSsrTarget(opts.runtime);\n\n const externals: (string | RegExp)[] = [\n ...builtinModules,\n /^cloudflare:/,\n ];\n\n if (build.bundle === \"external\") {\n const depNames: string[] = [\n ...Object.keys(packageJson.dependencies ?? {}),\n ...Object.keys(packageJson.peerDependencies ?? {}),\n ...Object.keys(packageJson.optionalDependencies ?? {}),\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 externals.push(...depExternals);\n }\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 // When `target` is `webworker`, all modules will be bundled.\n // Therefore, this plugin is used to make them external again.\n if (opts.runtime === \"workerd\") {\n chain\n .plugin(\"workerd-externals\")\n .use(rspack.ExternalsPlugin, [\n isModule ? \"module-import\" : \"commonjs\",\n externals,\n ]);\n }\n },\n );\n\n api.modifyRspackConfig(\n (config, { mergeConfig }): Rspack.Configuration => {\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 externals,\n externalsType: isModule ? \"module-import\" : \"commonjs\",\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 // 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,WAAoB,YAAY,SAAS;GAE/C,MAAM,YAA2B,aAAa,KAAK,OAAO;GAE1D,MAAM,YAAiC,CACnC,GAAG,gBACH,cACJ;GAEA,IAAI,MAAM,WAAW,YAAY;IAO7B,MAAM,eAAyB;KAL3B,GAAG,OAAO,KAAK,YAAY,gBAAgB,CAAC,CAAC;KAC7C,GAAG,OAAO,KAAK,YAAY,oBAAoB,CAAC,CAAC;KACjD,GAAG,OAAO,KAAK,YAAY,wBAAwB,CAAC,CAAC;IAGnB,CAAC,CAAC,KACnC,YACG,IAAI,OACA,IAAI,QAAQ,QAAQ,uBAAuB,OAAO,GAAG,KAAK,EAAE,UAChE,CACR;IAEA,UAAU,KAAK,GAAG,YAAY;GAClC;GAEA,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;IAIL,IAAI,KAAK,YAAY,WACjB,MACK,OAAO,mBAAmB,CAAC,CAC3B,IAAI,OAAO,iBAAiB,CACzB,WAAW,kBAAkB,YAC7B,SACJ,CAAC;GAEb,CACJ;GAEA,IAAI,oBACC,QAAQ,EAAE,kBAAwC;IAC/C,MAAM,iBAAuC;KACzC,SAAS;;AAEL,gBAAgB,CACZ,KAAK,SACL,KACJ,EACJ;KACA,QAAQ;KACR;KACA,eAAe,WAAW,kBAAkB;KAG5C,MAAM;MACF,WAAW;MACX,YAAY;KAChB;KACA,cAAc;MACV,UAAU,MAAM;MAChB,aAAa;MACb,cAAc;KAClB;IACJ;IAIA,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,5 +1,3 @@
1
- import __tsdown_shims_path from 'node:path';
2
- import __tsdown_shims_url from 'node:url';
3
1
  import { RsbuildPlugin } from "@rsbuild/core";
4
2
  import { ResolvedOptions } from "@srvkit/common/@types/options/resolved";
5
3
  declare const copyPlugin: (opts: ResolvedOptions) => RsbuildPlugin[];
@@ -1,11 +1,3 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
10
2
 
11
3
  const copyPlugin = (opts) => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/plugins/copy/index.ts"],"sourcesContent":["import type {\n RsbuildConfig,\n RsbuildPlugin,\n RsbuildPluginAPI,\n} from \"@rsbuild/core\";\nimport type {\n ResolvedBuildOptions,\n ResolvedOptions,\n} from \"@srvkit/common/@types/options/resolved\";\n\nconst copyPlugin = (opts: ResolvedOptions): RsbuildPlugin[] => {\n const build: ResolvedBuildOptions = opts.build;\n\n if (build.target !== \"server\" || !build.copyPublicDir) {\n return [];\n }\n\n return [\n {\n name: \"srvkit:copy\",\n apply: \"build\",\n async setup(api: RsbuildPluginAPI): Promise<void> {\n api.modifyRsbuildConfig(\n (config: RsbuildConfig): RsbuildConfig => {\n return {\n ...config,\n output: {\n ...config.output,\n copy: [\n {\n from: build.publicDir,\n to: build.publicDir,\n },\n ],\n },\n };\n },\n );\n },\n },\n ];\n};\n\nexport { copyPlugin };\n"],"mappings":";;;;;;;;;;AAUA,MAAM,cAAc,SAA2C;CAC3D,MAAM,QAA8B,KAAK;CAEzC,IAAI,MAAM,WAAW,YAAY,CAAC,MAAM,eACpC,OAAO,CAAC;CAGZ,OAAO,CACH;EACI,MAAM;EACN,OAAO;EACP,MAAM,MAAM,KAAsC;GAC9C,IAAI,qBACC,WAAyC;IACtC,OAAO;KACH,GAAG;KACH,QAAQ;MACJ,GAAG,OAAO;MACV,MAAM,CACF;OACI,MAAM,MAAM;OACZ,IAAI,MAAM;MACd,CACJ;KACJ;IACJ;GACJ,CACJ;EACJ;CACJ,CACJ;AACJ"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/plugins/copy/index.ts"],"sourcesContent":["import type {\n RsbuildConfig,\n RsbuildPlugin,\n RsbuildPluginAPI,\n} from \"@rsbuild/core\";\nimport type {\n ResolvedBuildOptions,\n ResolvedOptions,\n} from \"@srvkit/common/@types/options/resolved\";\n\nconst copyPlugin = (opts: ResolvedOptions): RsbuildPlugin[] => {\n const build: ResolvedBuildOptions = opts.build;\n\n if (build.target !== \"server\" || !build.copyPublicDir) {\n return [];\n }\n\n return [\n {\n name: \"srvkit:copy\",\n apply: \"build\",\n async setup(api: RsbuildPluginAPI): Promise<void> {\n api.modifyRsbuildConfig(\n (config: RsbuildConfig): RsbuildConfig => {\n return {\n ...config,\n output: {\n ...config.output,\n copy: [\n {\n from: build.publicDir,\n to: build.publicDir,\n },\n ],\n },\n };\n },\n );\n },\n },\n ];\n};\n\nexport { copyPlugin };\n"],"mappings":";;AAUA,MAAM,cAAc,SAA2C;CAC3D,MAAM,QAA8B,KAAK;CAEzC,IAAI,MAAM,WAAW,YAAY,CAAC,MAAM,eACpC,OAAO,CAAC;CAGZ,OAAO,CACH;EACI,MAAM;EACN,OAAO;EACP,MAAM,MAAM,KAAsC;GAC9C,IAAI,qBACC,WAAyC;IACtC,OAAO;KACH,GAAG;KACH,QAAQ;MACJ,GAAG,OAAO;MACV,MAAM,CACF;OACI,MAAM,MAAM;OACZ,IAAI,MAAM;MACd,CACJ;KACJ;IACJ;GACJ,CACJ;EACJ;CACJ,CACJ;AACJ"}
@@ -1,11 +1,3 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  const copyPlugin = (opts) => {
10
2
  const build = opts.build;
11
3
  if (build.target !== "server" || !build.copyPublicDir) return [];
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/plugins/copy/index.ts"],"sourcesContent":["import type {\n RsbuildConfig,\n RsbuildPlugin,\n RsbuildPluginAPI,\n} from \"@rsbuild/core\";\nimport type {\n ResolvedBuildOptions,\n ResolvedOptions,\n} from \"@srvkit/common/@types/options/resolved\";\n\nconst copyPlugin = (opts: ResolvedOptions): RsbuildPlugin[] => {\n const build: ResolvedBuildOptions = opts.build;\n\n if (build.target !== \"server\" || !build.copyPublicDir) {\n return [];\n }\n\n return [\n {\n name: \"srvkit:copy\",\n apply: \"build\",\n async setup(api: RsbuildPluginAPI): Promise<void> {\n api.modifyRsbuildConfig(\n (config: RsbuildConfig): RsbuildConfig => {\n return {\n ...config,\n output: {\n ...config.output,\n copy: [\n {\n from: build.publicDir,\n to: build.publicDir,\n },\n ],\n },\n };\n },\n );\n },\n },\n ];\n};\n\nexport { copyPlugin };\n"],"mappings":";;;;;;;;AAUA,MAAM,cAAc,SAA2C;CAC3D,MAAM,QAA8B,KAAK;CAEzC,IAAI,MAAM,WAAW,YAAY,CAAC,MAAM,eACpC,OAAO,CAAC;CAGZ,OAAO,CACH;EACI,MAAM;EACN,OAAO;EACP,MAAM,MAAM,KAAsC;GAC9C,IAAI,qBACC,WAAyC;IACtC,OAAO;KACH,GAAG;KACH,QAAQ;MACJ,GAAG,OAAO;MACV,MAAM,CACF;OACI,MAAM,MAAM;OACZ,IAAI,MAAM;MACd,CACJ;KACJ;IACJ;GACJ,CACJ;EACJ;CACJ,CACJ;AACJ"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/plugins/copy/index.ts"],"sourcesContent":["import type {\n RsbuildConfig,\n RsbuildPlugin,\n RsbuildPluginAPI,\n} from \"@rsbuild/core\";\nimport type {\n ResolvedBuildOptions,\n ResolvedOptions,\n} from \"@srvkit/common/@types/options/resolved\";\n\nconst copyPlugin = (opts: ResolvedOptions): RsbuildPlugin[] => {\n const build: ResolvedBuildOptions = opts.build;\n\n if (build.target !== \"server\" || !build.copyPublicDir) {\n return [];\n }\n\n return [\n {\n name: \"srvkit:copy\",\n apply: \"build\",\n async setup(api: RsbuildPluginAPI): Promise<void> {\n api.modifyRsbuildConfig(\n (config: RsbuildConfig): RsbuildConfig => {\n return {\n ...config,\n output: {\n ...config.output,\n copy: [\n {\n from: build.publicDir,\n to: build.publicDir,\n },\n ],\n },\n };\n },\n );\n },\n },\n ];\n};\n\nexport { copyPlugin };\n"],"mappings":"AAUA,MAAM,cAAc,SAA2C;CAC3D,MAAM,QAA8B,KAAK;CAEzC,IAAI,MAAM,WAAW,YAAY,CAAC,MAAM,eACpC,OAAO,CAAC;CAGZ,OAAO,CACH;EACI,MAAM;EACN,OAAO;EACP,MAAM,MAAM,KAAsC;GAC9C,IAAI,qBACC,WAAyC;IACtC,OAAO;KACH,GAAG;KACH,QAAQ;MACJ,GAAG,OAAO;MACV,MAAM,CACF;OACI,MAAM,MAAM;OACZ,IAAI,MAAM;MACd,CACJ;KACJ;IACJ;GACJ,CACJ;EACJ;CACJ,CACJ;AACJ"}
@@ -1,5 +1,3 @@
1
- import __tsdown_shims_path from 'node:path';
2
- import __tsdown_shims_url from 'node:url';
3
1
  import { RsbuildPlugin } from "@rsbuild/core";
4
2
  import { ResolvedOptions } from "@srvkit/common/@types/options/resolved";
5
3
  declare const devPlugin: (opts: ResolvedOptions) => RsbuildPlugin;
@@ -1,11 +1,3 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
10
2
  const require_runtime = require('../../_virtual/_rolldown/runtime.js');
11
3
  const require_path = require('../../constants/path.js');
@@ -17,6 +9,8 @@ node_fs_promises = require_runtime.__toESM(node_fs_promises);
17
9
  let node_path = require("node:path");
18
10
  node_path = require_runtime.__toESM(node_path);
19
11
  let node_url = require("node:url");
12
+ let _srvkit_common_consts_options = require("@srvkit/common/consts/options");
13
+ let _srvkit_common_functions_env_resolve = require("@srvkit/common/functions/env/resolve");
20
14
  let _srvkit_common_functions_http_request_header = require("@srvkit/common/functions/http/request/header");
21
15
  let _srvkit_common_functions_http_response_write = require("@srvkit/common/functions/http/response/write");
22
16
  let _srvkit_common_functions_path_posix = require("@srvkit/common/functions/path/posix");
@@ -51,7 +45,12 @@ const devPlugin = (opts) => {
51
45
  const dev = opts.dev;
52
46
  const https = opts.dev.https ?? {};
53
47
  const build = opts.build;
54
- const isHttps = https.cert !== void 0 && https.key !== void 0;
48
+ const resolvedHost = (0, _srvkit_common_functions_env_resolve.resolveString)(dev.host, _srvkit_common_consts_options.OPTIONS_DEV.host);
49
+ const resolvedPort = (0, _srvkit_common_functions_env_resolve.resolveNumber)(dev.port, _srvkit_common_consts_options.OPTIONS_DEV.port);
50
+ const resolvedCert = (0, _srvkit_common_functions_env_resolve.resolveString)(https.cert);
51
+ const resolvedKey = (0, _srvkit_common_functions_env_resolve.resolveString)(https.key);
52
+ const resolvedPassphrase = (0, _srvkit_common_functions_env_resolve.resolveString)(https.passphrase);
53
+ const isHttps = resolvedCert !== void 0 && resolvedKey !== void 0;
55
54
  const packageJson = (0, _srvkit_common_functions_package_package_json.getPackageJson)(opts.cwd);
56
55
  return {
57
56
  name: "srvkit:dev",
@@ -59,9 +58,19 @@ const devPlugin = (opts) => {
59
58
  async setup(api) {
60
59
  let middleware;
61
60
  let liveUpdate;
62
- let port;
61
+ let port = resolvedPort;
63
62
  let compileCount = 0;
63
+ const isModule = packageJson.type === "module";
64
64
  const ssrTarget = require_ssr.getSsrTarget(opts.runtime);
65
+ const externals = [...node_module.builtinModules, /^cloudflare:/];
66
+ if (build.bundle === "external") {
67
+ const depExternals = [
68
+ ...Object.keys(packageJson.dependencies ?? {}),
69
+ ...Object.keys(packageJson.peerDependencies ?? {}),
70
+ ...Object.keys(packageJson.optionalDependencies ?? {})
71
+ ].map((depName) => new RegExp(`^${depName.replace(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`)}([\\/]|$)`));
72
+ externals.push(...depExternals);
73
+ }
65
74
  api.modifyRsbuildConfig((config, { mergeRsbuildConfig }) => {
66
75
  return mergeRsbuildConfig(config, {
67
76
  source: { entry: { index: require_path.VIRTUAL_ENTRY } },
@@ -72,23 +81,22 @@ const devPlugin = (opts) => {
72
81
  },
73
82
  dev: { writeToDisk: true },
74
83
  server: {
75
- host: dev.host,
76
- port: dev.port,
77
- ...https.cert !== void 0 && https.key !== void 0 ? { https: {
78
- cert: https.cert,
79
- key: https.key,
80
- passphrase: https.passphrase
84
+ host: resolvedHost,
85
+ port: resolvedPort,
86
+ ...resolvedCert !== void 0 && resolvedKey !== void 0 ? { https: {
87
+ cert: resolvedCert,
88
+ key: resolvedKey,
89
+ passphrase: resolvedPassphrase
81
90
  } } : {}
82
91
  }
83
92
  });
84
93
  });
85
94
  api.modifyBundlerChain((chain, { rspack }) => {
86
95
  chain.plugin("virtual-modules").use(rspack.experiments.VirtualModulesPlugin, [{ [require_path.VIRTUAL_ENTRY]: createDevVirtualEntryCode(opts) }]);
96
+ if (opts.runtime === "workerd") chain.plugin("workerd-externals").use(rspack.ExternalsPlugin, [isModule ? "module-import" : "commonjs", externals]);
87
97
  });
88
98
  api.modifyRspackConfig((config, { mergeConfig }) => {
89
- const isModule = packageJson.type === "module";
90
- const nodeExternals = [...node_module.builtinModules, /^node:/];
91
- const overrideConfig = {
99
+ return mergeConfig(config, {
92
100
  resolve: {
93
101
  /** @see https://rspack.rs/config/resolve#extend-default-value */
94
102
  conditionNames: [opts.runtime, "..."] },
@@ -97,22 +105,13 @@ conditionNames: [opts.runtime, "..."] },
97
105
  ...isModule ? { module: true } : {}
98
106
  },
99
107
  target: ssrTarget,
108
+ externals,
109
+ externalsType: isModule ? "module-import" : "commonjs",
100
110
  node: {
101
111
  __dirname: false,
102
112
  __filename: false
103
113
  }
104
- };
105
- if (build.bundle === "external") {
106
- const depExternals = [
107
- ...Object.keys(packageJson.dependencies ?? {}),
108
- ...Object.keys(packageJson.peerDependencies ?? {}),
109
- ...Object.keys(packageJson.optionalDependencies ?? {})
110
- ].map((depName) => new RegExp(`^${depName.replace(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`)}([\\/]|$)`));
111
- overrideConfig.externals = [...nodeExternals, ...depExternals];
112
- overrideConfig.externalsType = isModule ? "module-import" : "commonjs";
113
- }
114
- if (build.bundle === "standalone") overrideConfig.externals = nodeExternals;
115
- return mergeConfig(config, overrideConfig);
114
+ });
116
115
  });
117
116
  api.onAfterDevCompile(async ({ isFirstCompile }) => {
118
117
  const distPath = api.context.distPath;
@@ -124,12 +123,12 @@ conditionNames: [opts.runtime, "..."] },
124
123
  gracefulShutdown: false,
125
124
  ...serverOptions,
126
125
  manual: true,
127
- hostname: dev.host,
128
- port: dev.port,
126
+ hostname: resolvedHost,
127
+ port: resolvedPort,
129
128
  tls: {
130
- cert: https.cert,
131
- key: https.key,
132
- passphrase: https.passphrase
129
+ cert: resolvedCert,
130
+ key: resolvedKey,
131
+ passphrase: resolvedPassphrase
133
132
  }
134
133
  });
135
134
  liveUpdate = update;
@@ -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 // 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
+ {"version":3,"file":"index.js","names":["OPTIONS_DEV","getSsrTarget","builtinModules","VIRTUAL_ENTRY","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 { OPTIONS_DEV } from \"@srvkit/common/consts/options\";\nimport {\n resolveNumber,\n resolveString,\n} from \"@srvkit/common/functions/env/resolve\";\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 resolvedHost: string = resolveString(dev.host, OPTIONS_DEV.host);\n const resolvedPort: number = resolveNumber(dev.port, OPTIONS_DEV.port);\n const resolvedCert: string | undefined = resolveString(https.cert);\n const resolvedKey: string | undefined = resolveString(https.key);\n const resolvedPassphrase: string | undefined = resolveString(\n https.passphrase,\n );\n\n const isHttps: boolean = resolvedCert !== void 0 && resolvedKey !== 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 = resolvedPort;\n\n let compileCount: number = 0;\n\n const isModule: boolean = packageJson.type === \"module\";\n\n const ssrTarget: Rspack.Target = getSsrTarget(opts.runtime);\n\n const externals: (string | RegExp)[] = [\n ...builtinModules,\n /^cloudflare:/,\n ];\n\n if (build.bundle === \"external\") {\n const depNames: string[] = [\n ...Object.keys(packageJson.dependencies ?? {}),\n ...Object.keys(packageJson.peerDependencies ?? {}),\n ...Object.keys(packageJson.optionalDependencies ?? {}),\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 externals.push(...depExternals);\n }\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: resolvedHost,\n port: resolvedPort,\n ...(resolvedCert !== void 0 &&\n resolvedKey !== void 0\n ? {\n https: {\n cert: resolvedCert,\n key: resolvedKey,\n passphrase: resolvedPassphrase,\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 // When `target` is `webworker`, all modules will be bundled.\n // Therefore, this plugin is used to make them external again.\n if (opts.runtime === \"workerd\") {\n chain\n .plugin(\"workerd-externals\")\n .use(rspack.ExternalsPlugin, [\n isModule ? \"module-import\" : \"commonjs\",\n externals,\n ]);\n }\n },\n );\n\n api.modifyRspackConfig(\n (config, { mergeConfig }): Rspack.Configuration => {\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 externals,\n externalsType: isModule ? \"module-import\" : \"commonjs\",\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 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: resolvedHost,\n port: resolvedPort,\n tls: {\n cert: resolvedCert,\n key: resolvedKey,\n passphrase: resolvedPassphrase,\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,11 +1,3 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  import { VIRTUAL_ENTRY } from "../../constants/path.mjs";
10
2
  import { getSsrTarget } from "../../functions/ssr.mjs";
11
3
  import { builtinModules } from "node:module";
@@ -13,6 +5,8 @@ import { getPackageJson } from "@srvkit/common/functions/package/package-json";
13
5
  import * as Fsp from "node:fs/promises";
14
6
  import * as Path from "node:path";
15
7
  import { pathToFileURL } from "node:url";
8
+ import { OPTIONS_DEV } from "@srvkit/common/consts/options";
9
+ import { resolveNumber, resolveString } from "@srvkit/common/functions/env/resolve";
16
10
  import { toHeaders } from "@srvkit/common/functions/http/request/header";
17
11
  import { writeHttpResponse } from "@srvkit/common/functions/http/response/write";
18
12
  import { toPosix } from "@srvkit/common/functions/path/posix";
@@ -47,7 +41,12 @@ const devPlugin = (opts) => {
47
41
  const dev = opts.dev;
48
42
  const https = opts.dev.https ?? {};
49
43
  const build = opts.build;
50
- const isHttps = https.cert !== void 0 && https.key !== void 0;
44
+ const resolvedHost = resolveString(dev.host, OPTIONS_DEV.host);
45
+ const resolvedPort = resolveNumber(dev.port, OPTIONS_DEV.port);
46
+ const resolvedCert = resolveString(https.cert);
47
+ const resolvedKey = resolveString(https.key);
48
+ const resolvedPassphrase = resolveString(https.passphrase);
49
+ const isHttps = resolvedCert !== void 0 && resolvedKey !== void 0;
51
50
  const packageJson = getPackageJson(opts.cwd);
52
51
  return {
53
52
  name: "srvkit:dev",
@@ -55,9 +54,19 @@ const devPlugin = (opts) => {
55
54
  async setup(api) {
56
55
  let middleware;
57
56
  let liveUpdate;
58
- let port;
57
+ let port = resolvedPort;
59
58
  let compileCount = 0;
59
+ const isModule = packageJson.type === "module";
60
60
  const ssrTarget = getSsrTarget(opts.runtime);
61
+ const externals = [...builtinModules, /^cloudflare:/];
62
+ if (build.bundle === "external") {
63
+ const depExternals = [
64
+ ...Object.keys(packageJson.dependencies ?? {}),
65
+ ...Object.keys(packageJson.peerDependencies ?? {}),
66
+ ...Object.keys(packageJson.optionalDependencies ?? {})
67
+ ].map((depName) => new RegExp(`^${depName.replace(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`)}([\\/]|$)`));
68
+ externals.push(...depExternals);
69
+ }
61
70
  api.modifyRsbuildConfig((config, { mergeRsbuildConfig }) => {
62
71
  return mergeRsbuildConfig(config, {
63
72
  source: { entry: { index: VIRTUAL_ENTRY } },
@@ -68,23 +77,22 @@ const devPlugin = (opts) => {
68
77
  },
69
78
  dev: { writeToDisk: true },
70
79
  server: {
71
- host: dev.host,
72
- port: dev.port,
73
- ...https.cert !== void 0 && https.key !== void 0 ? { https: {
74
- cert: https.cert,
75
- key: https.key,
76
- passphrase: https.passphrase
80
+ host: resolvedHost,
81
+ port: resolvedPort,
82
+ ...resolvedCert !== void 0 && resolvedKey !== void 0 ? { https: {
83
+ cert: resolvedCert,
84
+ key: resolvedKey,
85
+ passphrase: resolvedPassphrase
77
86
  } } : {}
78
87
  }
79
88
  });
80
89
  });
81
90
  api.modifyBundlerChain((chain, { rspack }) => {
82
91
  chain.plugin("virtual-modules").use(rspack.experiments.VirtualModulesPlugin, [{ [VIRTUAL_ENTRY]: createDevVirtualEntryCode(opts) }]);
92
+ if (opts.runtime === "workerd") chain.plugin("workerd-externals").use(rspack.ExternalsPlugin, [isModule ? "module-import" : "commonjs", externals]);
83
93
  });
84
94
  api.modifyRspackConfig((config, { mergeConfig }) => {
85
- const isModule = packageJson.type === "module";
86
- const nodeExternals = [...builtinModules, /^node:/];
87
- const overrideConfig = {
95
+ return mergeConfig(config, {
88
96
  resolve: {
89
97
  /** @see https://rspack.rs/config/resolve#extend-default-value */
90
98
  conditionNames: [opts.runtime, "..."] },
@@ -93,22 +101,13 @@ conditionNames: [opts.runtime, "..."] },
93
101
  ...isModule ? { module: true } : {}
94
102
  },
95
103
  target: ssrTarget,
104
+ externals,
105
+ externalsType: isModule ? "module-import" : "commonjs",
96
106
  node: {
97
107
  __dirname: false,
98
108
  __filename: false
99
109
  }
100
- };
101
- if (build.bundle === "external") {
102
- const depExternals = [
103
- ...Object.keys(packageJson.dependencies ?? {}),
104
- ...Object.keys(packageJson.peerDependencies ?? {}),
105
- ...Object.keys(packageJson.optionalDependencies ?? {})
106
- ].map((depName) => new RegExp(`^${depName.replace(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`)}([\\/]|$)`));
107
- overrideConfig.externals = [...nodeExternals, ...depExternals];
108
- overrideConfig.externalsType = isModule ? "module-import" : "commonjs";
109
- }
110
- if (build.bundle === "standalone") overrideConfig.externals = nodeExternals;
111
- return mergeConfig(config, overrideConfig);
110
+ });
112
111
  });
113
112
  api.onAfterDevCompile(async ({ isFirstCompile }) => {
114
113
  const distPath = api.context.distPath;
@@ -120,12 +119,12 @@ conditionNames: [opts.runtime, "..."] },
120
119
  gracefulShutdown: false,
121
120
  ...serverOptions,
122
121
  manual: true,
123
- hostname: dev.host,
124
- port: dev.port,
122
+ hostname: resolvedHost,
123
+ port: resolvedPort,
125
124
  tls: {
126
- cert: https.cert,
127
- key: https.key,
128
- passphrase: https.passphrase
125
+ cert: resolvedCert,
126
+ key: resolvedKey,
127
+ passphrase: resolvedPassphrase
129
128
  }
130
129
  });
131
130
  liveUpdate = update;
@@ -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 // 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
+ {"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 { OPTIONS_DEV } from \"@srvkit/common/consts/options\";\nimport {\n resolveNumber,\n resolveString,\n} from \"@srvkit/common/functions/env/resolve\";\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 resolvedHost: string = resolveString(dev.host, OPTIONS_DEV.host);\n const resolvedPort: number = resolveNumber(dev.port, OPTIONS_DEV.port);\n const resolvedCert: string | undefined = resolveString(https.cert);\n const resolvedKey: string | undefined = resolveString(https.key);\n const resolvedPassphrase: string | undefined = resolveString(\n https.passphrase,\n );\n\n const isHttps: boolean = resolvedCert !== void 0 && resolvedKey !== 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 = resolvedPort;\n\n let compileCount: number = 0;\n\n const isModule: boolean = packageJson.type === \"module\";\n\n const ssrTarget: Rspack.Target = getSsrTarget(opts.runtime);\n\n const externals: (string | RegExp)[] = [\n ...builtinModules,\n /^cloudflare:/,\n ];\n\n if (build.bundle === \"external\") {\n const depNames: string[] = [\n ...Object.keys(packageJson.dependencies ?? {}),\n ...Object.keys(packageJson.peerDependencies ?? {}),\n ...Object.keys(packageJson.optionalDependencies ?? {}),\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 externals.push(...depExternals);\n }\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: resolvedHost,\n port: resolvedPort,\n ...(resolvedCert !== void 0 &&\n resolvedKey !== void 0\n ? {\n https: {\n cert: resolvedCert,\n key: resolvedKey,\n passphrase: resolvedPassphrase,\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 // When `target` is `webworker`, all modules will be bundled.\n // Therefore, this plugin is used to make them external again.\n if (opts.runtime === \"workerd\") {\n chain\n .plugin(\"workerd-externals\")\n .use(rspack.ExternalsPlugin, [\n isModule ? \"module-import\" : \"commonjs\",\n externals,\n ]);\n }\n },\n );\n\n api.modifyRspackConfig(\n (config, { mergeConfig }): Rspack.Configuration => {\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 externals,\n externalsType: isModule ? \"module-import\" : \"commonjs\",\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 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: resolvedHost,\n port: resolvedPort,\n tls: {\n cert: resolvedCert,\n key: resolvedKey,\n passphrase: resolvedPassphrase,\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,5 +1,3 @@
1
- import __tsdown_shims_path from 'node:path';
2
- import __tsdown_shims_url from 'node:url';
3
1
  import { Options } from "@srvkit/common/@types/options/default";
4
2
  import { RsbuildPlugin } from "@rsbuild/core";
5
3
  declare const plugin: (options?: Options) => RsbuildPlugin[];
@@ -1,11 +1,3 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  const require_plugins_build_index = require('./build/index.js');
10
2
  const require_plugins_copy_index = require('./copy/index.js');
11
3
  const require_plugins_dev_index = require('./dev/index.js');
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["devPlugin","buildPlugin","copyPlugin"],"sources":["../../src/plugins/index.ts"],"sourcesContent":["import type { RsbuildPlugin } from \"@rsbuild/core\";\nimport type { Options } from \"@srvkit/common/@types/options/default\";\nimport type { ResolvedOptions } from \"@srvkit/common/@types/options/resolved\";\n\nimport { resolveOptions } from \"@srvkit/common/functions/options/resolve\";\n\nimport { buildPlugin } from \"#/plugins/build\";\nimport { copyPlugin } from \"#/plugins/copy\";\nimport { devPlugin } from \"#/plugins/dev\";\n\nconst plugin = (options?: Options): RsbuildPlugin[] => {\n const opts: ResolvedOptions = resolveOptions(options);\n\n return [\n devPlugin({\n ...opts,\n }),\n buildPlugin({\n ...opts,\n }),\n ...copyPlugin({\n ...opts,\n }),\n ];\n};\n\nexport { plugin };\n"],"mappings":";;;;;;;;;;;;;AAUA,MAAM,UAAU,YAAuC;CACnD,MAAM,oEAAuC,OAAO;CAEpD,OAAO;EACHA,oCAAU,EACN,GAAG,KACP,CAAC;EACDC,wCAAY,EACR,GAAG,KACP,CAAC;EACD,GAAGC,sCAAW,EACV,GAAG,KACP,CAAC;CACL;AACJ"}
1
+ {"version":3,"file":"index.js","names":["devPlugin","buildPlugin","copyPlugin"],"sources":["../../src/plugins/index.ts"],"sourcesContent":["import type { RsbuildPlugin } from \"@rsbuild/core\";\nimport type { Options } from \"@srvkit/common/@types/options/default\";\nimport type { ResolvedOptions } from \"@srvkit/common/@types/options/resolved\";\n\nimport { resolveOptions } from \"@srvkit/common/functions/options/resolve\";\n\nimport { buildPlugin } from \"#/plugins/build\";\nimport { copyPlugin } from \"#/plugins/copy\";\nimport { devPlugin } from \"#/plugins/dev\";\n\nconst plugin = (options?: Options): RsbuildPlugin[] => {\n const opts: ResolvedOptions = resolveOptions(options);\n\n return [\n devPlugin({\n ...opts,\n }),\n buildPlugin({\n ...opts,\n }),\n ...copyPlugin({\n ...opts,\n }),\n ];\n};\n\nexport { plugin };\n"],"mappings":";;;;;AAUA,MAAM,UAAU,YAAuC;CACnD,MAAM,oEAAuC,OAAO;CAEpD,OAAO;EACHA,oCAAU,EACN,GAAG,KACP,CAAC;EACDC,wCAAY,EACR,GAAG,KACP,CAAC;EACD,GAAGC,sCAAW,EACV,GAAG,KACP,CAAC;CACL;AACJ"}
@@ -1,11 +1,3 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  import { buildPlugin } from "./build/index.mjs";
10
2
  import { copyPlugin } from "./copy/index.mjs";
11
3
  import { devPlugin } from "./dev/index.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/plugins/index.ts"],"sourcesContent":["import type { RsbuildPlugin } from \"@rsbuild/core\";\nimport type { Options } from \"@srvkit/common/@types/options/default\";\nimport type { ResolvedOptions } from \"@srvkit/common/@types/options/resolved\";\n\nimport { resolveOptions } from \"@srvkit/common/functions/options/resolve\";\n\nimport { buildPlugin } from \"#/plugins/build\";\nimport { copyPlugin } from \"#/plugins/copy\";\nimport { devPlugin } from \"#/plugins/dev\";\n\nconst plugin = (options?: Options): RsbuildPlugin[] => {\n const opts: ResolvedOptions = resolveOptions(options);\n\n return [\n devPlugin({\n ...opts,\n }),\n buildPlugin({\n ...opts,\n }),\n ...copyPlugin({\n ...opts,\n }),\n ];\n};\n\nexport { plugin };\n"],"mappings":";;;;;;;;;;;;;AAUA,MAAM,UAAU,YAAuC;CACnD,MAAM,OAAwB,eAAe,OAAO;CAEpD,OAAO;EACH,UAAU,EACN,GAAG,KACP,CAAC;EACD,YAAY,EACR,GAAG,KACP,CAAC;EACD,GAAG,WAAW,EACV,GAAG,KACP,CAAC;CACL;AACJ"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/plugins/index.ts"],"sourcesContent":["import type { RsbuildPlugin } from \"@rsbuild/core\";\nimport type { Options } from \"@srvkit/common/@types/options/default\";\nimport type { ResolvedOptions } from \"@srvkit/common/@types/options/resolved\";\n\nimport { resolveOptions } from \"@srvkit/common/functions/options/resolve\";\n\nimport { buildPlugin } from \"#/plugins/build\";\nimport { copyPlugin } from \"#/plugins/copy\";\nimport { devPlugin } from \"#/plugins/dev\";\n\nconst plugin = (options?: Options): RsbuildPlugin[] => {\n const opts: ResolvedOptions = resolveOptions(options);\n\n return [\n devPlugin({\n ...opts,\n }),\n buildPlugin({\n ...opts,\n }),\n ...copyPlugin({\n ...opts,\n }),\n ];\n};\n\nexport { plugin };\n"],"mappings":";;;;;AAUA,MAAM,UAAU,YAAuC;CACnD,MAAM,OAAwB,eAAe,OAAO;CAEpD,OAAO;EACH,UAAU,EACN,GAAG,KACP,CAAC;EACD,YAAY,EACR,GAAG,KACP,CAAC;EACD,GAAG,WAAW,EACV,GAAG,KACP,CAAC;CACL;AACJ"}
package/dist/runtime.d.ts CHANGED
@@ -1,4 +1,2 @@
1
- import __tsdown_shims_path from 'node:path';
2
- import __tsdown_shims_url from 'node:url';
3
1
  import { serve } from "@srvkit/common/runtime";
4
2
  export { serve };
package/dist/runtime.js CHANGED
@@ -1,11 +1,3 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
10
2
  let _srvkit_common_runtime = require("@srvkit/common/runtime");
11
3
 
package/dist/runtime.mjs CHANGED
@@ -1,11 +1,3 @@
1
-
2
-
3
- import __tsdown_shims_path from 'node:path'
4
- import __tsdown_shims_url from 'node:url'
5
-
6
- const __TSDOWN_SHIM_FILENAME__ = /* @__PURE__ */ __tsdown_shims_url.fileURLToPath(import.meta.url)
7
- const __TSDOWN_SHIM_DIRNAME__ = /* @__PURE__ */ __tsdown_shims_path.dirname(__TSDOWN_SHIM_FILENAME__)
8
-
9
1
  import { serve } from "@srvkit/common/runtime";
10
2
 
11
3
  export { serve };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@srvkit/rsbuild",
3
- "version": "0.1.1",
4
- "description": "A toolkit for building JavaScript server applications",
3
+ "version": "0.2.0",
4
+ "description": "A toolkit for building APIs",
5
5
  "keywords": [
6
6
  "srvkit",
7
7
  "rsbuild-plugin",
@@ -70,7 +70,7 @@
70
70
  "dist"
71
71
  ],
72
72
  "dependencies": {
73
- "@srvkit/common": "~0.1.1"
73
+ "@srvkit/common": "~0.2.0"
74
74
  },
75
75
  "devDependencies": {
76
76
  "@rsbuild/core": "2.0.0"