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.
- package/dist/internal/config.d.ts +12 -0
- package/dist/internal/config.d.ts.map +1 -1
- package/dist/internal/config.js +2 -1
- package/dist/internal/config.js.map +1 -1
- package/dist/waku/internal/middleware/trailing-slash.d.ts +19 -4
- package/dist/waku/internal/middleware/trailing-slash.d.ts.map +1 -1
- package/dist/waku/internal/middleware/trailing-slash.js +34 -12
- package/dist/waku/internal/middleware/trailing-slash.js.map +1 -1
- package/package.json +1 -1
- package/src/internal/config.ts +14 -0
- package/src/waku/internal/middleware/trailing-slash.test.ts +34 -1
- package/src/waku/internal/middleware/trailing-slash.ts +44 -13
|
@@ -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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"}
|
package/dist/internal/config.js
CHANGED
|
@@ -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":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAQjC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AAInC,OAAO,EAAE,IAAI,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAA;
|
|
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
|
-
*
|
|
3
|
+
* Normalizes trailing slashes on page URLs (e.g. `/about/` → `/about`).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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
|
|
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
|
-
*
|
|
5
|
+
* Normalizes trailing slashes on page URLs (e.g. `/about/` → `/about`).
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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
|
|
17
|
-
? Promise.resolve(
|
|
18
|
-
|
|
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
|
|
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
|
|
28
|
-
|
|
29
|
-
|
|
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
|
|
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
package/src/internal/config.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
*
|
|
8
|
+
* Normalizes trailing slashes on page URLs (e.g. `/about/` → `/about`).
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
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
|
|
20
|
-
options.basePath !== undefined
|
|
21
|
-
? Promise.resolve(
|
|
22
|
-
|
|
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
|
|
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
|
|
35
|
-
|
|
36
|
-
|
|
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
|
}
|