some file cleanup, add api/og function

This commit is contained in:
Max Leiter 2023-01-23 21:05:17 -08:00
parent acfcc04af4
commit be73154b4e
8 changed files with 326 additions and 220 deletions

View file

@ -14,20 +14,21 @@
},
"dependencies": {
"@next-auth/prisma-adapter": "^1.0.5",
"@next/eslint-plugin-next": "13.1.2",
"@next/font": "13.1.2",
"@next/eslint-plugin-next": "13.1.5",
"@next/font": "13.1.5",
"@prisma/client": "^4.8.0",
"@radix-ui/react-dialog": "^1.0.2",
"@radix-ui/react-dropdown-menu": "^2.0.1",
"@radix-ui/react-popover": "^1.0.2",
"@radix-ui/react-tabs": "^1.0.1",
"@radix-ui/react-tooltip": "^1.0.2",
"@vercel/og": "^0.0.27",
"@wcj/markdown-to-html": "^2.1.2",
"client-only": "^0.0.1",
"client-zip": "2.2.1",
"jest": "^29.3.1",
"lodash.debounce": "^4.0.8",
"next": "13.1.2",
"next": "13.1.5",
"next-auth": "^4.18.6",
"next-themes": "^0.2.1",
"react": "18.2.0",

View file

@ -3,8 +3,8 @@ lockfileVersion: 5.4
specifiers:
'@next-auth/prisma-adapter': ^1.0.5
'@next/bundle-analyzer': 13.0.7-canary.4
'@next/eslint-plugin-next': 13.1.2
'@next/font': 13.1.2
'@next/eslint-plugin-next': 13.1.5
'@next/font': 13.1.5
'@prisma/client': ^4.8.0
'@radix-ui/react-dialog': ^1.0.2
'@radix-ui/react-dropdown-menu': ^2.0.1
@ -20,6 +20,7 @@ specifiers:
'@types/uuid': ^9.0.0
'@typescript-eslint/eslint-plugin': ^5.46.1
'@typescript-eslint/parser': ^5.46.1
'@vercel/og': ^0.0.27
'@wcj/markdown-to-html': ^2.1.2
client-only: ^0.0.1
client-zip: 2.2.1
@ -30,7 +31,7 @@ specifiers:
eslint-config-next: 13.0.3
jest: ^29.3.1
lodash.debounce: ^4.0.8
next: 13.1.2
next: 13.1.5
next-auth: ^4.18.6
next-themes: ^0.2.1
next-unused: 0.0.6
@ -53,22 +54,23 @@ specifiers:
dependencies:
'@next-auth/prisma-adapter': 1.0.5_fmf72d7n4jt7coiyftaa4dlrhe
'@next/eslint-plugin-next': 13.1.2
'@next/font': 13.1.2
'@next/eslint-plugin-next': 13.1.5
'@next/font': 13.1.5
'@prisma/client': 4.8.0_prisma@4.8.0
'@radix-ui/react-dialog': 1.0.2_jbvntnid6ohjelon6ccj5dhg2u
'@radix-ui/react-dropdown-menu': 2.0.1_jbvntnid6ohjelon6ccj5dhg2u
'@radix-ui/react-popover': 1.0.2_jbvntnid6ohjelon6ccj5dhg2u
'@radix-ui/react-tabs': 1.0.1_biqbaboplfbrettd7655fr4n2y
'@radix-ui/react-tooltip': 1.0.2_jbvntnid6ohjelon6ccj5dhg2u
'@vercel/og': 0.0.27
'@wcj/markdown-to-html': 2.1.2
client-only: 0.0.1
client-zip: 2.2.1
jest: 29.3.1_@types+node@17.0.23
lodash.debounce: 4.0.8
next: 13.1.2_biqbaboplfbrettd7655fr4n2y
next-auth: 4.18.6_7jnwqgtpcnwg4nzft4b6xlzlfi
next-themes: 0.2.1_7jnwqgtpcnwg4nzft4b6xlzlfi
next: 13.1.5_biqbaboplfbrettd7655fr4n2y
next-auth: 4.18.6_s6zlkfvllybxhmcq5pkr2zsuza
next-themes: 0.2.1_s6zlkfvllybxhmcq5pkr2zsuza
react: 18.2.0
react-datepicker: 4.8.0_biqbaboplfbrettd7655fr4n2y
react-dom: 18.2.0_react@18.2.0
@ -792,7 +794,7 @@ packages:
next-auth: ^4
dependencies:
'@prisma/client': 4.8.0_prisma@4.8.0
next-auth: 4.18.6_7jnwqgtpcnwg4nzft4b6xlzlfi
next-auth: 4.18.6_s6zlkfvllybxhmcq5pkr2zsuza
dev: false
/@next/bundle-analyzer/13.0.7-canary.4:
@ -804,8 +806,8 @@ packages:
- utf-8-validate
dev: true
/@next/env/13.1.2:
resolution: {integrity: sha512-PpT4UZIX66VMTqXt4HKEJ+/PwbS+tWmmhZlazaws1a+dbUA5pPdjntQ46Jvj616i3ZKN9doS9LHx3y50RLjAWg==}
/@next/env/13.1.5:
resolution: {integrity: sha512-0Ry4NhJy6qLbXhvxPRUQ1H6RzgtryGdUto7hfgAK0Iw/bScgeVjwLZdfhm2iT7qsOS32apo9cWzLCxjc6iGPsA==}
dev: false
/@next/eslint-plugin-next/13.0.3:
@ -814,18 +816,18 @@ packages:
glob: 7.1.7
dev: true
/@next/eslint-plugin-next/13.1.2:
resolution: {integrity: sha512-WGaNVvIYphdriesP6r7jq/8l7u38tzotnVQuxc1RYKLqYYApSsrebti3OCPoT3Gx0pw2smPIFHH98RzcsgW5GQ==}
/@next/eslint-plugin-next/13.1.5:
resolution: {integrity: sha512-3kvLTX35bOWOCKU8KY74Ygczc55Qk/kB2TQy0tH7Rti6hzZ6Aij7WQ8zHdIVjmnlD0n/zXWXrIf5y56RKcLQkQ==}
dependencies:
glob: 7.1.7
dev: false
/@next/font/13.1.2:
resolution: {integrity: sha512-NXGXGFGiOKEnvBIHq9cdFTKbHO2/4B3Zd9K27M7j1DioIQVar7oVRqZMYs0h3XMVEZLwjjkdAtqRPCzzd3RtXg==}
/@next/font/13.1.5:
resolution: {integrity: sha512-6M5R6yC3JkdJiqo/YJxDp6+0vDn0smXOAzl8uHt4qmDS2u53ji/19K0HM51d+5kg8xntDi+N2hw7YjaU9inkNA==}
dev: false
/@next/swc-android-arm-eabi/13.1.2:
resolution: {integrity: sha512-7mRz1owoGsbfIcdOJA3kk7KEwPZ+OvVT1z9DkR/yru4QdVLF69h/1SHy0vlUNQMxDRllabhxCfkoZCB34GOGAg==}
/@next/swc-android-arm-eabi/13.1.5:
resolution: {integrity: sha512-QAEf3YM9U0qWVQTxgF3Tsh4OeCN1i9Smsf6cVlwZsPzoLyj2nQ879joCoN+ONqDknkBgG6OG/ajefywL3jw9Cg==}
engines: {node: '>= 10'}
cpu: [arm]
os: [android]
@ -833,8 +835,8 @@ packages:
dev: false
optional: true
/@next/swc-android-arm64/13.1.2:
resolution: {integrity: sha512-mgjZ2eJSayovQm1LcE54BLSI4jjnnnLtq5GY5g+DdPuUiCT644gKtjZ/w2BQvuIecCqqBO+Ph9yzo/wUTq7NLg==}
/@next/swc-android-arm64/13.1.5:
resolution: {integrity: sha512-ZmtGPTghRuT5YKL0nNcC2bBVSiG1O0is16eIZ2rWSP/hRW64ZCcAew6pxw2rihntNp22UfequjSTHd91WE/tyQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [android]
@ -842,8 +844,8 @@ packages:
dev: false
optional: true
/@next/swc-darwin-arm64/13.1.2:
resolution: {integrity: sha512-RikoQqy109r2222UJlyGs4dZw2BibkfPqpeFdW5JEGv+L2PStlHID8DwyVYbmHfQ0VIBGvbf/NAUtFakAWlhwg==}
/@next/swc-darwin-arm64/13.1.5:
resolution: {integrity: sha512-aeFXK+M/zmG/CNdMJ0tGNs0MWcLueUe7vZ2V6fa+2yz/ZgYJLI7fEfFvVh1p1yBMzupSbZDowvMuCSFTaeg3MA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
@ -851,8 +853,8 @@ packages:
dev: false
optional: true
/@next/swc-darwin-x64/13.1.2:
resolution: {integrity: sha512-JbDZjaTvL8gyPC5TAH6OnD4jmXPkyUxRYPvu08ZmhT/XAFBb/Cso0BdXyDax/BPCG70mimP9d3hXNKNq+A0VtQ==}
/@next/swc-darwin-x64/13.1.5:
resolution: {integrity: sha512-6mPX0GNRg8NzjV70at8I8pD9YBnPHDpxJCoMuIqysdTjtQhd09Xk6GUhquNhp1kEJzzVk7OW5l2ch4XIJjtY3A==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
@ -860,8 +862,8 @@ packages:
dev: false
optional: true
/@next/swc-freebsd-x64/13.1.2:
resolution: {integrity: sha512-ax4j8VrdFQ/xc3W7Om0u1vnDxVApQHKsChBbAMynCrnycZmpbqK4MZu4ZkycT+mx2eccCiqZROpbzDbEdPosEw==}
/@next/swc-freebsd-x64/13.1.5:
resolution: {integrity: sha512-nR4a/SNblG0w8hhYRflTZjk4yD99ld18w/FCftw99ziw8sgciBlOXRICJIiRIaMRU8UH7QLSgBOQVnfNcVNKMA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [freebsd]
@ -869,8 +871,8 @@ packages:
dev: false
optional: true
/@next/swc-linux-arm-gnueabihf/13.1.2:
resolution: {integrity: sha512-NcRHTesnCxnUvSJa637PQJffBBkmqi5XS/xVWGY7dI6nyJ+pC96Oj7kd+mcjnFUQI5lHKbg39qBWKtOzbezc4w==}
/@next/swc-linux-arm-gnueabihf/13.1.5:
resolution: {integrity: sha512-EzkltCVKg3gUzamoeKPhGeSgXTTLAhSzc7v/+g1Y+HQa7JKMrlzdRkrJf+H4LJXcz7lnxgNKHGRyZBSXnmJKJw==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
@ -878,8 +880,8 @@ packages:
dev: false
optional: true
/@next/swc-linux-arm64-gnu/13.1.2:
resolution: {integrity: sha512-AxJdjocLtPrsBY4P2COSBIc3crT5bpjgGenNuINoensOlXhBkYM0aRDYZdydwXOhG+kN2ngUvfgitop9pa204w==}
/@next/swc-linux-arm64-gnu/13.1.5:
resolution: {integrity: sha512-E7HMkdoxStmTUJU4KzBUU4vZ5DHT4Gd327tC3KFZS5lda0NRerJAOCfsRg+fBj22FvCb1UWsX6XI+weL6xhyeQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
@ -887,8 +889,8 @@ packages:
dev: false
optional: true
/@next/swc-linux-arm64-musl/13.1.2:
resolution: {integrity: sha512-JmNimDkcCRq7P5zpkdqeaSZ69qKDntEPtyIaMNWqy5M0WUJxGim0Fs6Qzxayiyvuuh9Guxks4woQ/j/ZvX/c8Q==}
/@next/swc-linux-arm64-musl/13.1.5:
resolution: {integrity: sha512-qlO0Fd3GQwJS6YpbF9NyL5NGHVZ43dKtZDC/jP4vdeMIYDtSu13HcY/nmA1NdW+RpMwDxSCpx4WKsCCEZGIX8Q==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
@ -896,8 +898,8 @@ packages:
dev: false
optional: true
/@next/swc-linux-x64-gnu/13.1.2:
resolution: {integrity: sha512-TsLsjZwUlgmvI42neTuIoD6K9RlXCUzqPtvIClgXxVO0um0DiZwK+M+0zX/uVXhMVphfPY2c5YeR1zFSIONY4A==}
/@next/swc-linux-x64-gnu/13.1.5:
resolution: {integrity: sha512-GftSBFAay2nocGl+KNqFsj6EVSvomaM/bp86hzezbKsTwQmu76PjOCVcejI1gE+4k7f5zPDgCuorF6F04BV0HQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
@ -905,8 +907,8 @@ packages:
dev: false
optional: true
/@next/swc-linux-x64-musl/13.1.2:
resolution: {integrity: sha512-eSkyXgCXydEFPTkcncQOGepafedPte6JT/OofB9uvruucrrMVBagCASOuPxodWEMrlfEKSXVnExMKIlfmQMD7A==}
/@next/swc-linux-x64-musl/13.1.5:
resolution: {integrity: sha512-UD+3lxU4yuAjd+uBkCDfBpAcbGAVfEcE8mX/efIxUGIImmzN0QzgTHYEpKFnY3Lxu02dIBcwQRT3Q5mfO4obng==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
@ -914,8 +916,8 @@ packages:
dev: false
optional: true
/@next/swc-win32-arm64-msvc/13.1.2:
resolution: {integrity: sha512-DmXFaRTgt2KrV9dmRLifDJE+cYiutHVFIw5/C9BtnwXH39uf3YbPxeD98vNrtqqqZVVLXY/1ySaSIwzYnqeY9g==}
/@next/swc-win32-arm64-msvc/13.1.5:
resolution: {integrity: sha512-uzsvkQY+K3EbL+97IUHPWZPwjsCmCkdH/O5Cf9wCnh0k0gaj7ob1mGKqr1vNNak+9U7HloGwuHcXnZpijWSP7w==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
@ -923,8 +925,8 @@ packages:
dev: false
optional: true
/@next/swc-win32-ia32-msvc/13.1.2:
resolution: {integrity: sha512-3+nBkuFs/wT+lmRVQNH5SyDT7I4vUlNPntosEaEP63FuYQdPLaxz0GvcR66MdFSFh2fsvazpe4wciOwVS4FItQ==}
/@next/swc-win32-ia32-msvc/13.1.5:
resolution: {integrity: sha512-v0NaC1w8mPf620GlJaHBdEm3dm4G4AEQMasDqjzQvo0yCRrvtvzMgCIe8MocBxFHzaF6868NybMqvumxP5YxEg==}
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
@ -932,8 +934,8 @@ packages:
dev: false
optional: true
/@next/swc-win32-x64-msvc/13.1.2:
resolution: {integrity: sha512-avsyveEvcvH42PvKjR4Pb8JlLttuGURr2H3ZhS2b85pHOiZ7yjH3rMUoGnNzuLMApyxYaCvd4MedPrLhnNhkog==}
/@next/swc-win32-x64-msvc/13.1.5:
resolution: {integrity: sha512-IZHwvd649ccbWyLCfu92IXEpR250NpmBkaRelPV+WVm4jrd62FKRFCNdqdCXq6TrEg9wN8cK4YG8tm44uEZqLA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@ -1419,10 +1421,24 @@ packages:
'@babel/runtime': 7.20.1
dev: false
/@resvg/resvg-wasm/2.0.0-alpha.4:
resolution: {integrity: sha512-pWIG9a/x1ky8gXKRhPH1OPKpHFoMN1ISLbJ+O+gPXQHIAKhNd5I28RlWf7q576hAOQA9JZTlo3p/M2uyLzJmmw==}
engines: {node: '>= 10'}
dev: false
/@rushstack/eslint-patch/1.2.0:
resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==}
dev: true
/@shuding/opentype.js/1.4.0-beta.0:
resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==}
engines: {node: '>= 8.0.0'}
hasBin: true
dependencies:
fflate: 0.7.4
string.prototype.codepointat: 0.2.1
dev: false
/@sinclair/typebox/0.24.51:
resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==}
dev: false
@ -1781,6 +1797,15 @@ packages:
eslint-visitor-keys: 3.3.0
dev: true
/@vercel/og/0.0.27:
resolution: {integrity: sha512-cUk6HmfLmBOISAA8gvPRNUx3eVOSyXblxiuv3uN9UTxLwdalQzPlHC/0byvTMR1eVi0y1trD5u6um/4xiTqgOQ==}
engines: {node: '>=16'}
dependencies:
'@resvg/resvg-wasm': 2.0.0-alpha.4
satori: 0.0.46
yoga-wasm-web: 0.3.0
dev: false
/@wcj/markdown-to-html/2.1.2:
resolution: {integrity: sha512-HJCbXY9YsFV12JPbYM6iXadOJWLhS1sjAp4L4nXoVxdgD9ArkU3I9QlpH4VTcDHutDLOKVXelarWhs5qqqIm7w==}
dependencies:
@ -2149,6 +2174,10 @@ packages:
engines: {node: '>=10'}
dev: false
/camelize/1.0.1:
resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==}
dev: false
/caniuse-lite/1.0.30001431:
resolution: {integrity: sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==}
dev: false
@ -2382,6 +2411,19 @@ packages:
shebang-command: 2.0.0
which: 2.0.2
/css-background-parser/0.1.0:
resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==}
dev: false
/css-box-shadow/1.0.0-3:
resolution: {integrity: sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==}
dev: false
/css-color-keywords/1.0.0:
resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==}
engines: {node: '>=4'}
dev: false
/css-parse/2.0.0:
resolution: {integrity: sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==}
dependencies:
@ -2399,6 +2441,14 @@ packages:
fastparse: 1.1.2
dev: true
/css-to-react-native/3.1.0:
resolution: {integrity: sha512-AryfkFA29b4I3vG7N4kxFboq15DxwSXzhXM37XNEjwJMgjYIc8BcqfiprpAqX0zadI5PMByEIwAMzXxk5Vcc4g==}
dependencies:
camelize: 1.0.1
css-color-keywords: 1.0.0
postcss-value-parser: 4.2.0
dev: false
/css/2.2.4:
resolution: {integrity: sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==}
dependencies:
@ -2700,6 +2750,10 @@ packages:
engines: {node: '>=12'}
dev: false
/emoji-regex/10.2.1:
resolution: {integrity: sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==}
dev: false
/emoji-regex/8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
dev: false
@ -3210,6 +3264,10 @@ packages:
bser: 2.1.1
dev: false
/fflate/0.7.4:
resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==}
dev: false
/file-entry-cache/6.0.1:
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
engines: {node: ^10.12.0 || >=12.0.0}
@ -5204,7 +5262,7 @@ packages:
dev: true
optional: true
/next-auth/4.18.6_7jnwqgtpcnwg4nzft4b6xlzlfi:
/next-auth/4.18.6_s6zlkfvllybxhmcq5pkr2zsuza:
resolution: {integrity: sha512-0TQwbq5X9Jyd1wUVYUoyvHJh4JWXeW9UOcMEl245Er/Y5vsSbyGJHt8M7xjRMzk9mORVMYehoMdERgyiq/jCgA==}
engines: {node: ^12.19.0 || ^14.15.0 || ^16.13.0 || ^18.12.0}
peerDependencies:
@ -5220,7 +5278,7 @@ packages:
'@panva/hkdf': 1.0.2
cookie: 0.5.0
jose: 4.11.0
next: 13.1.2_biqbaboplfbrettd7655fr4n2y
next: 13.1.5_biqbaboplfbrettd7655fr4n2y
oauth: 0.9.15
openid-client: 5.3.0
preact: 10.11.2
@ -5230,14 +5288,14 @@ packages:
uuid: 8.3.2
dev: false
/next-themes/0.2.1_7jnwqgtpcnwg4nzft4b6xlzlfi:
/next-themes/0.2.1_s6zlkfvllybxhmcq5pkr2zsuza:
resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==}
peerDependencies:
next: '*'
react: '*'
react-dom: '*'
dependencies:
next: 13.1.2_biqbaboplfbrettd7655fr4n2y
next: 13.1.5_biqbaboplfbrettd7655fr4n2y
react: 18.2.0
react-dom: 18.2.0_react@18.2.0
dev: false
@ -5253,8 +5311,8 @@ packages:
- supports-color
dev: true
/next/13.1.2_biqbaboplfbrettd7655fr4n2y:
resolution: {integrity: sha512-Rdnnb2YH///w78FEOR/IQ6TXga+qpth4OqFSem48ng1PYYKr6XBsIk1XVaRcIGM3o6iiHnun0nJvkJHDf+ICyQ==}
/next/13.1.5_biqbaboplfbrettd7655fr4n2y:
resolution: {integrity: sha512-rmpYZFCxxWAi2nJCT9sSqMLGC3cu+Pf689hx9clcyP0KbVIhh/7Dus5QcKrVd/PrAd6AjsuogSRR1mCP7BoYRw==}
engines: {node: '>=14.6.0'}
hasBin: true
peerDependencies:
@ -5271,7 +5329,7 @@ packages:
sass:
optional: true
dependencies:
'@next/env': 13.1.2
'@next/env': 13.1.5
'@swc/helpers': 0.4.14
caniuse-lite: 1.0.30001431
postcss: 8.4.14
@ -5279,19 +5337,19 @@ packages:
react-dom: 18.2.0_react@18.2.0
styled-jsx: 5.1.1_react@18.2.0
optionalDependencies:
'@next/swc-android-arm-eabi': 13.1.2
'@next/swc-android-arm64': 13.1.2
'@next/swc-darwin-arm64': 13.1.2
'@next/swc-darwin-x64': 13.1.2
'@next/swc-freebsd-x64': 13.1.2
'@next/swc-linux-arm-gnueabihf': 13.1.2
'@next/swc-linux-arm64-gnu': 13.1.2
'@next/swc-linux-arm64-musl': 13.1.2
'@next/swc-linux-x64-gnu': 13.1.2
'@next/swc-linux-x64-musl': 13.1.2
'@next/swc-win32-arm64-msvc': 13.1.2
'@next/swc-win32-ia32-msvc': 13.1.2
'@next/swc-win32-x64-msvc': 13.1.2
'@next/swc-android-arm-eabi': 13.1.5
'@next/swc-android-arm64': 13.1.5
'@next/swc-darwin-arm64': 13.1.5
'@next/swc-darwin-x64': 13.1.5
'@next/swc-freebsd-x64': 13.1.5
'@next/swc-linux-arm-gnueabihf': 13.1.5
'@next/swc-linux-arm64-gnu': 13.1.5
'@next/swc-linux-arm64-musl': 13.1.5
'@next/swc-linux-x64-gnu': 13.1.5
'@next/swc-linux-x64-musl': 13.1.5
'@next/swc-win32-arm64-msvc': 13.1.5
'@next/swc-win32-ia32-msvc': 13.1.5
'@next/swc-win32-x64-msvc': 13.1.5
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
@ -5656,6 +5714,10 @@ packages:
resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==}
dev: true
/postcss-value-parser/4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
dev: false
/postcss-values-parser/2.0.1:
resolution: {integrity: sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==}
engines: {node: '>=6.14.4'}
@ -6325,6 +6387,19 @@ packages:
source-map-js: 1.0.2
dev: true
/satori/0.0.46:
resolution: {integrity: sha512-7RfTz38MB0n8tzmRHtUh1y0K7609CLBHpYuyZuh9rpf9FyhOd2in+6EHuqu6ul/Jebn1qD1HdYKtAMjb7uiNAQ==}
engines: {node: '>=16'}
dependencies:
'@shuding/opentype.js': 1.4.0-beta.0
css-background-parser: 0.1.0
css-box-shadow: 1.0.0-3
css-to-react-native: 3.1.0
emoji-regex: 10.2.1
postcss-value-parser: 4.2.0
yoga-wasm-web: 0.3.0
dev: false
/sax/1.2.4:
resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
dev: true
@ -6498,6 +6573,10 @@ packages:
strip-ansi: 6.0.1
dev: false
/string.prototype.codepointat/0.2.1:
resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==}
dev: false
/string.prototype.matchall/4.0.8:
resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==}
dependencies:
@ -7261,6 +7340,10 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
/yoga-wasm-web/0.3.0:
resolution: {integrity: sha512-rD3L4jyMlO1m+RWU60lNwZQK5zmzglCV5fI1gTRikmpv3YzmNIZQbjyfE6cMNb9Xaly/C1SwemYGbsiOekMvnQ==}
dev: false
/zwitch/2.0.2:
resolution: {integrity: sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==}
dev: false

View file

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="72" height="72" version="1.1" viewBox="0 0 19.05 19.05" xmlns="http://www.w3.org/2000/svg">
<defs>
<clipPath id="clipPath7860">
<circle cx="115.27" cy="135.33" r="9.1406" />
</clipPath>
<clipPath id="clipPath7864">
<circle cx="115.27" cy="135.33" r="9.1406" />
</clipPath>
</defs>
<g transform="translate(-106.13 -126.19)">
<rect transform="matrix(1.0421 0 0 1.0421 -4.4639 -5.3074)" x="106.13" y="126.19" width="18.281" height="18.281" clip-path="url(#clipPath7864)" fill="#1b1b1b" />
<g transform="matrix(1.0421 0 0 1.0421 -4.4639 -5.3074)" clip-path="url(#clipPath7860)" stroke-width=".95964">
<path d="m132.15 142c-10.707-9.0354-17.374-8.908-17.374-8.908s2.3881 3.4829 0.94799 7.4545c-1.4401 3.9716-7.6664 7.7467-7.6664 7.7467z" fill="#fff" />
<path d="m108.89 148.35s6.2294-3.8135 7.6695-7.7851c1.4401-3.9716-1.7851-7.4745-1.7851-7.4745s1.2204 3.091-1.0184 6.7752c-2.239 3.6841-8.9226 4.9787-8.9226 4.9787z" fill="#e7e7e7" />
<path d="m105.93 146.03s6.6058-2.1876 8.8448-5.8717c2.2387-3.6841-5e-3 -7.0674-5e-3 -7.0674s-1.3628 3.2487-4.9368 5.2561-10.125 2.2728-10.125 2.2728z" fill="#c6c6c6" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -1,124 +1,19 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="72.000008"
height="72"
viewBox="0 0 19.05 19.05"
version="1.1"
id="svg5"
inkscape:export-filename="/home/reese/git/github.com/maxleiter/drift/logo.png"
inkscape:export-xdpi="682.66669"
inkscape:export-ydpi="682.66669"
inkscape:version="1.1.2 (1:1.1+202202050950+0a00cf5339)"
sodipodi:docname="logo.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:document-units="px"
showgrid="false"
showguides="false"
inkscape:zoom="13.877295"
inkscape:cx="10.448722"
inkscape:cy="34.444753"
inkscape:current-layer="g3632"
units="px"
viewbox-width="19.05" />
<defs
id="defs2">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath7860">
<circle
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.93688;stroke-linecap:round"
id="circle7862"
cx="115.27311"
cy="135.3275"
r="9.1405506" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath7864">
<circle
style="display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.93688;stroke-linecap:round"
id="circle7866"
cx="115.27311"
cy="135.3275"
r="9.1405506" />
</clipPath>
</defs>
<g
inkscape:label="source strokes"
inkscape:groupmode="layer"
id="layer1"
style="display:none"
transform="translate(-106.13256,-126.18696)">
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 114.7741,133.0871 c 0,0 2.24373,3.38322 0.005,7.06735 -2.23896,3.68413 -8.84476,5.87171 -8.84476,5.87171"
id="path1824"
sodipodi:nodetypes="csc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 99.71221,140.61603 c 0,0 6.55112,-0.26544 10.1251,-2.27285 3.57398,-2.00741 4.93679,-5.25608 4.93679,-5.25608"
id="path857"
sodipodi:nodetypes="czc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 114.7741,133.0871 c 0,0 3.22515,3.50294 1.78507,7.47454 -1.44009,3.97159 -7.66948,7.78507 -7.66948,7.78507"
id="path949"
sodipodi:nodetypes="czc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 114.7741,133.0871 c 0,0 6.66681,-0.12736 17.37373,8.90799"
id="path1345"
sodipodi:nodetypes="cc" />
</g>
<g
inkscape:label="Layer 1 copy"
inkscape:groupmode="layer"
id="g3632"
transform="translate(-106.13256,-126.18696)">
<rect
style="display:inline;fill:#1b1b1b;fill-opacity:1;stroke:none;stroke-width:2.81834;stroke-linecap:round"
id="rect6284"
width="18.28112"
height="18.28112"
x="106.13255"
y="126.18695"
clip-path="url(#clipPath7864)"
transform="matrix(1.0420598,0,0,1.0420598,-4.4639102,-5.3073932)" />
<g
id="g937"
inkscape:label="drift"
clip-path="url(#clipPath7860)"
mask="none"
style="display:inline;stroke-width:0.959638"
transform="matrix(1.0420598,0,0,1.0420598,-4.4639102,-5.3073932)">
<path
id="path935"
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.253904px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 132.14783,141.99509 c -10.70692,-9.03535 -17.37373,-8.90799 -17.37373,-8.90799 0,0 2.38807,3.48286 0.94799,7.45446 -1.44009,3.97159 -7.66636,7.74668 -7.66636,7.74668 z"
sodipodi:nodetypes="csccc" />
<path
id="path931"
style="fill:#e7e7e7;fill-opacity:1;stroke:none;stroke-width:0.253904px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 108.88969,148.34671 c 0,0 6.22939,-3.81348 7.66948,-7.78507 1.44008,-3.9716 -1.78507,-7.47454 -1.78507,-7.47454 0,0 1.22037,3.09102 -1.01836,6.77515 -2.23896,3.68413 -8.92258,4.9787 -8.92258,4.9787 z"
sodipodi:nodetypes="cscccc" />
<path
id="path933"
style="fill:#c6c6c6;fill-opacity:1;stroke:none;stroke-width:0.253904px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 105.93434,146.02616 c 0,0 6.6058,-2.18758 8.84476,-5.87171 2.23873,-3.68413 -0.005,-7.06735 -0.005,-7.06735 0,0 -1.36281,3.24867 -4.93679,5.25608 -3.57398,2.00741 -10.1251,2.27285 -10.1251,2.27285 z"
sodipodi:nodetypes="csccc" />
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8"?>
<svg width="72" height="72" version="1.1" viewBox="0 0 19.05 19.05" xmlns="http://www.w3.org/2000/svg">
<defs>
<clipPath id="clipPath7860">
<circle cx="115.27" cy="135.33" r="9.1406" />
</clipPath>
<clipPath id="clipPath7864">
<circle cx="115.27" cy="135.33" r="9.1406" />
</clipPath>
</defs>
<g transform="translate(-106.13 -126.19)">
<rect transform="matrix(1.0421 0 0 1.0421 -4.4639 -5.3074)" x="106.13" y="126.19" width="18.281" height="18.281" clip-path="url(#clipPath7864)" fill="#1b1b1b" />
<g transform="matrix(1.0421 0 0 1.0421 -4.4639 -5.3074)" clip-path="url(#clipPath7860)" stroke-width=".95964">
<path d="m132.15 142c-10.707-9.0354-17.374-8.908-17.374-8.908s2.3881 3.4829 0.94799 7.4545c-1.4401 3.9716-7.6664 7.7467-7.6664 7.7467z" fill="#fff" />
<path d="m108.89 148.35s6.2294-3.8135 7.6695-7.7851c1.4401-3.9716-1.7851-7.4745-1.7851-7.4745s1.2204 3.091-1.0184 6.7752c-2.239 3.6841-8.9226 4.9787-8.9226 4.9787z" fill="#e7e7e7" />
<path d="m105.93 146.03s6.6058-2.1876 8.8448-5.8717c2.2387-3.6841-5e-3 -7.0674-5e-3 -7.0674s-1.3628 3.2487-4.9368 5.2561-10.125 2.2728-10.125 2.2728z" fill="#c6c6c6" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -48,7 +48,7 @@ export default async function Page() {
style={{ display: "flex", flexDirection: "row", alignItems: "center" }}
>
<Image
src={"/assets/logo-optimized.svg"}
src={"/assets/logo.svg"}
width={48}
height={48}
alt=""

View file

@ -26,10 +26,20 @@ export const config = (env: Environment): Config => {
}
// TODO: improve `key` type
const throwIfUndefined = (key: keyof Environment): string => {
const throwIfUndefined = (
key: keyof Environment,
justWarn?: boolean
): string => {
const value = env[key]
if (value === undefined) {
throw new Error(`Missing environment variable: ${key}`)
if (justWarn) {
console.warn(
`${key} is missing, but is expected. \n This can occur when building when a database is not yet available.`
)
return ""
} else {
throw new Error(`Missing environment variable: ${key}`)
}
}
return value

View file

@ -1,10 +0,0 @@
import { withMethods } from "@lib/api-middleware/with-methods"
import { NextApiRequest, NextApiResponse } from "next"
const handler = async (_: NextApiRequest, res: NextApiResponse) => {
return res.json({
status: "UP"
})
}
export default withMethods(["GET"], handler)

146
src/pages/api/og.tsx Normal file
View file

@ -0,0 +1,146 @@
/* eslint-disable jsx-a11y/alt-text */
/* eslint-disable @next/next/no-img-element */
import { ImageResponse } from "@vercel/og"
import { NextRequest } from "next/server"
const WIDTH = 1200
const HEIGHT = 630
function Logo() {
// from public/assets/logo.svg
return (
<svg
width="72"
height="72"
version="1.1"
viewBox="0 0 19.05 19.05"
xmlns="http://www.w3.org/2000/svg"
>
<defs>
<clipPath id="clipPath7860">
<circle cx="115.27" cy="135.33" r="9.1406" />
</clipPath>
<clipPath id="clipPath7864">
<circle cx="115.27" cy="135.33" r="9.1406" />
</clipPath>
</defs>
<g transform="translate(-106.13 -126.19)">
<rect
transform="matrix(1.0421 0 0 1.0421 -4.4639 -5.3074)"
x="106.13"
y="126.19"
width="18.281"
height="18.281"
clip-path="url(#clipPath7864)"
fill="#1b1b1b"
/>
<g
transform="matrix(1.0421 0 0 1.0421 -4.4639 -5.3074)"
clip-path="url(#clipPath7860)"
stroke-width=".95964"
>
<path
d="m132.15 142c-10.707-9.0354-17.374-8.908-17.374-8.908s2.3881 3.4829 0.94799 7.4545c-1.4401 3.9716-7.6664 7.7467-7.6664 7.7467z"
fill="#fff"
/>
<path
d="m108.89 148.35s6.2294-3.8135 7.6695-7.7851c1.4401-3.9716-1.7851-7.4745-1.7851-7.4745s1.2204 3.091-1.0184 6.7752c-2.239 3.6841-8.9226 4.9787-8.9226 4.9787z"
fill="#e7e7e7"
/>
<path
d="m105.93 146.03s6.6058-2.1876 8.8448-5.8717c2.2387-3.6841-5e-3 -7.0674-5e-3 -7.0674s-1.3628 3.2487-4.9368 5.2561-10.125 2.2728-10.125 2.2728z"
fill="#c6c6c6"
/>
</g>
</g>
</svg>
)
}
export default async function handler(req: NextRequest) {
const url = new URL(req.url)
const title = url.searchParams.get("title") || "A Drift post"
const description = url.searchParams.get("description") || ""
const date = url.searchParams.get("date") || new Date().toISOString()
const numFiles = url.searchParams.get("numFiles") || "0"
// ...
return new ImageResponse(
(
<div
style={{
display: "flex",
backgroundColor: "#000",
color: "white",
height: "100%",
width: "100%",
flexDirection: "column",
justifyContent: "center",
alignItems: "center"
}}
>
<div
style={{
display: "flex",
width: 72,
height: 72,
position: "absolute",
top: 32,
left: 32
}}
>
<Logo />
</div>
<div
style={{
display: "flex",
position: "relative",
flexDirection: "row",
width: "100%"
}}
>
<div
style={{
display: "flex",
flex: 1,
paddingLeft: 32,
flexDirection: "column",
maxWidth: WIDTH - 325
}}
>
<h1
style={{
margin: 0,
fontWeight: 800,
fontSize: 48,
lineHeight: 1
}}
>
{" "}
{title}{" "}
</h1>
<p
style={{ margin: 0, fontSize: 32, color: "#888", marginTop: 24 }}
>
{" "}
{description}{" "}
</p>
<p
style={{ margin: 0, fontSize: 22, color: "#888", marginTop: 24 }}
>
{numFiles} files posted on {new Date(date).toLocaleDateString()}{" "}
at {new Date(date).toLocaleTimeString()}
</p>
</div>
</div>
</div>
),
{
width: WIDTH,
height: HEIGHT,
// debug: true
}
)
}
export const config = {
runtime: "edge"
}