vocs 2.2.4 → 2.2.5

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.
@@ -549,6 +549,18 @@ export type Config<partial extends boolean = false> = MaybePartial<partial, {
549
549
  * Navigation displayed on the top.
550
550
  */
551
551
  topNav?: readonly TopNav.Item[] | undefined;
552
+ /**
553
+ * Whether Vocs redirects trailing-slash page URLs to their no-slash form
554
+ * (e.g. `/about/` → `/about` via a 308).
555
+ *
556
+ * Disable this when an upstream host (e.g. a reverse proxy or CDN) owns
557
+ * trailing-slash canonicalization. When disabled, Vocs internally
558
+ * normalizes `/foo/` to `/foo` for routing instead of emitting a redirect,
559
+ * which avoids redirect loops when the upstream adds trailing slashes.
560
+ *
561
+ * @default true
562
+ */
563
+ trailingSlashRedirect: boolean;
552
564
  /**
553
565
  * TwoSlash configuration. Set to `false` to disable.
554
566
  */
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/internal/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/internal/config.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import * as path from 'node:path';
3
3
  import * as Langs from './langs.js';
4
4
  import { from as resolveOpenApi } from './openapi/openapi.js';
5
5
  export function define(config = {}) {
6
- const { accentColor = 'light-dark(black, white)', banner, basePath = '/', cacheDir, changelog, checkDeadlinks = true, codeHighlight, colorScheme = 'light dark', description, iconUrl, logoUrl, markdown, mcp, ogImageUrl, openapi, outDir = 'dist', redirects, renderStrategy = 'dynamic', rootDir = process.cwd(), search, sidebar, socials, srcDir = 'src', title = 'Docs', titleTemplate = `%s – ${title}`, topNav, twoslash, } = config;
6
+ const { accentColor = 'light-dark(black, white)', banner, basePath = '/', cacheDir, changelog, checkDeadlinks = true, codeHighlight, colorScheme = 'light dark', description, iconUrl, logoUrl, markdown, mcp, ogImageUrl, openapi, outDir = 'dist', redirects, renderStrategy = 'dynamic', rootDir = process.cwd(), search, sidebar, socials, srcDir = 'src', title = 'Docs', titleTemplate = `%s – ${title}`, topNav, trailingSlashRedirect = true, twoslash, } = config;
7
7
  const pagesDir = 'pages';
8
8
  const baseUrl = (() => {
9
9
  if (!config.baseUrl)
@@ -114,6 +114,7 @@ export function define(config = {}) {
114
114
  title,
115
115
  titleTemplate,
116
116
  topNav,
117
+ trailingSlashRedirect,
117
118
  twoslash,
118
119
  };
119
120
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/internal/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/internal/config.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,18 @@
1
1
  import type { MiddlewareHandler } from 'hono';
2
2
  /**
3
- * Removes trailing slashes from URLs.
3
+ * Normalizes trailing slashes on page URLs (e.g. `/about/` → `/about`).
4
4
  *
5
- * Redirects `/about/` → `/about` with a 308 Permanent Redirect.
6
- * Skips the root path (`/`), configured base path root, and paths with file
7
- * extensions.
5
+ * By default, redirects `/about/` → `/about` with a 308 Permanent Redirect.
6
+ *
7
+ * When `redirect` is `false`, the trailing slash is stripped internally for
8
+ * downstream routing instead of emitting a redirect. This avoids redirect
9
+ * loops when an upstream host (reverse proxy / CDN) owns trailing-slash
10
+ * canonicalization and adds the trailing slash that Vocs would otherwise
11
+ * strip — particularly when the upstream rewrites the path so the redirect
12
+ * `Location` would lose its public prefix.
13
+ *
14
+ * Skips the root path (`/`), the configured base path root, and paths with
15
+ * file extensions.
8
16
  *
9
17
  * Uses relative Location values so redirects work correctly behind
10
18
  * TLS-terminating reverse proxies, where the internal request URL
@@ -15,6 +23,13 @@ export default trailingSlash;
15
23
  export declare namespace trailingSlash {
16
24
  type Options = {
17
25
  basePath?: string | undefined;
26
+ /**
27
+ * Whether to emit a 308 redirect to the no-slash form. When `false`, the
28
+ * trailing slash is stripped internally for routing without a redirect.
29
+ *
30
+ * @default true
31
+ */
32
+ redirect?: boolean | undefined;
18
33
  };
19
34
  }
20
35
  //# sourceMappingURL=trailing-slash.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"trailing-slash.d.ts","sourceRoot":"","sources":["../../../../src/waku/internal/middleware/trailing-slash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAA;AAM7C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,GAAI,UAAS,aAAa,CAAC,OAAY,KAAG,iBAuBnE,CAAA;AAED,eAAe,aAAa,CAAA;AAE5B,MAAM,CAAC,OAAO,WAAW,aAAa,CAAC;IACrC,KAAK,OAAO,GAAG;QACb,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC9B,CAAA;CACF"}
1
+ {"version":3,"file":"trailing-slash.d.ts","sourceRoot":"","sources":["../../../../src/waku/internal/middleware/trailing-slash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAA;AAM7C;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,aAAa,GAAI,UAAS,aAAa,CAAC,OAAY,KAAG,iBAuCnE,CAAA;AAED,eAAe,aAAa,CAAA;AAE5B,MAAM,CAAC,OAAO,WAAW,aAAa,CAAC;IACrC,KAAK,OAAO,GAAG;QACb,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC7B;;;;;WAKG;QACH,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAC/B,CAAA;CACF"}
@@ -2,31 +2,53 @@ import * as Config from '../../../internal/config.js';
2
2
  import { appendSearch } from '../../../internal/redirects.js';
3
3
  const normalizeBasePath = (basePath) => (basePath.endsWith('/') ? basePath : `${basePath}/`);
4
4
  /**
5
- * Removes trailing slashes from URLs.
5
+ * Normalizes trailing slashes on page URLs (e.g. `/about/` → `/about`).
6
6
  *
7
- * Redirects `/about/` → `/about` with a 308 Permanent Redirect.
8
- * Skips the root path (`/`), configured base path root, and paths with file
9
- * extensions.
7
+ * By default, redirects `/about/` → `/about` with a 308 Permanent Redirect.
8
+ *
9
+ * When `redirect` is `false`, the trailing slash is stripped internally for
10
+ * downstream routing instead of emitting a redirect. This avoids redirect
11
+ * loops when an upstream host (reverse proxy / CDN) owns trailing-slash
12
+ * canonicalization and adds the trailing slash that Vocs would otherwise
13
+ * strip — particularly when the upstream rewrites the path so the redirect
14
+ * `Location` would lose its public prefix.
15
+ *
16
+ * Skips the root path (`/`), the configured base path root, and paths with
17
+ * file extensions.
10
18
  *
11
19
  * Uses relative Location values so redirects work correctly behind
12
20
  * TLS-terminating reverse proxies, where the internal request URL
13
21
  * may use `http://`.
14
22
  */
15
23
  export const trailingSlash = (options = {}) => {
16
- const basePathPromise = options.basePath !== undefined
17
- ? Promise.resolve(normalizeBasePath(options.basePath))
18
- : Config.resolve({ server: true }).then((config) => normalizeBasePath(config.basePath));
24
+ const optionsPromise = options.basePath !== undefined || options.redirect !== undefined
25
+ ? Promise.resolve({
26
+ basePath: normalizeBasePath(options.basePath ?? '/'),
27
+ redirect: options.redirect ?? true,
28
+ })
29
+ : Config.resolve({ server: true }).then((config) => ({
30
+ basePath: normalizeBasePath(config.basePath),
31
+ redirect: config.trailingSlashRedirect,
32
+ }));
19
33
  return async (context, next) => {
20
34
  const url = new URL(context.req.url);
21
- const basePath = await basePathPromise;
35
+ const { basePath, redirect } = await optionsPromise;
22
36
  // Skip root path, base path root, and paths with file extensions
23
37
  if (url.pathname === '/' || url.pathname === basePath || /\.\w+$/.test(url.pathname))
24
38
  return next();
25
- // Redirect trailing slash to non-trailing slash
26
39
  if (url.pathname.endsWith('/')) {
27
- const destination = appendSearch(url.pathname.slice(0, -1), url.search);
28
- context.res = context.redirect(destination, 308);
29
- return;
40
+ const pathname = url.pathname.slice(0, -1);
41
+ // Emit a redirect to the no-slash form (default).
42
+ if (redirect) {
43
+ const destination = appendSearch(pathname, url.search);
44
+ context.res = context.redirect(destination, 308);
45
+ return;
46
+ }
47
+ // Otherwise, normalize the path internally (no redirect) so downstream
48
+ // routing matches the no-slash route. Preserves the query string.
49
+ url.pathname = pathname;
50
+ context.req.raw = new Request(url, context.req.raw);
51
+ return next();
30
52
  }
31
53
  return next();
32
54
  };
@@ -1 +1 @@
1
- {"version":3,"file":"trailing-slash.js","sourceRoot":"","sources":["../../../../src/waku/internal/middleware/trailing-slash.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAE7D,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAA;AAEpG;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,UAAiC,EAAE,EAAqB,EAAE;IACtF,MAAM,eAAe,GACnB,OAAO,CAAC,QAAQ,KAAK,SAAS;QAC5B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtD,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;IAE3F,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACpC,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAA;QAEtC,iEAAiE;QACjE,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClF,OAAO,IAAI,EAAE,CAAA;QAEf,gDAAgD;QAChD,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;YACvE,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;YAChD,OAAM;QACR,CAAC;QAED,OAAO,IAAI,EAAE,CAAA;IACf,CAAC,CAAA;AACH,CAAC,CAAA;AAED,eAAe,aAAa,CAAA"}
1
+ {"version":3,"file":"trailing-slash.js","sourceRoot":"","sources":["../../../../src/waku/internal/middleware/trailing-slash.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAE7D,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAA;AAEpG;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,UAAiC,EAAE,EAAqB,EAAE;IACtF,MAAM,cAAc,GAClB,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;QAC9D,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;YACd,QAAQ,EAAE,iBAAiB,CAAC,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC;YACpD,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;SACnC,CAAC;QACJ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACjD,QAAQ,EAAE,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC5C,QAAQ,EAAE,MAAM,CAAC,qBAAqB;SACvC,CAAC,CAAC,CAAA;IAET,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACpC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,cAAc,CAAA;QAEnD,iEAAiE;QACjE,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClF,OAAO,IAAI,EAAE,CAAA;QAEf,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAE1C,kDAAkD;YAClD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;gBACtD,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;gBAChD,OAAM;YACR,CAAC;YAED,uEAAuE;YACvE,kEAAkE;YAClE,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAA;YACvB,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACnD,OAAO,IAAI,EAAE,CAAA;QACf,CAAC;QAED,OAAO,IAAI,EAAE,CAAA;IACf,CAAC,CAAA;AACH,CAAC,CAAA;AAED,eAAe,aAAa,CAAA"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vocs",
3
3
  "type": "module",
4
- "version": "2.2.4",
4
+ "version": "2.2.5",
5
5
  "main": "./dist/index.js",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -586,6 +586,18 @@ export type Config<partial extends boolean = false> = MaybePartial<
586
586
  * Navigation displayed on the top.
587
587
  */
588
588
  topNav?: readonly TopNav.Item[] | undefined
589
+ /**
590
+ * Whether Vocs redirects trailing-slash page URLs to their no-slash form
591
+ * (e.g. `/about/` → `/about` via a 308).
592
+ *
593
+ * Disable this when an upstream host (e.g. a reverse proxy or CDN) owns
594
+ * trailing-slash canonicalization. When disabled, Vocs internally
595
+ * normalizes `/foo/` to `/foo` for routing instead of emitting a redirect,
596
+ * which avoids redirect loops when the upstream adds trailing slashes.
597
+ *
598
+ * @default true
599
+ */
600
+ trailingSlashRedirect: boolean
589
601
  /**
590
602
  * TwoSlash configuration. Set to `false` to disable.
591
603
  */
@@ -713,6 +725,7 @@ export function define(config: define.Options = {}): Config {
713
725
  title = 'Docs',
714
726
  titleTemplate = `%s – ${title}`,
715
727
  topNav,
728
+ trailingSlashRedirect = true,
716
729
  twoslash,
717
730
  } = config
718
731
 
@@ -829,6 +842,7 @@ export function define(config: define.Options = {}): Config {
829
842
  title,
830
843
  titleTemplate,
831
844
  topNav,
845
+ trailingSlashRedirect,
832
846
  twoslash,
833
847
  }
834
848
  }
@@ -9,7 +9,11 @@ import { trailingSlash } from './trailing-slash.js'
9
9
  function request(path: string, options?: trailingSlash.Options) {
10
10
  const app = new Hono()
11
11
  app.use('*', trailingSlash(options))
12
- app.get('*', (c) => c.text('ok'))
12
+ // Echo the downstream pathname + search so tests can assert internal rewrites.
13
+ app.get('*', (c) => {
14
+ const url = new URL(c.req.url)
15
+ return c.text(url.pathname + url.search)
16
+ })
13
17
  return app.request(path)
14
18
  }
15
19
 
@@ -64,4 +68,33 @@ describe('trailingSlash', () => {
64
68
  expect(res.status).toBe(308)
65
69
  expect(res.headers.get('location')).toBe('/sdk/typescript/core')
66
70
  })
71
+
72
+ describe('redirect: false (internal rewrite)', () => {
73
+ it('normalizes trailing slash internally without a redirect', async () => {
74
+ const res = await request('http://localhost/about/', { redirect: false })
75
+ expect(res.status).toBe(200)
76
+ expect(res.headers.get('location')).toBeNull()
77
+ expect(await res.text()).toBe('/about')
78
+ })
79
+
80
+ it('preserves query string when rewriting internally', async () => {
81
+ const res = await request('http://localhost/docs/?ref=nav', { redirect: false })
82
+ expect(res.status).toBe(200)
83
+ expect(res.headers.get('location')).toBeNull()
84
+ expect(await res.text()).toBe('/docs?ref=nav')
85
+ })
86
+
87
+ it('still skips root, base path root, and file-extension paths', async () => {
88
+ expect((await request('http://localhost/', { redirect: false })).status).toBe(200)
89
+ expect(
90
+ (
91
+ await request('http://localhost/open-source/', {
92
+ redirect: false,
93
+ basePath: '/open-source',
94
+ })
95
+ ).status,
96
+ ).toBe(200)
97
+ expect((await request('http://localhost/styles.css', { redirect: false })).status).toBe(200)
98
+ })
99
+ })
67
100
  })
@@ -5,35 +5,59 @@ import { appendSearch } from '../../../internal/redirects.js'
5
5
  const normalizeBasePath = (basePath: string) => (basePath.endsWith('/') ? basePath : `${basePath}/`)
6
6
 
7
7
  /**
8
- * Removes trailing slashes from URLs.
8
+ * Normalizes trailing slashes on page URLs (e.g. `/about/` → `/about`).
9
9
  *
10
- * Redirects `/about/` → `/about` with a 308 Permanent Redirect.
11
- * Skips the root path (`/`), configured base path root, and paths with file
12
- * extensions.
10
+ * By default, redirects `/about/` → `/about` with a 308 Permanent Redirect.
11
+ *
12
+ * When `redirect` is `false`, the trailing slash is stripped internally for
13
+ * downstream routing instead of emitting a redirect. This avoids redirect
14
+ * loops when an upstream host (reverse proxy / CDN) owns trailing-slash
15
+ * canonicalization and adds the trailing slash that Vocs would otherwise
16
+ * strip — particularly when the upstream rewrites the path so the redirect
17
+ * `Location` would lose its public prefix.
18
+ *
19
+ * Skips the root path (`/`), the configured base path root, and paths with
20
+ * file extensions.
13
21
  *
14
22
  * Uses relative Location values so redirects work correctly behind
15
23
  * TLS-terminating reverse proxies, where the internal request URL
16
24
  * may use `http://`.
17
25
  */
18
26
  export const trailingSlash = (options: trailingSlash.Options = {}): MiddlewareHandler => {
19
- const basePathPromise =
20
- options.basePath !== undefined
21
- ? Promise.resolve(normalizeBasePath(options.basePath))
22
- : Config.resolve({ server: true }).then((config) => normalizeBasePath(config.basePath))
27
+ const optionsPromise =
28
+ options.basePath !== undefined || options.redirect !== undefined
29
+ ? Promise.resolve({
30
+ basePath: normalizeBasePath(options.basePath ?? '/'),
31
+ redirect: options.redirect ?? true,
32
+ })
33
+ : Config.resolve({ server: true }).then((config) => ({
34
+ basePath: normalizeBasePath(config.basePath),
35
+ redirect: config.trailingSlashRedirect,
36
+ }))
23
37
 
24
38
  return async (context, next) => {
25
39
  const url = new URL(context.req.url)
26
- const basePath = await basePathPromise
40
+ const { basePath, redirect } = await optionsPromise
27
41
 
28
42
  // Skip root path, base path root, and paths with file extensions
29
43
  if (url.pathname === '/' || url.pathname === basePath || /\.\w+$/.test(url.pathname))
30
44
  return next()
31
45
 
32
- // Redirect trailing slash to non-trailing slash
33
46
  if (url.pathname.endsWith('/')) {
34
- const destination = appendSearch(url.pathname.slice(0, -1), url.search)
35
- context.res = context.redirect(destination, 308)
36
- return
47
+ const pathname = url.pathname.slice(0, -1)
48
+
49
+ // Emit a redirect to the no-slash form (default).
50
+ if (redirect) {
51
+ const destination = appendSearch(pathname, url.search)
52
+ context.res = context.redirect(destination, 308)
53
+ return
54
+ }
55
+
56
+ // Otherwise, normalize the path internally (no redirect) so downstream
57
+ // routing matches the no-slash route. Preserves the query string.
58
+ url.pathname = pathname
59
+ context.req.raw = new Request(url, context.req.raw)
60
+ return next()
37
61
  }
38
62
 
39
63
  return next()
@@ -45,5 +69,12 @@ export default trailingSlash
45
69
  export declare namespace trailingSlash {
46
70
  type Options = {
47
71
  basePath?: string | undefined
72
+ /**
73
+ * Whether to emit a 308 redirect to the no-slash form. When `false`, the
74
+ * trailing slash is stripped internally for routing without a redirect.
75
+ *
76
+ * @default true
77
+ */
78
+ redirect?: boolean | undefined
48
79
  }
49
80
  }