unplugin-https-reverse-proxy 3.0.0 → 4.0.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.
package/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # unplugin-https-reverse-proxy
2
2
 
3
3
  [![NPM version](https://img.shields.io/npm/v/unplugin-https-reverse-proxy?color=a1b858&label=)](https://www.npmjs.com/package/unplugin-https-reverse-proxy)
4
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/zcf0508/unplugin-https-reverse-proxy)
4
5
 
5
6
  A plugin for https reverse proxy, support `vite`、`webpack` and `rspack`.
6
7
 
@@ -170,6 +171,7 @@ const reverseProxyOptions = {
170
171
  enable: false,
171
172
  target: 'xxx',
172
173
  https: false,
174
+ healthCheck: true,
173
175
  }
174
176
 
175
177
  module.exports = {
@@ -209,7 +211,10 @@ module.exports = {
209
211
  // nuxt.config.js
210
212
  export default defineNuxtConfig({
211
213
  modules: [
212
- ['unplugin-https-reverse-proxy/nuxt', { /* options */ }],
214
+ ['unplugin-https-reverse-proxy/nuxt', {
215
+ /* options */
216
+ healthCheck: false, // important for nuxt
217
+ }],
213
218
  ],
214
219
  })
215
220
  ```
@@ -13391,33 +13391,63 @@ var caddyTemplate = `{
13391
13391
  }
13392
13392
  }
13393
13393
 
13394
- {% for p in proxies %}
13395
- {{ p.target }}{{ p.portSuffix }} {
13396
- {{ p.tls }}
13397
- reverse_proxy http://{{ p.source }} {% if p.healthCheck %} {
13398
- health_uri {{ p.base }}
13399
- health_interval 2s
13400
- health_timeout 5s
13401
- fail_duration 2s
13402
- unhealthy_status 502 503 504 404
13403
- lb_try_duration 3s
13404
- lb_try_interval 300ms
13394
+ {% for host in hosts %}
13395
+ {{ host.host }}{{ host.portSuffix }} {
13396
+ {{ host.tls }}
13405
13397
 
13406
- @error status 502 503 504 404
13407
- handle_response @error {
13408
- respond * 503 {
13409
- body "Service Unavailable"
13410
- close
13398
+ {% for route in host.routes %}
13399
+ handle {{ route.base }}* {
13400
+ reverse_proxy http://{{ route.source }} {% if route.healthCheck %} {
13401
+ health_uri {{ route.base }}
13402
+ health_interval 2s
13403
+ health_timeout 5s
13404
+ health_headers {
13405
+ User-Agent {http.request.header.User-Agent}
13406
+ Accept text/html,application/json,*/*
13407
+ }
13408
+ fail_duration 2s
13409
+ unhealthy_status 502 503 504 404
13410
+ lb_try_duration 3s
13411
+ lb_try_interval 300ms
13412
+
13413
+ @error status 502 503 504 404
13414
+ handle_response @error {
13415
+ respond * 503 {
13416
+ body "Service Unavailable"
13417
+ close
13418
+ }
13411
13419
  }
13412
13420
  }
13421
+ {% endif %}
13413
13422
  }
13414
- {% endif %}
13423
+ {% endfor %}
13415
13424
  }
13416
13425
  {% endfor %}
13417
13426
  `;
13418
13427
  var liquid = new Liquid();
13419
13428
  async function genCaddyfile(ctx) {
13420
- return await liquid.parseAndRender(caddyTemplate, ctx);
13429
+ const hostsMap = /* @__PURE__ */ new Map();
13430
+ for (const proxy of ctx.proxies) {
13431
+ const key = `${proxy.target}${proxy.portSuffix}`;
13432
+ if (!hostsMap.has(key)) {
13433
+ hostsMap.set(key, {
13434
+ host: proxy.target,
13435
+ portSuffix: proxy.portSuffix,
13436
+ tls: proxy.tls,
13437
+ routes: []
13438
+ });
13439
+ }
13440
+ let base = proxy.base || "/";
13441
+ if (!base.startsWith("/"))
13442
+ base = `/${base}`;
13443
+ if (base !== "/" && !base.endsWith("/"))
13444
+ base = `${base}/`;
13445
+ hostsMap.get(key).routes.push({ ...proxy, base });
13446
+ }
13447
+ for (const host of hostsMap.values())
13448
+ host.routes.sort((a, b) => b.base.length - a.base.length);
13449
+ const hosts = Array.from(hostsMap.values());
13450
+ return await liquid.parseAndRender(caddyTemplate, { ...ctx, hosts });
13421
13451
  }
13422
13452
 
13423
13453
  // src/caddy/config.ts
@@ -13582,8 +13612,13 @@ function useCaddyConfig() {
13582
13612
  function writeCaddyConfig(_proxies) {
13583
13613
  const proxies = configJsonRef() || {};
13584
13614
  _proxies.forEach((p) => {
13585
- const index = `${p.target}${p.portSuffix}`;
13586
- proxies[index] = p;
13615
+ let base = p.base || "/";
13616
+ if (!base.startsWith("/"))
13617
+ base = `/${base}`;
13618
+ if (base !== "/" && !base.endsWith("/"))
13619
+ base = `${base}/`;
13620
+ const index = `${p.target}${p.portSuffix}${base}`;
13621
+ proxies[index] = { ...p, base };
13587
13622
  });
13588
13623
  const content = JSON.stringify(proxies, null, 2);
13589
13624
  configContentRef(content);
@@ -13801,13 +13836,22 @@ var CaddyInstant = class {
13801
13836
  throw new Error("update host failed");
13802
13837
  consola.success("update host success\n");
13803
13838
  const targetHost = target.split(":")[0];
13839
+ const normalizeBase = (b) => {
13840
+ let out = b || "/";
13841
+ if (!out.startsWith("/"))
13842
+ out = `/${out}`;
13843
+ if (out !== "/" && !out.endsWith("/"))
13844
+ out = `${out}/`;
13845
+ return out;
13846
+ };
13847
+ const baseNormalized = normalizeBase(base);
13804
13848
  const proxies = [
13805
13849
  {
13806
13850
  target: targetHost,
13807
13851
  portSuffix: https ? "" : ":80",
13808
13852
  tls: https ? "tls internal" : "",
13809
13853
  source,
13810
- base,
13854
+ base: baseNormalized,
13811
13855
  healthCheck
13812
13856
  }
13813
13857
  ];
@@ -13817,14 +13861,12 @@ var CaddyInstant = class {
13817
13861
  effect(async () => {
13818
13862
  const { configJsonRef } = getCaddyConfig();
13819
13863
  const proxies2 = Object.values(configJsonRef() || {});
13820
- if (!(this.caddyfile || "").includes(`${target.split(":")[0]}${https ? "" : ":80"}`)) {
13821
- const ctx = validateTemplateContext({
13822
- caddy_root: this.caddyRoot,
13823
- proxies: proxies2
13824
- });
13825
- this.caddyfile = await genCaddyfile(ctx);
13826
- await this.writeCaddyfile();
13827
- }
13864
+ const ctx = validateTemplateContext({
13865
+ caddy_root: this.caddyRoot,
13866
+ proxies: proxies2
13867
+ });
13868
+ this.caddyfile = await genCaddyfile(ctx);
13869
+ await this.writeCaddyfile();
13828
13870
  })
13829
13871
  );
13830
13872
  if (!existsSync3(caddyLockFilePath))
@@ -14052,7 +14094,7 @@ var unpluginFactory = (options) => ({
14052
14094
  }
14053
14095
  },
14054
14096
  webpack(compiler) {
14055
- var _a4, _b3;
14097
+ var _a4, _b3, _c2;
14056
14098
  if (process5.env.NODE_ENV !== "development")
14057
14099
  return;
14058
14100
  const {
@@ -14083,7 +14125,16 @@ var unpluginFactory = (options) => ({
14083
14125
  const source = `${devServer.host}:${devServer.port}`;
14084
14126
  if (caddy)
14085
14127
  return;
14086
- const _close = (_b3 = compiler.close) == null ? void 0 : _b3.bind(compiler);
14128
+ let base = "/";
14129
+ const publicPath = (_b3 = compiler.options.output) == null ? void 0 : _b3.publicPath;
14130
+ if (typeof publicPath === "string" && publicPath) {
14131
+ base = publicPath;
14132
+ }
14133
+ if (!base.startsWith("/"))
14134
+ base = `/${base}`;
14135
+ if (base !== "/" && !base.endsWith("/"))
14136
+ base = `${base}/`;
14137
+ const _close = (_c2 = compiler.close) == null ? void 0 : _c2.bind(compiler);
14087
14138
  if (_close) {
14088
14139
  compiler.close = async (callback) => {
14089
14140
  process5.on("exit", () => {
@@ -14095,18 +14146,19 @@ var unpluginFactory = (options) => ({
14095
14146
  }
14096
14147
  caddy = new CaddyInstant();
14097
14148
  caddy.run(source, target, {
14149
+ base,
14098
14150
  ...options
14099
14151
  }).then(() => {
14100
14152
  compiler.hooks.done.tap("unplugin-https-reverse-proxy", async () => {
14101
14153
  await printForwardProxy();
14102
- consola.success(` ${c.green("\u279C")} ${c.bold("run caddy reverse proxy success")}: ${colorUrl(`${options.https ? "https" : "http"}://${target}`)}`);
14154
+ consola.success(` ${c.green("\u279C")} ${c.bold("run caddy reverse proxy success")}: ${colorUrl(`${options.https ? "https" : "http"}://${target}${base}`)}`);
14103
14155
  });
14104
14156
  }).catch((e) => {
14105
14157
  throw e;
14106
14158
  });
14107
14159
  },
14108
14160
  async rspack(compiler) {
14109
- var _a4, _b3, _c2;
14161
+ var _a4, _b3, _c2, _d2;
14110
14162
  if (process5.env.NODE_ENV !== "development")
14111
14163
  return;
14112
14164
  const {
@@ -14139,11 +14191,21 @@ var unpluginFactory = (options) => ({
14139
14191
  if (caddy)
14140
14192
  return;
14141
14193
  caddy = new CaddyInstant();
14194
+ let base = "/";
14195
+ const publicPath = (_d2 = compiler.options.output) == null ? void 0 : _d2.publicPath;
14196
+ if (typeof publicPath === "string" && publicPath) {
14197
+ base = publicPath;
14198
+ }
14199
+ if (!base.startsWith("/"))
14200
+ base = `/${base}`;
14201
+ if (base !== "/" && !base.endsWith("/"))
14202
+ base = `${base}/`;
14142
14203
  caddy.run(source, target, {
14204
+ base,
14143
14205
  ...options
14144
14206
  }).then(async () => {
14145
14207
  await printForwardProxy();
14146
- consola.success(` ${c.green("\u279C")} ${c.bold("run caddy reverse proxy success")}: ${colorUrl(`${options.https ? "https" : "http"}://${target}`)}`);
14208
+ consola.success(` ${c.green("\u279C")} ${c.bold("run caddy reverse proxy success")}: ${colorUrl(`${options.https ? "https" : "http"}://${target}${base}`)}`);
14147
14209
  }).catch((e) => {
14148
14210
  throw e;
14149
14211
  });
package/dist/esbuild.cjs CHANGED
@@ -13476,33 +13476,63 @@ var caddyTemplate = `{
13476
13476
  }
13477
13477
  }
13478
13478
 
13479
- {% for p in proxies %}
13480
- {{ p.target }}{{ p.portSuffix }} {
13481
- {{ p.tls }}
13482
- reverse_proxy http://{{ p.source }} {% if p.healthCheck %} {
13483
- health_uri {{ p.base }}
13484
- health_interval 2s
13485
- health_timeout 5s
13486
- fail_duration 2s
13487
- unhealthy_status 502 503 504 404
13488
- lb_try_duration 3s
13489
- lb_try_interval 300ms
13479
+ {% for host in hosts %}
13480
+ {{ host.host }}{{ host.portSuffix }} {
13481
+ {{ host.tls }}
13490
13482
 
13491
- @error status 502 503 504 404
13492
- handle_response @error {
13493
- respond * 503 {
13494
- body "Service Unavailable"
13495
- close
13483
+ {% for route in host.routes %}
13484
+ handle {{ route.base }}* {
13485
+ reverse_proxy http://{{ route.source }} {% if route.healthCheck %} {
13486
+ health_uri {{ route.base }}
13487
+ health_interval 2s
13488
+ health_timeout 5s
13489
+ health_headers {
13490
+ User-Agent {http.request.header.User-Agent}
13491
+ Accept text/html,application/json,*/*
13492
+ }
13493
+ fail_duration 2s
13494
+ unhealthy_status 502 503 504 404
13495
+ lb_try_duration 3s
13496
+ lb_try_interval 300ms
13497
+
13498
+ @error status 502 503 504 404
13499
+ handle_response @error {
13500
+ respond * 503 {
13501
+ body "Service Unavailable"
13502
+ close
13503
+ }
13496
13504
  }
13497
13505
  }
13506
+ {% endif %}
13498
13507
  }
13499
- {% endif %}
13508
+ {% endfor %}
13500
13509
  }
13501
13510
  {% endfor %}
13502
13511
  `;
13503
13512
  var liquid = new Liquid();
13504
13513
  async function genCaddyfile(ctx) {
13505
- return await liquid.parseAndRender(caddyTemplate, ctx);
13514
+ const hostsMap = /* @__PURE__ */ new Map();
13515
+ for (const proxy of ctx.proxies) {
13516
+ const key = `${proxy.target}${proxy.portSuffix}`;
13517
+ if (!hostsMap.has(key)) {
13518
+ hostsMap.set(key, {
13519
+ host: proxy.target,
13520
+ portSuffix: proxy.portSuffix,
13521
+ tls: proxy.tls,
13522
+ routes: []
13523
+ });
13524
+ }
13525
+ let base = proxy.base || "/";
13526
+ if (!base.startsWith("/"))
13527
+ base = `/${base}`;
13528
+ if (base !== "/" && !base.endsWith("/"))
13529
+ base = `${base}/`;
13530
+ hostsMap.get(key).routes.push({ ...proxy, base });
13531
+ }
13532
+ for (const host of hostsMap.values())
13533
+ host.routes.sort((a, b) => b.base.length - a.base.length);
13534
+ const hosts = Array.from(hostsMap.values());
13535
+ return await liquid.parseAndRender(caddyTemplate, { ...ctx, hosts });
13506
13536
  }
13507
13537
 
13508
13538
  // src/caddy/config.ts
@@ -13667,8 +13697,13 @@ function useCaddyConfig() {
13667
13697
  function writeCaddyConfig(_proxies) {
13668
13698
  const proxies = configJsonRef() || {};
13669
13699
  _proxies.forEach((p) => {
13670
- const index = `${p.target}${p.portSuffix}`;
13671
- proxies[index] = p;
13700
+ let base = p.base || "/";
13701
+ if (!base.startsWith("/"))
13702
+ base = `/${base}`;
13703
+ if (base !== "/" && !base.endsWith("/"))
13704
+ base = `${base}/`;
13705
+ const index = `${p.target}${p.portSuffix}${base}`;
13706
+ proxies[index] = { ...p, base };
13672
13707
  });
13673
13708
  const content = JSON.stringify(proxies, null, 2);
13674
13709
  configContentRef(content);
@@ -13886,13 +13921,22 @@ var CaddyInstant = class {
13886
13921
  throw new Error("update host failed");
13887
13922
  consola.success("update host success\n");
13888
13923
  const targetHost = target.split(":")[0];
13924
+ const normalizeBase = (b) => {
13925
+ let out = b || "/";
13926
+ if (!out.startsWith("/"))
13927
+ out = `/${out}`;
13928
+ if (out !== "/" && !out.endsWith("/"))
13929
+ out = `${out}/`;
13930
+ return out;
13931
+ };
13932
+ const baseNormalized = normalizeBase(base);
13889
13933
  const proxies = [
13890
13934
  {
13891
13935
  target: targetHost,
13892
13936
  portSuffix: https ? "" : ":80",
13893
13937
  tls: https ? "tls internal" : "",
13894
13938
  source,
13895
- base,
13939
+ base: baseNormalized,
13896
13940
  healthCheck
13897
13941
  }
13898
13942
  ];
@@ -13902,14 +13946,12 @@ var CaddyInstant = class {
13902
13946
  effect(async () => {
13903
13947
  const { configJsonRef } = getCaddyConfig();
13904
13948
  const proxies2 = Object.values(configJsonRef() || {});
13905
- if (!(this.caddyfile || "").includes(`${target.split(":")[0]}${https ? "" : ":80"}`)) {
13906
- const ctx = validateTemplateContext({
13907
- caddy_root: this.caddyRoot,
13908
- proxies: proxies2
13909
- });
13910
- this.caddyfile = await genCaddyfile(ctx);
13911
- await this.writeCaddyfile();
13912
- }
13949
+ const ctx = validateTemplateContext({
13950
+ caddy_root: this.caddyRoot,
13951
+ proxies: proxies2
13952
+ });
13953
+ this.caddyfile = await genCaddyfile(ctx);
13954
+ await this.writeCaddyfile();
13913
13955
  })
13914
13956
  );
13915
13957
  if (!(0, import_node_fs3.existsSync)(caddyLockFilePath))
@@ -14137,7 +14179,7 @@ var unpluginFactory = (options) => ({
14137
14179
  }
14138
14180
  },
14139
14181
  webpack(compiler) {
14140
- var _a4, _b3;
14182
+ var _a4, _b3, _c2;
14141
14183
  if (import_node_process5.default.env.NODE_ENV !== "development")
14142
14184
  return;
14143
14185
  const {
@@ -14168,7 +14210,16 @@ var unpluginFactory = (options) => ({
14168
14210
  const source = `${devServer.host}:${devServer.port}`;
14169
14211
  if (caddy)
14170
14212
  return;
14171
- const _close = (_b3 = compiler.close) == null ? void 0 : _b3.bind(compiler);
14213
+ let base = "/";
14214
+ const publicPath = (_b3 = compiler.options.output) == null ? void 0 : _b3.publicPath;
14215
+ if (typeof publicPath === "string" && publicPath) {
14216
+ base = publicPath;
14217
+ }
14218
+ if (!base.startsWith("/"))
14219
+ base = `/${base}`;
14220
+ if (base !== "/" && !base.endsWith("/"))
14221
+ base = `${base}/`;
14222
+ const _close = (_c2 = compiler.close) == null ? void 0 : _c2.bind(compiler);
14172
14223
  if (_close) {
14173
14224
  compiler.close = async (callback) => {
14174
14225
  import_node_process5.default.on("exit", () => {
@@ -14180,18 +14231,19 @@ var unpluginFactory = (options) => ({
14180
14231
  }
14181
14232
  caddy = new CaddyInstant();
14182
14233
  caddy.run(source, target, {
14234
+ base,
14183
14235
  ...options
14184
14236
  }).then(() => {
14185
14237
  compiler.hooks.done.tap("unplugin-https-reverse-proxy", async () => {
14186
14238
  await printForwardProxy();
14187
- consola.success(` ${import_picocolors2.default.green("\u279C")} ${import_picocolors2.default.bold("run caddy reverse proxy success")}: ${colorUrl(`${options.https ? "https" : "http"}://${target}`)}`);
14239
+ consola.success(` ${import_picocolors2.default.green("\u279C")} ${import_picocolors2.default.bold("run caddy reverse proxy success")}: ${colorUrl(`${options.https ? "https" : "http"}://${target}${base}`)}`);
14188
14240
  });
14189
14241
  }).catch((e) => {
14190
14242
  throw e;
14191
14243
  });
14192
14244
  },
14193
14245
  async rspack(compiler) {
14194
- var _a4, _b3, _c2;
14246
+ var _a4, _b3, _c2, _d2;
14195
14247
  if (import_node_process5.default.env.NODE_ENV !== "development")
14196
14248
  return;
14197
14249
  const {
@@ -14224,11 +14276,21 @@ var unpluginFactory = (options) => ({
14224
14276
  if (caddy)
14225
14277
  return;
14226
14278
  caddy = new CaddyInstant();
14279
+ let base = "/";
14280
+ const publicPath = (_d2 = compiler.options.output) == null ? void 0 : _d2.publicPath;
14281
+ if (typeof publicPath === "string" && publicPath) {
14282
+ base = publicPath;
14283
+ }
14284
+ if (!base.startsWith("/"))
14285
+ base = `/${base}`;
14286
+ if (base !== "/" && !base.endsWith("/"))
14287
+ base = `${base}/`;
14227
14288
  caddy.run(source, target, {
14289
+ base,
14228
14290
  ...options
14229
14291
  }).then(async () => {
14230
14292
  await printForwardProxy();
14231
- consola.success(` ${import_picocolors2.default.green("\u279C")} ${import_picocolors2.default.bold("run caddy reverse proxy success")}: ${colorUrl(`${options.https ? "https" : "http"}://${target}`)}`);
14293
+ consola.success(` ${import_picocolors2.default.green("\u279C")} ${import_picocolors2.default.bold("run caddy reverse proxy success")}: ${colorUrl(`${options.https ? "https" : "http"}://${target}${base}`)}`);
14232
14294
  }).catch((e) => {
14233
14295
  throw e;
14234
14296
  });
package/dist/esbuild.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  unpluginFactory
3
- } from "./chunk-5MC5SB7O.js";
3
+ } from "./chunk-K7HSLE6X.js";
4
4
  import "./chunk-2P7SUCQ3.js";
5
5
 
6
6
  // src/esbuild.ts
package/dist/index.cjs CHANGED
@@ -13476,33 +13476,63 @@ var caddyTemplate = `{
13476
13476
  }
13477
13477
  }
13478
13478
 
13479
- {% for p in proxies %}
13480
- {{ p.target }}{{ p.portSuffix }} {
13481
- {{ p.tls }}
13482
- reverse_proxy http://{{ p.source }} {% if p.healthCheck %} {
13483
- health_uri {{ p.base }}
13484
- health_interval 2s
13485
- health_timeout 5s
13486
- fail_duration 2s
13487
- unhealthy_status 502 503 504 404
13488
- lb_try_duration 3s
13489
- lb_try_interval 300ms
13479
+ {% for host in hosts %}
13480
+ {{ host.host }}{{ host.portSuffix }} {
13481
+ {{ host.tls }}
13490
13482
 
13491
- @error status 502 503 504 404
13492
- handle_response @error {
13493
- respond * 503 {
13494
- body "Service Unavailable"
13495
- close
13483
+ {% for route in host.routes %}
13484
+ handle {{ route.base }}* {
13485
+ reverse_proxy http://{{ route.source }} {% if route.healthCheck %} {
13486
+ health_uri {{ route.base }}
13487
+ health_interval 2s
13488
+ health_timeout 5s
13489
+ health_headers {
13490
+ User-Agent {http.request.header.User-Agent}
13491
+ Accept text/html,application/json,*/*
13492
+ }
13493
+ fail_duration 2s
13494
+ unhealthy_status 502 503 504 404
13495
+ lb_try_duration 3s
13496
+ lb_try_interval 300ms
13497
+
13498
+ @error status 502 503 504 404
13499
+ handle_response @error {
13500
+ respond * 503 {
13501
+ body "Service Unavailable"
13502
+ close
13503
+ }
13496
13504
  }
13497
13505
  }
13506
+ {% endif %}
13498
13507
  }
13499
- {% endif %}
13508
+ {% endfor %}
13500
13509
  }
13501
13510
  {% endfor %}
13502
13511
  `;
13503
13512
  var liquid = new Liquid();
13504
13513
  async function genCaddyfile(ctx) {
13505
- return await liquid.parseAndRender(caddyTemplate, ctx);
13514
+ const hostsMap = /* @__PURE__ */ new Map();
13515
+ for (const proxy of ctx.proxies) {
13516
+ const key = `${proxy.target}${proxy.portSuffix}`;
13517
+ if (!hostsMap.has(key)) {
13518
+ hostsMap.set(key, {
13519
+ host: proxy.target,
13520
+ portSuffix: proxy.portSuffix,
13521
+ tls: proxy.tls,
13522
+ routes: []
13523
+ });
13524
+ }
13525
+ let base = proxy.base || "/";
13526
+ if (!base.startsWith("/"))
13527
+ base = `/${base}`;
13528
+ if (base !== "/" && !base.endsWith("/"))
13529
+ base = `${base}/`;
13530
+ hostsMap.get(key).routes.push({ ...proxy, base });
13531
+ }
13532
+ for (const host of hostsMap.values())
13533
+ host.routes.sort((a, b) => b.base.length - a.base.length);
13534
+ const hosts = Array.from(hostsMap.values());
13535
+ return await liquid.parseAndRender(caddyTemplate, { ...ctx, hosts });
13506
13536
  }
13507
13537
 
13508
13538
  // src/caddy/config.ts
@@ -13667,8 +13697,13 @@ function useCaddyConfig() {
13667
13697
  function writeCaddyConfig(_proxies) {
13668
13698
  const proxies = configJsonRef() || {};
13669
13699
  _proxies.forEach((p) => {
13670
- const index = `${p.target}${p.portSuffix}`;
13671
- proxies[index] = p;
13700
+ let base = p.base || "/";
13701
+ if (!base.startsWith("/"))
13702
+ base = `/${base}`;
13703
+ if (base !== "/" && !base.endsWith("/"))
13704
+ base = `${base}/`;
13705
+ const index = `${p.target}${p.portSuffix}${base}`;
13706
+ proxies[index] = { ...p, base };
13672
13707
  });
13673
13708
  const content = JSON.stringify(proxies, null, 2);
13674
13709
  configContentRef(content);
@@ -13886,13 +13921,22 @@ var CaddyInstant = class {
13886
13921
  throw new Error("update host failed");
13887
13922
  consola.success("update host success\n");
13888
13923
  const targetHost = target.split(":")[0];
13924
+ const normalizeBase = (b) => {
13925
+ let out = b || "/";
13926
+ if (!out.startsWith("/"))
13927
+ out = `/${out}`;
13928
+ if (out !== "/" && !out.endsWith("/"))
13929
+ out = `${out}/`;
13930
+ return out;
13931
+ };
13932
+ const baseNormalized = normalizeBase(base);
13889
13933
  const proxies = [
13890
13934
  {
13891
13935
  target: targetHost,
13892
13936
  portSuffix: https ? "" : ":80",
13893
13937
  tls: https ? "tls internal" : "",
13894
13938
  source,
13895
- base,
13939
+ base: baseNormalized,
13896
13940
  healthCheck
13897
13941
  }
13898
13942
  ];
@@ -13902,14 +13946,12 @@ var CaddyInstant = class {
13902
13946
  effect(async () => {
13903
13947
  const { configJsonRef } = getCaddyConfig();
13904
13948
  const proxies2 = Object.values(configJsonRef() || {});
13905
- if (!(this.caddyfile || "").includes(`${target.split(":")[0]}${https ? "" : ":80"}`)) {
13906
- const ctx = validateTemplateContext({
13907
- caddy_root: this.caddyRoot,
13908
- proxies: proxies2
13909
- });
13910
- this.caddyfile = await genCaddyfile(ctx);
13911
- await this.writeCaddyfile();
13912
- }
13949
+ const ctx = validateTemplateContext({
13950
+ caddy_root: this.caddyRoot,
13951
+ proxies: proxies2
13952
+ });
13953
+ this.caddyfile = await genCaddyfile(ctx);
13954
+ await this.writeCaddyfile();
13913
13955
  })
13914
13956
  );
13915
13957
  if (!(0, import_node_fs3.existsSync)(caddyLockFilePath))
@@ -14137,7 +14179,7 @@ var unpluginFactory = (options) => ({
14137
14179
  }
14138
14180
  },
14139
14181
  webpack(compiler) {
14140
- var _a4, _b3;
14182
+ var _a4, _b3, _c2;
14141
14183
  if (import_node_process5.default.env.NODE_ENV !== "development")
14142
14184
  return;
14143
14185
  const {
@@ -14168,7 +14210,16 @@ var unpluginFactory = (options) => ({
14168
14210
  const source = `${devServer.host}:${devServer.port}`;
14169
14211
  if (caddy)
14170
14212
  return;
14171
- const _close = (_b3 = compiler.close) == null ? void 0 : _b3.bind(compiler);
14213
+ let base = "/";
14214
+ const publicPath = (_b3 = compiler.options.output) == null ? void 0 : _b3.publicPath;
14215
+ if (typeof publicPath === "string" && publicPath) {
14216
+ base = publicPath;
14217
+ }
14218
+ if (!base.startsWith("/"))
14219
+ base = `/${base}`;
14220
+ if (base !== "/" && !base.endsWith("/"))
14221
+ base = `${base}/`;
14222
+ const _close = (_c2 = compiler.close) == null ? void 0 : _c2.bind(compiler);
14172
14223
  if (_close) {
14173
14224
  compiler.close = async (callback) => {
14174
14225
  import_node_process5.default.on("exit", () => {
@@ -14180,18 +14231,19 @@ var unpluginFactory = (options) => ({
14180
14231
  }
14181
14232
  caddy = new CaddyInstant();
14182
14233
  caddy.run(source, target, {
14234
+ base,
14183
14235
  ...options
14184
14236
  }).then(() => {
14185
14237
  compiler.hooks.done.tap("unplugin-https-reverse-proxy", async () => {
14186
14238
  await printForwardProxy();
14187
- consola.success(` ${import_picocolors2.default.green("\u279C")} ${import_picocolors2.default.bold("run caddy reverse proxy success")}: ${colorUrl(`${options.https ? "https" : "http"}://${target}`)}`);
14239
+ consola.success(` ${import_picocolors2.default.green("\u279C")} ${import_picocolors2.default.bold("run caddy reverse proxy success")}: ${colorUrl(`${options.https ? "https" : "http"}://${target}${base}`)}`);
14188
14240
  });
14189
14241
  }).catch((e) => {
14190
14242
  throw e;
14191
14243
  });
14192
14244
  },
14193
14245
  async rspack(compiler) {
14194
- var _a4, _b3, _c2;
14246
+ var _a4, _b3, _c2, _d2;
14195
14247
  if (import_node_process5.default.env.NODE_ENV !== "development")
14196
14248
  return;
14197
14249
  const {
@@ -14224,11 +14276,21 @@ var unpluginFactory = (options) => ({
14224
14276
  if (caddy)
14225
14277
  return;
14226
14278
  caddy = new CaddyInstant();
14279
+ let base = "/";
14280
+ const publicPath = (_d2 = compiler.options.output) == null ? void 0 : _d2.publicPath;
14281
+ if (typeof publicPath === "string" && publicPath) {
14282
+ base = publicPath;
14283
+ }
14284
+ if (!base.startsWith("/"))
14285
+ base = `/${base}`;
14286
+ if (base !== "/" && !base.endsWith("/"))
14287
+ base = `${base}/`;
14227
14288
  caddy.run(source, target, {
14289
+ base,
14228
14290
  ...options
14229
14291
  }).then(async () => {
14230
14292
  await printForwardProxy();
14231
- consola.success(` ${import_picocolors2.default.green("\u279C")} ${import_picocolors2.default.bold("run caddy reverse proxy success")}: ${colorUrl(`${options.https ? "https" : "http"}://${target}`)}`);
14293
+ consola.success(` ${import_picocolors2.default.green("\u279C")} ${import_picocolors2.default.bold("run caddy reverse proxy success")}: ${colorUrl(`${options.https ? "https" : "http"}://${target}${base}`)}`);
14232
14294
  }).catch((e) => {
14233
14295
  throw e;
14234
14296
  });