├── README.md ├── package.json ├── public ├── script.js └── style.css ├── server.js └── yarn.lock /README.md: -------------------------------------------------------------------------------- 1 | # Notion for Hack Club 🌈 2 | 3 | This is lightly adapted but basically a clone of the incredible 4 | [Melody](https://github.com/pixelyunicorn)’s 5 | [glitch.com/~notion](https://glitch.com/~notion). Head there to read how it 6 | works & make your own! 7 | 8 | In the future, we’re converting this to serverless/run on Vercel, but getting 9 | this up as a stopgap. Hang tight! 10 | 11 | [**notebook.hackclub.com**](https://notebook.hackclub.com) 12 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@hackclub/notebook", 3 | "version": "0.0.1", 4 | "description": "Hack Club’s Notion-powered Notebook", 5 | "main": "server.js", 6 | "scripts": { 7 | "start": "node server.js" 8 | }, 9 | "dependencies": { 10 | "express": "^4.17.1", 11 | "node-fetch": "^2.6.1" 12 | }, 13 | "repository": { 14 | "url": "https://github.com/hackclub/notebook" 15 | }, 16 | "license": "MIT" 17 | } 18 | -------------------------------------------------------------------------------- /public/script.js: -------------------------------------------------------------------------------- 1 | // client-side js 2 | // run by the browser each time the page is loaded 3 | 4 | console.log("hello notion friends :o"); 5 | -------------------------------------------------------------------------------- /public/style.css: -------------------------------------------------------------------------------- 1 | /* this file is styles your notion :) */ 2 | /* if you're overriding inline styles, add !important */ 3 | /* looking for inspiration? see melody's CSS: */ 4 | /* https://glitch.com/edit/#!/melody-notion?path=public%2Fstyle.css */ 5 | 6 | @font-face { 7 | font-family: 'Phantom Sans'; 8 | src: url('https://assets.hackclub.com/fonts/Phantom_Sans_0.7/Regular.woff') 9 | format('woff'), 10 | url('https://assets.hackclub.com/fonts/Phantom_Sans_0.7/Regular.woff2') 11 | format('woff2'); 12 | font-weight: normal; 13 | font-style: normal; 14 | font-display: swap; 15 | } 16 | @font-face { 17 | font-family: 'Phantom Sans'; 18 | src: url('https://assets.hackclub.com/fonts/Phantom_Sans_0.7/Italic.woff') 19 | format('woff'), 20 | url('https://assets.hackclub.com/fonts/Phantom_Sans_0.7/Italic.woff2') 21 | format('woff2'); 22 | font-weight: normal; 23 | font-style: italic; 24 | font-display: swap; 25 | } 26 | @font-face { 27 | font-family: 'Phantom Sans'; 28 | src: url('https://assets.hackclub.com/fonts/Phantom_Sans_0.7/Bold.woff') 29 | format('woff'), 30 | url('https://assets.hackclub.com/fonts/Phantom_Sans_0.7/Bold.woff2') 31 | format('woff2'); 32 | font-weight: bold; 33 | font-style: normal; 34 | font-display: swap; 35 | } 36 | 37 | /* body font */ 38 | * { 39 | font-family: "Phantom Sans", sans-serif; 40 | } 41 | 42 | /* header font 43 | .notion-header-block *, 44 | .notion-sub_header-block *, 45 | .notion-scroller .notion-page-block[style*="cursor: text"] *, 46 | .notion-scroller .notion-collection_view-block[style*="cursor: text"] * { 47 | font-family: "Playfair Display", serif; 48 | } */ 49 | 50 | /* non-header page title fonts (topbar, boards, calendar) */ 51 | .notion-topbar *, 52 | .notion-page-block.notion-collection-item > a > div > div > div, 53 | .notion-page-block.notion-collection-item > a > div > div > div > div { 54 | font-family: "Phantom Sans", sans-serif; 55 | } 56 | 57 | /* monospace font */ 58 | /* 59 | pre *, 60 | code *, 61 | .notion-page-content[style*="iawriter-mono"] * { 62 | font-family: "Space Mono", monospace; 63 | } 64 | */ 65 | 66 | /* light mode (default) colours */ 67 | body, 68 | body.notion-body .notion-cursor-listener, 69 | .notion-app-inner.notion-light-theme .notion-frame, 70 | .notion-app-inner.notion-light-theme 71 | .notion-board-view 72 | > div:first-of-type 73 | > div, 74 | .notion-app-inner.notion-light-theme 75 | .notion-board-view 76 | > div:first-of-type 77 | > div 78 | > div:last-of-type { 79 | background: #fff !important; 80 | } 81 | 82 | /* dark mode colours */ 83 | body.notion-body.dark .notion-cursor-listener, 84 | .notion-app-inner.notion-dark-theme .notion-frame, 85 | .notion-app-inner.notion-dark-theme 86 | .notion-board-view 87 | > div:first-of-type 88 | > div, 89 | .notion-app-inner.notion-dark-theme 90 | .notion-board-view 91 | > div:first-of-type 92 | > div 93 | > div:last-of-type { 94 | background: #331e3e !important; 95 | } 96 | 97 | /* editor sidebars */ 98 | .notion-light-theme .notion-sidebar { 99 | } 100 | .notion-dark-theme .notion-sidebar { 101 | } 102 | 103 | /* hide notion button in top right corner */ 104 | .notion-topbar > div:last-of-type > div[role="button"]:last-of-type, 105 | .notion-topbar div[style*="width: 1px"] { 106 | display: none !important; 107 | } 108 | 109 | /* fix for calendar & boards on custom backgrounds */ 110 | .notion-board-view > div:first-of-type > div, 111 | .notion-board-view > div:first-of-type > div > div:last-of-type { 112 | box-shadow: none !important; 113 | } 114 | .notion-calendar-view > div:first-of-type > div:first-of-type { 115 | box-shadow: rgba(55, 53, 47, 0.16) 0px 1px 0px inset, 116 | rgba(55, 53, 47, 0.16) 1px 0px 0px inset, 117 | rgba(55, 53, 47, 0.16) -1px 0px 0px inset !important; 118 | } 119 | 120 | /* page title */ 121 | .notion-scroller .notion-page-block[style*="cursor: text"] *, 122 | .notion-scroller .notion-collection_view-block[style*="cursor: text"] * { 123 | } 124 | 125 | /* callout blocks */ 126 | .notion-callout-block > div > div { 127 | } 128 | 129 | /* horizontal rules */ 130 | .notion-divider-block > div > div { 131 | } 132 | 133 | /* top bar */ 134 | .notion-topbar { 135 | } 136 | 137 | /* overlay top bar */ 138 | .notion-peek-renderer div[style*="height: 45px"] { 139 | } 140 | 141 | /* frosted top bar */ 142 | .notion-frame > .notion-scroller { 143 | margin-top: -45px; 144 | padding-top: 45px; 145 | } 146 | 147 | .notion-topbar { 148 | -webkit-backdrop-filter: blur(10px) saturate(180%); 149 | backdrop-filter: blur(10px) saturate(180%); 150 | } 151 | 152 | .notion-light-theme .notion-topbar { 153 | background-color: rgba(255, 255, 255, 0.5); 154 | border-bottom: 1px solid #88888888; 155 | } 156 | 157 | .notion-dark-theme .notion-topbar { 158 | background-color: rgba(20, 20, 20, 0.5); 159 | } 160 | 161 | /* calendar item background colour hack */ 162 | /* the bottom-most visible property must be a select or multi-select */ 163 | /* the first tag will be the item's background colour */ 164 | /* (this might not work) */ 165 | 166 | /* 167 | .notion-calendar-view .notion-page-block.notion-collection-item > a { 168 | position: relative; 169 | } 170 | 171 | .notion-calendar-view 172 | .notion-page-block.notion-collection-item 173 | > a 174 | > div 175 | > div:last-of-type 176 | > div 177 | > div 178 | > div:first-of-type:after { 179 | content: " "; 180 | background-color: inherit; 181 | position: absolute; 182 | top: 0; 183 | left: 0; 184 | width: 100%; 185 | height: 100% !important; 186 | opacity: 0.5; 187 | } 188 | */ 189 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const events = require('events') 3 | const fetch = require('node-fetch') 4 | const app = express() 5 | var eventEmitter = new events.EventEmitter() 6 | 7 | // make all the files in 'public' available 8 | app.use(express.static('public')) 9 | app.use(express.json()) 10 | 11 | // set this up with a public notion page link and glitch domain 12 | // (don't forget to name your project on glitch first!) 13 | const MY_DOMAIN = 'notebook.hackclub.com' 14 | const START_PAGE = 15 | 'https://www.notion.so/hackclub/Coming-Soon-bdd9d167a912466d80a356f138cfdecd' 16 | 17 | // code injected near the end of the tag 18 | // styling and meta tags should go here 19 | let INJECT_INTO_HEAD = ` 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | ` 39 | 40 | // code injected near the end of the tag 41 | // analytics and other scripts should go here 42 | let INJECT_INTO_FOOT = ` 43 | ` 44 | // 45 | 46 | eventEmitter.on('fetch', event => { 47 | event.respondWith(fetchAndApply(event.request)) 48 | }) 49 | const corsHeaders = { 50 | 'Access-Control-Allow-Origin': '*', 51 | 'Access-Control-Allow-Methods': 'GET, HEAD, POST,PUT, OPTIONS', 52 | 'Access-Control-Allow-Headers': 'Content-Type' 53 | } 54 | function handleOptions(request) { 55 | if ( 56 | request.header('Origin') !== null && 57 | request.header('Access-Control-Request-Method') !== null && 58 | request.header('Access-Control-Request-Headers') !== null 59 | ) { 60 | // Handle CORS pre-flight request. 61 | response.set(corsHeaders) 62 | } else { 63 | // Handle standard OPTIONS request. 64 | response.append('Allow', 'GET, HEAD, POST, PUT, OPTIONS') 65 | } 66 | } 67 | 68 | app.all('*', function (request, response) { 69 | async function fetchAndApply(request) { 70 | if (request.method === 'OPTIONS') { 71 | return handleOptions(request) 72 | } 73 | let url = request.url 74 | let res, body, contentType 75 | console.log('fetch url: ' + `https://www.notion.so${url}`) 76 | if (url.startsWith('/image')) { 77 | response.redirect(301, `https://www.notion.so${url}`) 78 | } else if (url.startsWith('/front')) { 79 | response.redirect(301, `https://www.notion.so${url}`) 80 | } else if (url.endsWith('js')) { 81 | response.type('application/x-javascript') 82 | res = await fetch(`https://www.notion.so${url}`) 83 | body = await res.text() 84 | try { 85 | body = body 86 | .replace(/www.notion.so/g, MY_DOMAIN) 87 | .replace(/notion.so/g, MY_DOMAIN) 88 | console.log('get rewrite app.js') 89 | } catch (err) { 90 | console.log(err) 91 | } 92 | } else if (url.endsWith('css')) { 93 | response.type('text/css') 94 | res = await fetch(`https://www.notion.so${url}`) 95 | body = await res.text() 96 | } else if (url.startsWith('/api')) { 97 | response.type('application/json;charset=UTF-8') 98 | response.append('Access-Control-Allow-Origin', '*') 99 | console.log('api method: ' + request.method) 100 | res = await fetch(`https://www.notion.so${url}`, { 101 | body: JSON.stringify(request.body), 102 | headers: { 103 | 'Content-Type': 'application/json;charset=UTF-8', 104 | 'User-Agent': 105 | 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36' 106 | }, 107 | method: request.method // *GET, POST, PUT, DELETE, etc. 108 | }) 109 | body = await res.text() 110 | } else if (url === `/`) { 111 | let pageUrlList = START_PAGE.split('/') 112 | let redrictUrl = `https://${MY_DOMAIN}/${ 113 | pageUrlList[pageUrlList.length - 1] 114 | }` 115 | response.redirect(302, redrictUrl) 116 | } else { 117 | res = await fetch(`https://www.notion.so${url}`, { 118 | method: request.method // *GET, POST, PUT, DELETE, etc. 119 | }) 120 | body = await res.text() 121 | contentType = await res.headers.get('content-type') 122 | try { 123 | response.type(contentType) 124 | if (contentType.startsWith('text/html')) { 125 | body = body.replace(/<\/head>/g, INJECT_INTO_HEAD + '') 126 | body = body.replace(/<\/body>/g, INJECT_INTO_FOOT + '') 127 | } 128 | } catch (err) { 129 | console.log(err) 130 | } 131 | } 132 | return body 133 | } 134 | 135 | fetchAndApply(request).then(body => { 136 | response.send(body) 137 | }) 138 | }) 139 | 140 | // listen for requests :) 141 | const listener = app.listen(process.env.PORT, () => { 142 | console.log('Your app is listening on port ' + listener.address().port) 143 | }) 144 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | accepts@~1.3.7: 6 | version "1.3.7" 7 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 8 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 9 | dependencies: 10 | mime-types "~2.1.24" 11 | negotiator "0.6.2" 12 | 13 | array-flatten@1.1.1: 14 | version "1.1.1" 15 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 16 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 17 | 18 | body-parser@1.19.0: 19 | version "1.19.0" 20 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 21 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 22 | dependencies: 23 | bytes "3.1.0" 24 | content-type "~1.0.4" 25 | debug "2.6.9" 26 | depd "~1.1.2" 27 | http-errors "1.7.2" 28 | iconv-lite "0.4.24" 29 | on-finished "~2.3.0" 30 | qs "6.7.0" 31 | raw-body "2.4.0" 32 | type-is "~1.6.17" 33 | 34 | bytes@3.1.0: 35 | version "3.1.0" 36 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 37 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 38 | 39 | content-disposition@0.5.3: 40 | version "0.5.3" 41 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 42 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 43 | dependencies: 44 | safe-buffer "5.1.2" 45 | 46 | content-type@~1.0.4: 47 | version "1.0.4" 48 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 49 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 50 | 51 | cookie-signature@1.0.6: 52 | version "1.0.6" 53 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 54 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 55 | 56 | cookie@0.4.0: 57 | version "0.4.0" 58 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 59 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 60 | 61 | debug@2.6.9: 62 | version "2.6.9" 63 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 64 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 65 | dependencies: 66 | ms "2.0.0" 67 | 68 | depd@~1.1.2: 69 | version "1.1.2" 70 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 71 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 72 | 73 | destroy@~1.0.4: 74 | version "1.0.4" 75 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 76 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 77 | 78 | ee-first@1.1.1: 79 | version "1.1.1" 80 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 81 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 82 | 83 | encodeurl@~1.0.2: 84 | version "1.0.2" 85 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 86 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 87 | 88 | escape-html@~1.0.3: 89 | version "1.0.3" 90 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 91 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 92 | 93 | etag@~1.8.1: 94 | version "1.8.1" 95 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 96 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 97 | 98 | express@^4.17.1: 99 | version "4.17.1" 100 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 101 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 102 | dependencies: 103 | accepts "~1.3.7" 104 | array-flatten "1.1.1" 105 | body-parser "1.19.0" 106 | content-disposition "0.5.3" 107 | content-type "~1.0.4" 108 | cookie "0.4.0" 109 | cookie-signature "1.0.6" 110 | debug "2.6.9" 111 | depd "~1.1.2" 112 | encodeurl "~1.0.2" 113 | escape-html "~1.0.3" 114 | etag "~1.8.1" 115 | finalhandler "~1.1.2" 116 | fresh "0.5.2" 117 | merge-descriptors "1.0.1" 118 | methods "~1.1.2" 119 | on-finished "~2.3.0" 120 | parseurl "~1.3.3" 121 | path-to-regexp "0.1.7" 122 | proxy-addr "~2.0.5" 123 | qs "6.7.0" 124 | range-parser "~1.2.1" 125 | safe-buffer "5.1.2" 126 | send "0.17.1" 127 | serve-static "1.14.1" 128 | setprototypeof "1.1.1" 129 | statuses "~1.5.0" 130 | type-is "~1.6.18" 131 | utils-merge "1.0.1" 132 | vary "~1.1.2" 133 | 134 | finalhandler@~1.1.2: 135 | version "1.1.2" 136 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 137 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 138 | dependencies: 139 | debug "2.6.9" 140 | encodeurl "~1.0.2" 141 | escape-html "~1.0.3" 142 | on-finished "~2.3.0" 143 | parseurl "~1.3.3" 144 | statuses "~1.5.0" 145 | unpipe "~1.0.0" 146 | 147 | forwarded@~0.1.2: 148 | version "0.1.2" 149 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 150 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 151 | 152 | fresh@0.5.2: 153 | version "0.5.2" 154 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 155 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 156 | 157 | http-errors@1.7.2: 158 | version "1.7.2" 159 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 160 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 161 | dependencies: 162 | depd "~1.1.2" 163 | inherits "2.0.3" 164 | setprototypeof "1.1.1" 165 | statuses ">= 1.5.0 < 2" 166 | toidentifier "1.0.0" 167 | 168 | http-errors@~1.7.2: 169 | version "1.7.3" 170 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 171 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 172 | dependencies: 173 | depd "~1.1.2" 174 | inherits "2.0.4" 175 | setprototypeof "1.1.1" 176 | statuses ">= 1.5.0 < 2" 177 | toidentifier "1.0.0" 178 | 179 | iconv-lite@0.4.24: 180 | version "0.4.24" 181 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 182 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 183 | dependencies: 184 | safer-buffer ">= 2.1.2 < 3" 185 | 186 | inherits@2.0.3: 187 | version "2.0.3" 188 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 189 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 190 | 191 | inherits@2.0.4: 192 | version "2.0.4" 193 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 194 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 195 | 196 | ipaddr.js@1.9.1: 197 | version "1.9.1" 198 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 199 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 200 | 201 | media-typer@0.3.0: 202 | version "0.3.0" 203 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 204 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 205 | 206 | merge-descriptors@1.0.1: 207 | version "1.0.1" 208 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 209 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 210 | 211 | methods@~1.1.2: 212 | version "1.1.2" 213 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 214 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 215 | 216 | mime-db@1.44.0: 217 | version "1.44.0" 218 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" 219 | integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== 220 | 221 | mime-types@~2.1.24: 222 | version "2.1.27" 223 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" 224 | integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== 225 | dependencies: 226 | mime-db "1.44.0" 227 | 228 | mime@1.6.0: 229 | version "1.6.0" 230 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 231 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 232 | 233 | ms@2.0.0: 234 | version "2.0.0" 235 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 236 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 237 | 238 | ms@2.1.1: 239 | version "2.1.1" 240 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 241 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 242 | 243 | negotiator@0.6.2: 244 | version "0.6.2" 245 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 246 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 247 | 248 | node-fetch@^2.6.1: 249 | version "2.6.1" 250 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" 251 | integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== 252 | 253 | on-finished@~2.3.0: 254 | version "2.3.0" 255 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 256 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 257 | dependencies: 258 | ee-first "1.1.1" 259 | 260 | parseurl@~1.3.3: 261 | version "1.3.3" 262 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 263 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 264 | 265 | path-to-regexp@0.1.7: 266 | version "0.1.7" 267 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 268 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 269 | 270 | proxy-addr@~2.0.5: 271 | version "2.0.6" 272 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" 273 | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== 274 | dependencies: 275 | forwarded "~0.1.2" 276 | ipaddr.js "1.9.1" 277 | 278 | qs@6.7.0: 279 | version "6.7.0" 280 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 281 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 282 | 283 | range-parser@~1.2.1: 284 | version "1.2.1" 285 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 286 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 287 | 288 | raw-body@2.4.0: 289 | version "2.4.0" 290 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 291 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 292 | dependencies: 293 | bytes "3.1.0" 294 | http-errors "1.7.2" 295 | iconv-lite "0.4.24" 296 | unpipe "1.0.0" 297 | 298 | safe-buffer@5.1.2: 299 | version "5.1.2" 300 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 301 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 302 | 303 | "safer-buffer@>= 2.1.2 < 3": 304 | version "2.1.2" 305 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 306 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 307 | 308 | send@0.17.1: 309 | version "0.17.1" 310 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 311 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 312 | dependencies: 313 | debug "2.6.9" 314 | depd "~1.1.2" 315 | destroy "~1.0.4" 316 | encodeurl "~1.0.2" 317 | escape-html "~1.0.3" 318 | etag "~1.8.1" 319 | fresh "0.5.2" 320 | http-errors "~1.7.2" 321 | mime "1.6.0" 322 | ms "2.1.1" 323 | on-finished "~2.3.0" 324 | range-parser "~1.2.1" 325 | statuses "~1.5.0" 326 | 327 | serve-static@1.14.1: 328 | version "1.14.1" 329 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 330 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 331 | dependencies: 332 | encodeurl "~1.0.2" 333 | escape-html "~1.0.3" 334 | parseurl "~1.3.3" 335 | send "0.17.1" 336 | 337 | setprototypeof@1.1.1: 338 | version "1.1.1" 339 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 340 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 341 | 342 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 343 | version "1.5.0" 344 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 345 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 346 | 347 | toidentifier@1.0.0: 348 | version "1.0.0" 349 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 350 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 351 | 352 | type-is@~1.6.17, type-is@~1.6.18: 353 | version "1.6.18" 354 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 355 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 356 | dependencies: 357 | media-typer "0.3.0" 358 | mime-types "~2.1.24" 359 | 360 | unpipe@1.0.0, unpipe@~1.0.0: 361 | version "1.0.0" 362 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 363 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 364 | 365 | utils-merge@1.0.1: 366 | version "1.0.1" 367 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 368 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 369 | 370 | vary@~1.1.2: 371 | version "1.1.2" 372 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 373 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 374 | --------------------------------------------------------------------------------