|
1 |
| -function redirect(location) { |
| 1 | +function redirect(path) { |
2 | 2 | return {
|
3 | 3 | statusCode: 301,
|
4 | 4 | statusDescription: 'Moved Permanently',
|
5 | 5 | headers: {
|
6 |
| - 'cache-control': { |
7 |
| - value: 'public, max-age=86400', |
8 |
| - }, |
9 |
| - location: { |
10 |
| - value: location, |
11 |
| - }, |
12 |
| - }, |
| 6 | + 'cache-control': { value: 'public, max-age=86400' }, |
| 7 | + location: { value: `https://surrealdb.com${path}` } |
| 8 | + } |
13 | 9 | };
|
14 | 10 | }
|
15 | 11 |
|
16 | 12 | function handler(event) {
|
17 |
| - |
18 | 13 | const request = event.request;
|
19 | 14 | const host = request.headers.host.value;
|
20 |
| - let path = request.uri.toLowerCase(); |
21 |
| - |
22 |
| - // Only use the base domain, not subdomains |
23 |
| - if (host !== 'surrealdb.com') { |
24 |
| - return redirect(`https://surrealdb.com${path}`); |
25 |
| - } |
| 15 | + const path = request.uri.toLowerCase(); |
26 | 16 |
|
27 |
| - // Docusaurus base path always has a trailing slash |
28 |
| - if (path === '/docs') { |
29 |
| - return redirect('https://surrealdb.com/docs/'); |
30 |
| - } |
31 |
| - |
32 |
| - // Display the content for the documentation path |
| 17 | + if (host !== 'surrealdb.com') return redirect(path); |
| 18 | + if (path === '/docs') return redirect('/docs/'); |
33 | 19 | if (path === '/docs/') {
|
34 |
| - request.uri = request.uri.concat('index.html'); |
| 20 | + request.uri += 'index.html'; |
35 | 21 | return request;
|
36 | 22 | }
|
37 | 23 |
|
38 |
| - // Display any documentation assets and image files |
39 |
| - if (path.startsWith('/docs/_astro/') || path.startsWith('/docs/~partytown/') || path === '/docs/llms.txt') { |
40 |
| - return request; |
41 |
| - } |
| 24 | + if (/^\/docs\/(_astro\/|~partytown\/)|\/docs\/llms\.txt$/.test(path)) return request; |
| 25 | + if (request.uri.endsWith('/')) return redirect(path.slice(0, -1)); |
| 26 | + if (path !== request.uri) return redirect(path); |
42 | 27 |
|
43 |
| - // Redirect any paths which have trailing slashes |
44 |
| - if (request.uri.endsWith('/')) { |
45 |
| - return redirect(`https://surrealdb.com${path.slice(0, -1)}`); |
46 |
| - } |
| 28 | + const redirects = { |
| 29 | + '/docs/integration/libraries': '/docs/surrealdb/integration/sdks', |
| 30 | + '/docs/integration/websocket/text': '/docs/surrealdb/integration/rpc', |
| 31 | + '/docs/integration/websocket/binary': '/docs/surrealdb/integration/rpc', |
| 32 | + '/docs/surrealdb/integration/websocket': '/docs/surrealdb/integration/rpc', |
| 33 | + '/docs/surrealql/statements/define/login': '/docs/surrealdb/surrealql/statements/define/user', |
| 34 | + '/docs/integration/libraries/nodejs': '/docs/sdk/javascript', |
| 35 | + '/docs/surrealdb/integration/sdks/nodejs': '/docs/sdk/javascript', |
| 36 | + '/docs/integration/libraries/deno': '/docs/sdk/javascript', |
| 37 | + '/docs/surrealdb/integration/sdks/deno': '/docs/sdk/javascript', |
| 38 | + '/docs/sdk/javascript/core/initialization': '/docs/sdk/javascript/core/create-a-new-connection', |
| 39 | + '/docs/sdk/javascript/core/authentication': '/docs/sdk/javascript/core/handling-authentication', |
| 40 | + '/docs/sdk/javascript/core/data-querying': '/docs/sdk/javascript/core/data-maniplulation', |
| 41 | + '/docs/sdk/javascript/core/methods/authenticate': '/docs/sdk/javascript/methods/authenticate', |
| 42 | + '/docs/sdk/javascript/core/methods/invalidate': '/docs/sdk/javascript/methods/invalidate', |
| 43 | + '/docs/sdk/javascript/setup': '/docs/sdk/javascript/core', |
| 44 | + '/docs/intro': '/docs/surrealdb', |
| 45 | + '/docs/surrealdb/intro': '/docs/surrealdb', |
| 46 | + '/docs/cli/overview': '/docs/surrealdb/cli', |
| 47 | + '/docs/surrealdb/cli/overview': '/docs/surrealdb/cli', |
| 48 | + '/docs/deployment/overview': '/docs/surrealdb/deployment', |
| 49 | + '/docs/surrealdb/deployment/overview': '/docs/surrealdb/deployment', |
| 50 | + '/docs/embedding/overview': '/docs/surrealdb/embedding', |
| 51 | + '/docs/surrealdb/embedding/overview': '/docs/surrealdb/embedding', |
| 52 | + '/docs/faqs/overview': '/docs/surrealdb/faqs', |
| 53 | + '/docs/surrealdb/faqs/overview': '/docs/surrealdb/faqs', |
| 54 | + '/docs/how-to/overview': '/docs/tutorials', |
| 55 | + '/docs/surrealdb/how-to/overview': '/docs/tutorials', |
| 56 | + '/docs/tutorials/overview': '/docs/tutorials', |
| 57 | + '/docs/surrealdb/tutorials/overview': '/docs/tutorials', |
| 58 | + '/docs/surrealdb/tutorials': '/docs/tutorials', |
| 59 | + '/docs/installation/overview': '/docs/surrealdb/installation', |
| 60 | + '/docs/surrealdb/installation/overview': '/docs/surrealdb/installation', |
| 61 | + '/docs/integration/overview': '/docs/surrealdb/integration', |
| 62 | + '/docs/surrealdb/integration/overview': '/docs/surrealdb/integration', |
| 63 | + '/docs/integration/sdks/overview': '/docs/surrealdb/integration/sdks', |
| 64 | + '/docs/surrealdb/integration/sdks/overview': '/docs/surrealdb/integration/sdks', |
| 65 | + '/docs/introduction/overview': '/docs/surrealdb/introduction', |
| 66 | + '/docs/surrealdb/introduction/overview': '/docs/surrealdb/introduction', |
| 67 | + '/docs/surrealql/overview': '/docs/surrealdb/surrealql', |
| 68 | + '/docs/surrealdb/surrealql/overview': '/docs/surrealdb/surrealql', |
| 69 | + '/docs/surrealql/datamodel/overview': '/docs/surrealdb/surrealql/datamodel', |
| 70 | + '/docs/surrealdb/surrealql/datamodel/overview': '/docs/surrealdb/surrealql/datamodel', |
| 71 | + '/docs/surrealql/functions/overview': '/docs/surrealdb/surrealql/functions', |
| 72 | + '/docs/surrealdb/surrealql/functions/overview': '/docs/surrealdb/surrealql/functions', |
| 73 | + '/docs/surrealql/functions/script/overview': '/docs/surrealdb/surrealql/functions/script', |
| 74 | + '/docs/surrealdb/surrealql/functions/script/overview': '/docs/surrealdb/surrealql/functions/script', |
| 75 | + '/docs/surrealql/statements/overview': '/docs/surrealdb/surrealql/statements', |
| 76 | + '/docs/surrealdb/surrealql/statements/overview': '/docs/surrealdb/surrealql/statements', |
| 77 | + '/docs/surrealdb/surrealql': '/docs/surrealql', |
| 78 | + '/docs/surrealql/statements/define/overview': '/docs/surrealdb/surrealql/statements/define', |
| 79 | + '/docs/surrealdb/surrealql/statements/define/overview': '/docs/surrealdb/surrealql/statements/define', |
| 80 | + '/docs/surrealql/statements/remove/overview': '/docs/surrealdb/surrealql/statements/remove', |
| 81 | + '/docs/surrealdb/surrealql/statements/remove/overview': '/docs/surrealdb/surrealql/statements/remove', |
| 82 | + '/docs/surrealdb/installation/upgrading/beta': '/docs/surrealdb/installation/upgrading/migrating-data-to-2x' |
| 83 | + }; |
47 | 84 |
|
48 |
| - // Redirect any capitalised paths to lowercase |
49 |
| - if (path !== request.uri) { |
50 |
| - return redirect(`https://surrealdb.com${path}`); |
51 |
| - } |
| 85 | + if (redirects[path]) return redirect(redirects[path]); |
| 86 | + |
| 87 | + const versionPrefixes = [ |
| 88 | + '/docs/nightly/', |
| 89 | + '/docs/surrealdb/nightly/', |
| 90 | + '/docs/1.0.x/', '/docs/1.0.0/', |
| 91 | + '/docs/1.1.x/', '/docs/1.1.0/', |
| 92 | + '/docs/1.2.x/', '/docs/1.2.0/', |
| 93 | + '/docs/1.3.x/', '/docs/1.3.0/', |
| 94 | + '/docs/surrealdb/2.x/', |
| 95 | + '/docs/surrealdb/1.0.x/', '/docs/surrealdb/1.0.0/', |
| 96 | + '/docs/surrealdb/1.1.x/', '/docs/surrealdb/1.1.0/', |
| 97 | + '/docs/surrealdb/1.2.x/', '/docs/surrealdb/1.2.0/', |
| 98 | + '/docs/surrealdb/1.3.x/', '/docs/surrealdb/1.3.0/' |
| 99 | + ]; |
52 | 100 |
|
53 |
| - if (path.endsWith('/')) { |
54 |
| - path = path.slice(0, -1); |
| 101 | + for (const prefix of versionPrefixes) { |
| 102 | + if (path.startsWith(prefix)) { |
| 103 | + return redirect(`/docs/surrealdb/${path.slice(prefix.length)}`); |
| 104 | + } |
55 | 105 | }
|
56 | 106 |
|
57 |
| - switch (path) { |
58 |
| - // Redirect old sdk libraries page |
59 |
| - case '/docs/integration/libraries': |
60 |
| - return redirect('https://surrealdb.com/docs/surrealdb/integration/sdks'); |
61 |
| - // Redirect old websocket protocol page |
62 |
| - case '/docs/integration/websocket/text': |
63 |
| - case '/docs/integration/websocket/binary': |
64 |
| - case '/docs/surrealdb/integration/websocket': |
65 |
| - return redirect('https://surrealdb.com/docs/surrealdb/integration/rpc'); |
66 |
| - // Redirect old DEFINE LOGIN statement page |
67 |
| - case '/docs/surrealql/statements/define/login': |
68 |
| - return redirect('https://surrealdb.com/docs/surrealdb/surrealql/statements/define/user'); |
69 |
| - // Redirect NodeJS docs to JavaScript docs |
70 |
| - case '/docs/integration/libraries/nodejs': |
71 |
| - case '/docs/surrealdb/integration/sdks/nodejs': |
72 |
| - return redirect('https://surrealdb.com/docs/sdk/javascript'); |
73 |
| - // Redirect Deno docs to JavaScript docs |
74 |
| - case '/docs/integration/libraries/deno': |
75 |
| - case '/docs/surrealdb/integration/sdks/deno': |
76 |
| - return redirect('https://surrealdb.com/docs/sdk/javascript'); |
77 |
| - // Redirect broken JS SDK doc urls |
78 |
| - case '/docs/sdk/javascript/core/initialization': |
79 |
| - return redirect('/docs/sdk/javascript/core/create-a-new-connection'); |
80 |
| - case '/docs/sdk/javascript/core/authentication': |
81 |
| - return redirect('/docs/sdk/javascript/core/handling-authentication'); |
82 |
| - case '/docs/sdk/javascript/core/data-querying': |
83 |
| - return redirect('/docs/sdk/javascript/core/data-maniplulation'); |
84 |
| - case '/docs/sdk/javascript/core/methods/authenticate': |
85 |
| - return redirect('/docs/sdk/javascript/methods/authenticate'); |
86 |
| - case '/docs/sdk/javascript/core/methods/invalidate': |
87 |
| - return redirect('/docs/sdk/javascript/methods/invalidate'); |
88 |
| - case '/docs/sdk/javascript/setup': |
89 |
| - return redirect('/docs/sdk/javascript/core'); |
90 |
| - // Redirect old SurrealQL functions pages |
91 |
| - case '/docs/surrealdb/surrealql/functions/array': |
92 |
| - case '/docs/surrealdb/surrealql/functions/count': |
93 |
| - case '/docs/surrealdb/surrealql/functions/crypto': |
94 |
| - case '/docs/surrealdb/surrealql/functions/duration': |
95 |
| - case '/docs/surrealdb/surrealql/functions/encoding': |
96 |
| - case '/docs/surrealdb/surrealql/functions/geo': |
97 |
| - case '/docs/surrealdb/surrealql/functions/http': |
98 |
| - case '/docs/surrealdb/surrealql/functions/math': |
99 |
| - case '/docs/surrealdb/surrealql/functions/meta': |
100 |
| - case '/docs/surrealdb/surrealql/functions/object': |
101 |
| - case '/docs/surrealdb/surrealql/functions/parse': |
102 |
| - case '/docs/surrealdb/surrealql/functions/rand': |
103 |
| - case '/docs/surrealdb/surrealql/functions/search': |
104 |
| - case '/docs/surrealdb/surrealql/functions/session': |
105 |
| - case '/docs/surrealdb/surrealql/functions/sleep': |
106 |
| - case '/docs/surrealdb/surrealql/functions/string': |
107 |
| - case '/docs/surrealdb/surrealql/functions/time': |
108 |
| - case '/docs/surrealdb/surrealql/functions/type': |
109 |
| - case '/docs/surrealdb/surrealql/functions/vector': |
110 |
| - return redirect(`https://surrealdb.com/docs/surrealdb/surrealql/functions/database/${path.slice(36)}`); |
111 |
| - // Redirect old directory structure |
112 |
| - case '/docs/intro': |
113 |
| - case '/docs/surrealdb/intro': |
114 |
| - return redirect('https://surrealdb.com/docs/surrealdb'); |
115 |
| - case '/docs/cli/overview': |
116 |
| - case '/docs/surrealdb/cli/overview': |
117 |
| - return redirect('https://surrealdb.com/docs/surrealdb/cli'); |
118 |
| - case '/docs/deployment/overview': |
119 |
| - case '/docs/surrealdb/deployment/overview': |
120 |
| - return redirect('https://surrealdb.com/docs/surrealdb/deployment'); |
121 |
| - case '/docs/embedding/overview': |
122 |
| - case '/docs/surrealdb/embedding/overview': |
123 |
| - return redirect('https://surrealdb.com/docs/surrealdb/embedding'); |
124 |
| - case '/docs/faqs/overview': |
125 |
| - case '/docs/surrealdb/faqs/overview': |
126 |
| - return redirect('https://surrealdb.com/docs/surrealdb/faqs'); |
127 |
| - case '/docs/how-to/overview': |
128 |
| - case '/docs/surrealdb/how-to/overview': |
129 |
| - return redirect('https://surrealdb.com/docs/tutorials'); |
130 |
| - case '/docs/tutorials/overview': |
131 |
| - case '/docs/surrealdb/tutorials/overview': |
132 |
| - return redirect('https://surrealdb.com/docs/tutorials'); |
133 |
| - case '/docs/surrealdb/tutorials': |
134 |
| - return redirect('https://surrealdb.com/docs/tutorials'); |
135 |
| - case '/docs/installation/overview': |
136 |
| - case '/docs/surrealdb/installation/overview': |
137 |
| - return redirect('https://surrealdb.com/docs/surrealdb/installation'); |
138 |
| - case '/docs/integration/overview': |
139 |
| - case '/docs/surrealdb/integration/overview': |
140 |
| - return redirect('https://surrealdb.com/docs/surrealdb/integration'); |
141 |
| - case '/docs/integration/sdks/overview': |
142 |
| - case '/docs/surrealdb/integration/sdks/overview': |
143 |
| - return redirect('https://surrealdb.com/docs/surrealdb/integration/sdks'); |
144 |
| - case '/docs/introduction/overview': |
145 |
| - case '/docs/surrealdb/introduction/overview': |
146 |
| - return redirect('https://surrealdb.com/docs/surrealdb/introduction'); |
147 |
| - case '/docs/surrealql/overview': |
148 |
| - case '/docs/surrealdb/surrealql/overview': |
149 |
| - return redirect('https://surrealdb.com/docs/surrealdb/surrealql'); |
150 |
| - case '/docs/surrealql/datamodel/overview': |
151 |
| - case '/docs/surrealdb/surrealql/datamodel/overview': |
152 |
| - return redirect('https://surrealdb.com/docs/surrealdb/surrealql/datamodel'); |
153 |
| - case '/docs/surrealql/functions/overview': |
154 |
| - case '/docs/surrealdb/surrealql/functions/overview': |
155 |
| - return redirect('https://surrealdb.com/docs/surrealdb/surrealql/functions'); |
156 |
| - case '/docs/surrealql/functions/script/overview': |
157 |
| - case '/docs/surrealdb/surrealql/functions/script/overview': |
158 |
| - return redirect('https://surrealdb.com/docs/surrealdb/surrealql/functions/script'); |
159 |
| - case '/docs/surrealql/statements/overview': |
160 |
| - case '/docs/surrealdb/surrealql/statements/overview': |
161 |
| - return redirect('https://surrealdb.com/docs/surrealdb/surrealql/statements'); |
162 |
| - case '/docs/surrealdb/surrealql': |
163 |
| - return redirect('https://surrealdb.com/docs/surrealql'); |
164 |
| - case '/docs/surrealql/statements/define/overview': |
165 |
| - case '/docs/surrealdb/surrealql/statements/define/overview': |
166 |
| - return redirect('https://surrealdb.com/docs/surrealdb/surrealql/statements/define'); |
167 |
| - case '/docs/surrealql/statements/remove/overview': |
168 |
| - case '/docs/surrealdb/surrealql/statements/remove/overview': |
169 |
| - return redirect('https://surrealdb.com/docs/surrealdb/surrealql/statements/remove'); |
170 |
| - case '/docs/surrealdb/installation/upgrading/beta': |
171 |
| - return redirect('/docs/surrealdb/installation/upgrading/migrating-data-to-2x'); |
172 |
| - case '/docs/1.0.x': |
173 |
| - case '/docs/1.0.0': |
174 |
| - case '/docs/1.1.x': |
175 |
| - case '/docs/1.1.0': |
176 |
| - case '/docs/1.2.x': |
177 |
| - case '/docs/1.2.0': |
178 |
| - case '/docs/1.3.x': |
179 |
| - case '/docs/1.3.0': |
180 |
| - case '/docs/surrealdb/2.x': |
181 |
| - case '/docs/surrealdb/1.0.x': |
182 |
| - case '/docs/surrealdb/1.0.0': |
183 |
| - case '/docs/surrealdb/1.1.x': |
184 |
| - case '/docs/surrealdb/1.1.0': |
185 |
| - case '/docs/surrealdb/1.2.x': |
186 |
| - case '/docs/surrealdb/1.2.0': |
187 |
| - case '/docs/surrealdb/1.3.x': |
188 |
| - case '/docs/surrealdb/1.3.0': |
189 |
| - return redirect('https://surrealdb.com/docs/surrealdb'); |
| 107 | + if (path.startsWith('/docs/integration/libraries/')) { |
| 108 | + return redirect(`/docs/sdk/${path.slice(28)}`); |
| 109 | + } |
| 110 | + if (path.startsWith('/docs/surrealdb/integration/sdks/')) { |
| 111 | + return redirect(`/docs/sdk/${path.slice(33)}`); |
190 | 112 | }
|
191 | 113 |
|
192 |
| - switch (true) { |
193 |
| - // Redirect nightly pages to default |
194 |
| - case path.startsWith('/docs/nightly/'): |
195 |
| - return redirect(`https://surrealdb.com/docs/surrealdb/${path.slice(14)}`); |
196 |
| - // Redirect nightly pages to default |
197 |
| - case path.startsWith('/docs/surrealdb/nightly/'): |
198 |
| - return redirect(`https://surrealdb.com/docs/surrealdb/${path.slice(24)}`); |
199 |
| - // Redirect versioned pages to default |
200 |
| - case path.startsWith('/docs/1.0.x/'): |
201 |
| - case path.startsWith('/docs/1.0.0/'): |
202 |
| - case path.startsWith('/docs/1.1.x/'): |
203 |
| - case path.startsWith('/docs/1.1.0/'): |
204 |
| - case path.startsWith('/docs/1.2.x/'): |
205 |
| - case path.startsWith('/docs/1.2.0/'): |
206 |
| - case path.startsWith('/docs/1.3.x/'): |
207 |
| - case path.startsWith('/docs/1.3.0/'): |
208 |
| - return redirect(`https://surrealdb.com/docs/surrealdb/${path.slice(12)}`); |
209 |
| - // Redirect versioned pages to default |
210 |
| - case path.startsWith('/docs/surrealdb/2.x/'): |
211 |
| - return redirect(`https://surrealdb.com/docs/surrealdb/${path.slice(20)}`); |
212 |
| - case path.startsWith('/docs/surrealdb/1.0.x/'): |
213 |
| - case path.startsWith('/docs/surrealdb/1.0.0/'): |
214 |
| - case path.startsWith('/docs/surrealdb/1.1.x/'): |
215 |
| - case path.startsWith('/docs/surrealdb/1.1.0/'): |
216 |
| - case path.startsWith('/docs/surrealdb/1.2.x/'): |
217 |
| - case path.startsWith('/docs/surrealdb/1.2.0/'): |
218 |
| - case path.startsWith('/docs/surrealdb/1.3.x/'): |
219 |
| - case path.startsWith('/docs/surrealdb/1.3.0/'): |
220 |
| - return redirect(`https://surrealdb.com/docs/surrealdb/${path.slice(22)}`); |
221 |
| - // Redirect libraries pages to sdks |
222 |
| - case path.startsWith('/docs/integration/libraries/'): |
223 |
| - return redirect(`https://surrealdb.com/docs/sdk/${path.slice(28)}`); |
224 |
| - case path.startsWith('/docs/surrealdb/integration/sdks/'): |
225 |
| - return redirect(`https://surrealdb.com/docs/sdk/${path.slice(33)}`); |
226 |
| - // Redirect how-to pages to tutorials |
227 |
| - case path.startsWith('/docs/how-to/'): |
228 |
| - return redirect(`https://surrealdb.com/docs/tutorials/${path.slice(13)}`); |
229 |
| - case path.startsWith('/docs/surrealdb/how-to/'): |
230 |
| - return redirect(`https://surrealdb.com/docs/tutorials/${path.slice(23)}`); |
231 |
| - case path.startsWith('/docs/surrealdb/tutorials/'): |
232 |
| - return redirect(`https://surrealdb.com/docs/tutorials/${path.slice(26)}`); |
233 |
| - // Redirect SurrealQL subpaths to Querying |
234 |
| - case path.startsWith('/docs/surrealdb/surrealql/'): |
235 |
| - return redirect(`https://surrealdb.com/docs/surrealql/${path.slice(26)}`); |
236 |
| - // Redirect all other docs pages |
237 |
| - case path.startsWith('/docs/'): { |
238 |
| - const splitted = path.split('/').slice(1); |
239 |
| - switch (splitted[1]) { |
240 |
| - case 'surrealdb': |
241 |
| - case 'surrealml': |
242 |
| - case 'surrealist': |
243 |
| - case 'surrealism': |
244 |
| - case 'surrealql': |
245 |
| - case 'sdk': |
246 |
| - case 'tutorials': |
247 |
| - case 'cloud': |
248 |
| - case undefined: |
249 |
| - break; |
250 |
| - default: |
251 |
| - // Skip redirection for llms.txt which is already handled above |
252 |
| - if (path === '/docs/llms.txt') { |
253 |
| - break; |
254 |
| - } |
255 |
| - return redirect(`https://surrealdb.com/docs/surrealdb/${path.slice(6)}`); |
256 |
| - } |
| 114 | + if (path.startsWith('/docs/')) { |
| 115 | + const section = path.split('/')[2]; |
| 116 | + const validSections = ['surrealdb', 'surrealml', 'surrealist', 'surrealism', 'surrealql', 'sdk', 'tutorials', 'cloud']; |
| 117 | + if (!validSections.includes(section) && path !== '/docs/llms.txt') { |
| 118 | + return redirect(`/docs/surrealdb/${path.slice(6)}`); |
257 | 119 | }
|
258 | 120 | }
|
259 | 121 |
|
260 |
| - request.uri = request.uri.concat('/index.html'); |
261 |
| - |
| 122 | + request.uri += '/index.html'; |
262 | 123 | return request;
|
263 | 124 | }
|
0 commit comments