├── .gitignore ├── .yarnrc ├── api └── index.js ├── license.md ├── readme.md └── vercel.json /.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | node_modules 3 | 4 | # logs 5 | npm-debug.log 6 | -------------------------------------------------------------------------------- /.yarnrc: -------------------------------------------------------------------------------- 1 | save-prefix "" 2 | -------------------------------------------------------------------------------- /api/index.js: -------------------------------------------------------------------------------- 1 | module.exports = (request, response) => { 2 | const { url } = request; 3 | const urlParts = url.split("/"); 4 | 5 | if (url === "/") { 6 | response.writeHead(302, { 7 | Location: `https://vercel.com`, 8 | }); 9 | 10 | response.end(); 11 | return; 12 | } 13 | 14 | if (urlParts.length < 3) { 15 | response.writeHead(400, { 16 | "Content-Type": "application/json", 17 | }); 18 | response.end(JSON.stringify({ 19 | error: "Please specify all the missing data (see the repo)!", 20 | errorHandle: "missing_data", 21 | })); 22 | return; 23 | } 24 | 25 | const isVercel = urlParts.length === 3; 26 | const user = isVercel ? "vercel" : urlParts[1]; 27 | const repo = urlParts[isVercel ? 1 : 2]; 28 | const code = urlParts[isVercel ? 2 : 3]; 29 | 30 | if (user === "vercel" && repo === "next.js") { 31 | response.writeHead(302, { 32 | Location: `https://nextjs.org/docs/messages/${code}`, 33 | }); 34 | } else { 35 | response.writeHead(302, { 36 | Location: `https://github.com/${user}/${repo}/blob/master/errors/${code}.md`, 37 | }); 38 | } 39 | 40 | response.end(); 41 | }; 42 | -------------------------------------------------------------------------------- /license.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Vercel, Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # err.sh 2 | 3 | This microservice forwards you to detailed error messages. 4 | 5 | Example: https://err.sh/micro/path-missing 6 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "functions": { 3 | "api/index.js": { 4 | "maxDuration": 3 5 | } 6 | }, 7 | "rewrites": [ 8 | { 9 | "source": "/(.*)", 10 | "destination": "/api/index.js" 11 | } 12 | ] 13 | } 14 | --------------------------------------------------------------------------------