Compare commits
13 Commits
d3404786b2
...
main
Author | SHA1 | Date | |
---|---|---|---|
f45b101556
|
|||
![]() |
464086b071
|
||
f717a6b610
|
|||
![]() |
648d5cde32
|
||
![]() |
288ec34fb4
|
||
![]() |
4e03757d69
|
||
![]() |
f92035ed8e
|
||
![]() |
0e2117e4c7
|
||
![]() |
ec6c0a9a13
|
||
![]() |
34bcdc3b05
|
||
![]() |
e98ab85034
|
||
![]() |
255fbb521f
|
||
![]() |
ac60bda3bd
|
@@ -9,6 +9,11 @@ const nextConfig = {
|
|||||||
destination: '/find',
|
destination: '/find',
|
||||||
permanent: true,
|
permanent: true,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
source: '/:langcode(\\w{2})/:slug*',
|
||||||
|
destination: '/:slug*',
|
||||||
|
permanent: true,
|
||||||
|
},
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
images: {
|
images: {
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "libremdb",
|
"name": "libremdb",
|
||||||
"version": "4.1.0",
|
"version": "4.2.0",
|
||||||
"description": "a free & open source IMDb front-end",
|
"description": "a free & open source IMDb front-end",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
301
pnpm-lock.yaml
generated
301
pnpm-lock.yaml
generated
@@ -19,7 +19,7 @@ importers:
|
|||||||
version: 5.3.2
|
version: 5.3.2
|
||||||
next:
|
next:
|
||||||
specifier: 12.2.5
|
specifier: 12.2.5
|
||||||
version: 12.2.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.89.2)
|
version: 12.2.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.62.1)
|
||||||
react:
|
react:
|
||||||
specifier: 18.2.0
|
specifier: 18.2.0
|
||||||
version: 18.2.0
|
version: 18.2.0
|
||||||
@@ -47,7 +47,7 @@ importers:
|
|||||||
version: 12.2.5(eslint@8.22.0)(typescript@4.7.4)
|
version: 12.2.5(eslint@8.22.0)(typescript@4.7.4)
|
||||||
sass:
|
sass:
|
||||||
specifier: ^1.62.1
|
specifier: ^1.62.1
|
||||||
version: 1.89.2
|
version: 1.62.1
|
||||||
typescript:
|
typescript:
|
||||||
specifier: 4.7.4
|
specifier: 4.7.4
|
||||||
version: 4.7.4
|
version: 4.7.4
|
||||||
@@ -68,14 +68,12 @@ packages:
|
|||||||
'@humanwhocodes/config-array@0.10.7':
|
'@humanwhocodes/config-array@0.10.7':
|
||||||
resolution: {integrity: sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==}
|
resolution: {integrity: sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==}
|
||||||
engines: {node: '>=10.10.0'}
|
engines: {node: '>=10.10.0'}
|
||||||
deprecated: Use @eslint/config-array instead
|
|
||||||
|
|
||||||
'@humanwhocodes/gitignore-to-minimatch@1.0.2':
|
'@humanwhocodes/gitignore-to-minimatch@1.0.2':
|
||||||
resolution: {integrity: sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==}
|
resolution: {integrity: sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==}
|
||||||
|
|
||||||
'@humanwhocodes/object-schema@1.2.1':
|
'@humanwhocodes/object-schema@1.2.1':
|
||||||
resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
|
resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
|
||||||
deprecated: Use @eslint/object-schema instead
|
|
||||||
|
|
||||||
'@img/sharp-darwin-arm64@0.33.1':
|
'@img/sharp-darwin-arm64@0.33.1':
|
||||||
resolution: {integrity: sha512-esr2BZ1x0bo+wl7Gx2hjssYhjrhUsD88VQulI0FrG8/otRQUOxLWHMBd1Y1qo2Gfg2KUvXNpT0ASnV9BzJCexw==}
|
resolution: {integrity: sha512-esr2BZ1x0bo+wl7Gx2hjssYhjrhUsD88VQulI0FrG8/otRQUOxLWHMBd1Y1qo2Gfg2KUvXNpT0ASnV9BzJCexw==}
|
||||||
@@ -289,88 +287,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
|
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
|
||||||
engines: {node: '>= 8'}
|
engines: {node: '>= 8'}
|
||||||
|
|
||||||
'@parcel/watcher-android-arm64@2.5.1':
|
|
||||||
resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==}
|
|
||||||
engines: {node: '>= 10.0.0'}
|
|
||||||
cpu: [arm64]
|
|
||||||
os: [android]
|
|
||||||
|
|
||||||
'@parcel/watcher-darwin-arm64@2.5.1':
|
|
||||||
resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==}
|
|
||||||
engines: {node: '>= 10.0.0'}
|
|
||||||
cpu: [arm64]
|
|
||||||
os: [darwin]
|
|
||||||
|
|
||||||
'@parcel/watcher-darwin-x64@2.5.1':
|
|
||||||
resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==}
|
|
||||||
engines: {node: '>= 10.0.0'}
|
|
||||||
cpu: [x64]
|
|
||||||
os: [darwin]
|
|
||||||
|
|
||||||
'@parcel/watcher-freebsd-x64@2.5.1':
|
|
||||||
resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==}
|
|
||||||
engines: {node: '>= 10.0.0'}
|
|
||||||
cpu: [x64]
|
|
||||||
os: [freebsd]
|
|
||||||
|
|
||||||
'@parcel/watcher-linux-arm-glibc@2.5.1':
|
|
||||||
resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==}
|
|
||||||
engines: {node: '>= 10.0.0'}
|
|
||||||
cpu: [arm]
|
|
||||||
os: [linux]
|
|
||||||
|
|
||||||
'@parcel/watcher-linux-arm-musl@2.5.1':
|
|
||||||
resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==}
|
|
||||||
engines: {node: '>= 10.0.0'}
|
|
||||||
cpu: [arm]
|
|
||||||
os: [linux]
|
|
||||||
|
|
||||||
'@parcel/watcher-linux-arm64-glibc@2.5.1':
|
|
||||||
resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==}
|
|
||||||
engines: {node: '>= 10.0.0'}
|
|
||||||
cpu: [arm64]
|
|
||||||
os: [linux]
|
|
||||||
|
|
||||||
'@parcel/watcher-linux-arm64-musl@2.5.1':
|
|
||||||
resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==}
|
|
||||||
engines: {node: '>= 10.0.0'}
|
|
||||||
cpu: [arm64]
|
|
||||||
os: [linux]
|
|
||||||
|
|
||||||
'@parcel/watcher-linux-x64-glibc@2.5.1':
|
|
||||||
resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==}
|
|
||||||
engines: {node: '>= 10.0.0'}
|
|
||||||
cpu: [x64]
|
|
||||||
os: [linux]
|
|
||||||
|
|
||||||
'@parcel/watcher-linux-x64-musl@2.5.1':
|
|
||||||
resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==}
|
|
||||||
engines: {node: '>= 10.0.0'}
|
|
||||||
cpu: [x64]
|
|
||||||
os: [linux]
|
|
||||||
|
|
||||||
'@parcel/watcher-win32-arm64@2.5.1':
|
|
||||||
resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==}
|
|
||||||
engines: {node: '>= 10.0.0'}
|
|
||||||
cpu: [arm64]
|
|
||||||
os: [win32]
|
|
||||||
|
|
||||||
'@parcel/watcher-win32-ia32@2.5.1':
|
|
||||||
resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==}
|
|
||||||
engines: {node: '>= 10.0.0'}
|
|
||||||
cpu: [ia32]
|
|
||||||
os: [win32]
|
|
||||||
|
|
||||||
'@parcel/watcher-win32-x64@2.5.1':
|
|
||||||
resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==}
|
|
||||||
engines: {node: '>= 10.0.0'}
|
|
||||||
cpu: [x64]
|
|
||||||
os: [win32]
|
|
||||||
|
|
||||||
'@parcel/watcher@2.5.1':
|
|
||||||
resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==}
|
|
||||||
engines: {node: '>= 10.0.0'}
|
|
||||||
|
|
||||||
'@rushstack/eslint-patch@1.2.0':
|
'@rushstack/eslint-patch@1.2.0':
|
||||||
resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==}
|
resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==}
|
||||||
|
|
||||||
@@ -447,6 +363,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
|
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
|
anymatch@3.1.3:
|
||||||
|
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
|
||||||
|
engines: {node: '>= 8'}
|
||||||
|
|
||||||
argparse@2.0.1:
|
argparse@2.0.1:
|
||||||
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
|
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
|
||||||
|
|
||||||
@@ -498,14 +418,18 @@ packages:
|
|||||||
balanced-match@1.0.2:
|
balanced-match@1.0.2:
|
||||||
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
||||||
|
|
||||||
|
binary-extensions@2.2.0:
|
||||||
|
resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
boolbase@1.0.0:
|
boolbase@1.0.0:
|
||||||
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
|
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
|
||||||
|
|
||||||
brace-expansion@1.1.11:
|
brace-expansion@1.1.11:
|
||||||
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
|
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
|
||||||
|
|
||||||
braces@3.0.3:
|
braces@3.0.2:
|
||||||
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
|
resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
call-bind@1.0.2:
|
call-bind@1.0.2:
|
||||||
@@ -529,9 +453,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==}
|
resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==}
|
||||||
engines: {node: '>= 6'}
|
engines: {node: '>= 6'}
|
||||||
|
|
||||||
chokidar@4.0.3:
|
chokidar@3.5.3:
|
||||||
resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
|
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
|
||||||
engines: {node: '>= 14.16.0'}
|
engines: {node: '>= 8.10.0'}
|
||||||
|
|
||||||
cluster-key-slot@1.1.2:
|
cluster-key-slot@1.1.2:
|
||||||
resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==}
|
resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==}
|
||||||
@@ -556,7 +480,7 @@ packages:
|
|||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
|
|
||||||
concat-map@0.0.1:
|
concat-map@0.0.1:
|
||||||
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
|
resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=}
|
||||||
|
|
||||||
cross-spawn@7.0.3:
|
cross-spawn@7.0.3:
|
||||||
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
|
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
|
||||||
@@ -610,11 +534,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
|
resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
|
||||||
engines: {node: '>=0.10'}
|
engines: {node: '>=0.10'}
|
||||||
|
|
||||||
detect-libc@1.0.3:
|
|
||||||
resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
|
|
||||||
engines: {node: '>=0.10'}
|
|
||||||
hasBin: true
|
|
||||||
|
|
||||||
detect-libc@2.0.2:
|
detect-libc@2.0.2:
|
||||||
resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==}
|
resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
@@ -762,7 +681,6 @@ packages:
|
|||||||
eslint@8.22.0:
|
eslint@8.22.0:
|
||||||
resolution: {integrity: sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==}
|
resolution: {integrity: sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==}
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
|
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
espree@9.5.1:
|
espree@9.5.1:
|
||||||
@@ -805,8 +723,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
|
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
|
||||||
engines: {node: ^10.12.0 || >=12.0.0}
|
engines: {node: ^10.12.0 || >=12.0.0}
|
||||||
|
|
||||||
fill-range@7.1.1:
|
fill-range@7.0.1:
|
||||||
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
|
resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
find-up@5.0.0:
|
find-up@5.0.0:
|
||||||
@@ -839,6 +757,11 @@ packages:
|
|||||||
fs.realpath@1.0.0:
|
fs.realpath@1.0.0:
|
||||||
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
|
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
|
||||||
|
|
||||||
|
fsevents@2.3.3:
|
||||||
|
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
|
||||||
|
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
||||||
|
os: [darwin]
|
||||||
|
|
||||||
function-bind@1.1.1:
|
function-bind@1.1.1:
|
||||||
resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
|
resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
|
||||||
|
|
||||||
@@ -869,11 +792,9 @@ packages:
|
|||||||
|
|
||||||
glob@7.1.7:
|
glob@7.1.7:
|
||||||
resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==}
|
resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==}
|
||||||
deprecated: Glob versions prior to v9 are no longer supported
|
|
||||||
|
|
||||||
glob@7.2.3:
|
glob@7.2.3:
|
||||||
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
|
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
|
||||||
deprecated: Glob versions prior to v9 are no longer supported
|
|
||||||
|
|
||||||
globals@13.20.0:
|
globals@13.20.0:
|
||||||
resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==}
|
resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==}
|
||||||
@@ -926,8 +847,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
|
resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
|
||||||
engines: {node: '>= 4'}
|
engines: {node: '>= 4'}
|
||||||
|
|
||||||
immutable@5.1.2:
|
immutable@4.3.0:
|
||||||
resolution: {integrity: sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==}
|
resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==}
|
||||||
|
|
||||||
import-fresh@3.3.0:
|
import-fresh@3.3.0:
|
||||||
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
|
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
|
||||||
@@ -939,7 +860,6 @@ packages:
|
|||||||
|
|
||||||
inflight@1.0.6:
|
inflight@1.0.6:
|
||||||
resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
|
resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
|
||||||
deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
|
|
||||||
|
|
||||||
inherits@2.0.4:
|
inherits@2.0.4:
|
||||||
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
|
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
|
||||||
@@ -965,6 +885,10 @@ packages:
|
|||||||
is-bigint@1.0.4:
|
is-bigint@1.0.4:
|
||||||
resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
|
resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
|
||||||
|
|
||||||
|
is-binary-path@2.1.0:
|
||||||
|
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
is-boolean-object@1.1.2:
|
is-boolean-object@1.1.2:
|
||||||
resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
|
resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
@@ -1096,8 +1020,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
|
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
|
||||||
engines: {node: '>= 8'}
|
engines: {node: '>= 8'}
|
||||||
|
|
||||||
micromatch@4.0.8:
|
micromatch@4.0.5:
|
||||||
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
|
resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
|
||||||
engines: {node: '>=8.6'}
|
engines: {node: '>=8.6'}
|
||||||
|
|
||||||
mime-db@1.52.0:
|
mime-db@1.52.0:
|
||||||
@@ -1146,8 +1070,9 @@ packages:
|
|||||||
sass:
|
sass:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
node-addon-api@7.1.1:
|
normalize-path@3.0.0:
|
||||||
resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
|
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
|
||||||
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
||||||
nth-check@2.1.1:
|
nth-check@2.1.1:
|
||||||
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
|
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
|
||||||
@@ -1267,9 +1192,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
|
resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
||||||
readdirp@4.1.2:
|
readdirp@3.6.0:
|
||||||
resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
|
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
|
||||||
engines: {node: '>= 14.18.0'}
|
engines: {node: '>=8.10.0'}
|
||||||
|
|
||||||
redis-errors@1.2.0:
|
redis-errors@1.2.0:
|
||||||
resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==}
|
resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==}
|
||||||
@@ -1308,7 +1233,6 @@ packages:
|
|||||||
|
|
||||||
rimraf@3.0.2:
|
rimraf@3.0.2:
|
||||||
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
|
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
|
||||||
deprecated: Rimraf versions prior to v4 are no longer supported
|
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
run-parallel@1.2.0:
|
run-parallel@1.2.0:
|
||||||
@@ -1317,8 +1241,8 @@ packages:
|
|||||||
safe-regex-test@1.0.0:
|
safe-regex-test@1.0.0:
|
||||||
resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
|
resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
|
||||||
|
|
||||||
sass@1.89.2:
|
sass@1.62.1:
|
||||||
resolution: {integrity: sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==}
|
resolution: {integrity: sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==}
|
||||||
engines: {node: '>=14.0.0'}
|
engines: {node: '>=14.0.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@@ -1361,8 +1285,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
|
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
source-map-js@1.2.1:
|
source-map-js@1.0.2:
|
||||||
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
|
resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
||||||
standard-as-callback@2.1.0:
|
standard-as-callback@2.1.0:
|
||||||
@@ -1434,9 +1358,6 @@ packages:
|
|||||||
tslib@2.5.0:
|
tslib@2.5.0:
|
||||||
resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==}
|
resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==}
|
||||||
|
|
||||||
tslib@2.6.2:
|
|
||||||
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
|
|
||||||
|
|
||||||
tsutils@3.21.0:
|
tsutils@3.21.0:
|
||||||
resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
|
resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
|
||||||
engines: {node: '>= 6'}
|
engines: {node: '>= 6'}
|
||||||
@@ -1510,7 +1431,7 @@ snapshots:
|
|||||||
|
|
||||||
'@emnapi/runtime@0.44.0':
|
'@emnapi/runtime@0.44.0':
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib: 2.6.2
|
tslib: 2.5.0
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@eslint/eslintrc@1.4.1':
|
'@eslint/eslintrc@1.4.1':
|
||||||
@@ -1673,67 +1594,6 @@ snapshots:
|
|||||||
'@nodelib/fs.scandir': 2.1.5
|
'@nodelib/fs.scandir': 2.1.5
|
||||||
fastq: 1.15.0
|
fastq: 1.15.0
|
||||||
|
|
||||||
'@parcel/watcher-android-arm64@2.5.1':
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@parcel/watcher-darwin-arm64@2.5.1':
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@parcel/watcher-darwin-x64@2.5.1':
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@parcel/watcher-freebsd-x64@2.5.1':
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@parcel/watcher-linux-arm-glibc@2.5.1':
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@parcel/watcher-linux-arm-musl@2.5.1':
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@parcel/watcher-linux-arm64-glibc@2.5.1':
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@parcel/watcher-linux-arm64-musl@2.5.1':
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@parcel/watcher-linux-x64-glibc@2.5.1':
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@parcel/watcher-linux-x64-musl@2.5.1':
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@parcel/watcher-win32-arm64@2.5.1':
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@parcel/watcher-win32-ia32@2.5.1':
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@parcel/watcher-win32-x64@2.5.1':
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@parcel/watcher@2.5.1':
|
|
||||||
dependencies:
|
|
||||||
detect-libc: 1.0.3
|
|
||||||
is-glob: 4.0.3
|
|
||||||
micromatch: 4.0.8
|
|
||||||
node-addon-api: 7.1.1
|
|
||||||
optionalDependencies:
|
|
||||||
'@parcel/watcher-android-arm64': 2.5.1
|
|
||||||
'@parcel/watcher-darwin-arm64': 2.5.1
|
|
||||||
'@parcel/watcher-darwin-x64': 2.5.1
|
|
||||||
'@parcel/watcher-freebsd-x64': 2.5.1
|
|
||||||
'@parcel/watcher-linux-arm-glibc': 2.5.1
|
|
||||||
'@parcel/watcher-linux-arm-musl': 2.5.1
|
|
||||||
'@parcel/watcher-linux-arm64-glibc': 2.5.1
|
|
||||||
'@parcel/watcher-linux-arm64-musl': 2.5.1
|
|
||||||
'@parcel/watcher-linux-x64-glibc': 2.5.1
|
|
||||||
'@parcel/watcher-linux-x64-musl': 2.5.1
|
|
||||||
'@parcel/watcher-win32-arm64': 2.5.1
|
|
||||||
'@parcel/watcher-win32-ia32': 2.5.1
|
|
||||||
'@parcel/watcher-win32-x64': 2.5.1
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
'@rushstack/eslint-patch@1.2.0': {}
|
'@rushstack/eslint-patch@1.2.0': {}
|
||||||
|
|
||||||
'@swc/helpers@0.4.3':
|
'@swc/helpers@0.4.3':
|
||||||
@@ -1815,6 +1675,11 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
color-convert: 2.0.1
|
color-convert: 2.0.1
|
||||||
|
|
||||||
|
anymatch@3.1.3:
|
||||||
|
dependencies:
|
||||||
|
normalize-path: 3.0.0
|
||||||
|
picomatch: 2.3.1
|
||||||
|
|
||||||
argparse@2.0.1: {}
|
argparse@2.0.1: {}
|
||||||
|
|
||||||
aria-query@5.1.3:
|
aria-query@5.1.3:
|
||||||
@@ -1879,6 +1744,8 @@ snapshots:
|
|||||||
|
|
||||||
balanced-match@1.0.2: {}
|
balanced-match@1.0.2: {}
|
||||||
|
|
||||||
|
binary-extensions@2.2.0: {}
|
||||||
|
|
||||||
boolbase@1.0.0: {}
|
boolbase@1.0.0: {}
|
||||||
|
|
||||||
brace-expansion@1.1.11:
|
brace-expansion@1.1.11:
|
||||||
@@ -1886,9 +1753,9 @@ snapshots:
|
|||||||
balanced-match: 1.0.2
|
balanced-match: 1.0.2
|
||||||
concat-map: 0.0.1
|
concat-map: 0.0.1
|
||||||
|
|
||||||
braces@3.0.3:
|
braces@3.0.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
fill-range: 7.1.1
|
fill-range: 7.0.1
|
||||||
|
|
||||||
call-bind@1.0.2:
|
call-bind@1.0.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -1923,9 +1790,17 @@ snapshots:
|
|||||||
parse5: 7.1.2
|
parse5: 7.1.2
|
||||||
parse5-htmlparser2-tree-adapter: 7.0.0
|
parse5-htmlparser2-tree-adapter: 7.0.0
|
||||||
|
|
||||||
chokidar@4.0.3:
|
chokidar@3.5.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
readdirp: 4.1.2
|
anymatch: 3.1.3
|
||||||
|
braces: 3.0.2
|
||||||
|
glob-parent: 5.1.2
|
||||||
|
is-binary-path: 2.1.0
|
||||||
|
is-glob: 4.0.3
|
||||||
|
normalize-path: 3.0.0
|
||||||
|
readdirp: 3.6.0
|
||||||
|
optionalDependencies:
|
||||||
|
fsevents: 2.3.3
|
||||||
|
|
||||||
cluster-key-slot@1.1.2: {}
|
cluster-key-slot@1.1.2: {}
|
||||||
|
|
||||||
@@ -2010,9 +1885,6 @@ snapshots:
|
|||||||
|
|
||||||
denque@2.1.0: {}
|
denque@2.1.0: {}
|
||||||
|
|
||||||
detect-libc@1.0.3:
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
detect-libc@2.0.2: {}
|
detect-libc@2.0.2: {}
|
||||||
|
|
||||||
dir-glob@3.0.1:
|
dir-glob@3.0.1:
|
||||||
@@ -2124,7 +1996,7 @@ snapshots:
|
|||||||
eslint: 8.22.0
|
eslint: 8.22.0
|
||||||
eslint-import-resolver-node: 0.3.7
|
eslint-import-resolver-node: 0.3.7
|
||||||
eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.27.5(eslint@8.22.0))(eslint@8.22.0)
|
eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.27.5(eslint@8.22.0))(eslint@8.22.0)
|
||||||
eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.1(eslint@8.22.0)(typescript@4.7.4))(eslint-import-resolver-typescript@2.7.1)(eslint@8.22.0)
|
eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.1(eslint@8.22.0)(typescript@4.7.4))(eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.27.5(eslint@8.22.0))(eslint@8.22.0))(eslint@8.22.0)
|
||||||
eslint-plugin-jsx-a11y: 6.7.1(eslint@8.22.0)
|
eslint-plugin-jsx-a11y: 6.7.1(eslint@8.22.0)
|
||||||
eslint-plugin-react: 7.32.2(eslint@8.22.0)
|
eslint-plugin-react: 7.32.2(eslint@8.22.0)
|
||||||
eslint-plugin-react-hooks: 4.6.0(eslint@8.22.0)
|
eslint-plugin-react-hooks: 4.6.0(eslint@8.22.0)
|
||||||
@@ -2146,7 +2018,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
debug: 4.3.4
|
debug: 4.3.4
|
||||||
eslint: 8.22.0
|
eslint: 8.22.0
|
||||||
eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.1(eslint@8.22.0)(typescript@4.7.4))(eslint-import-resolver-typescript@2.7.1)(eslint@8.22.0)
|
eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.1(eslint@8.22.0)(typescript@4.7.4))(eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.27.5(eslint@8.22.0))(eslint@8.22.0))(eslint@8.22.0)
|
||||||
glob: 7.2.3
|
glob: 7.2.3
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
resolve: 1.22.2
|
resolve: 1.22.2
|
||||||
@@ -2165,7 +2037,7 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.59.1(eslint@8.22.0)(typescript@4.7.4))(eslint-import-resolver-typescript@2.7.1)(eslint@8.22.0):
|
eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.59.1(eslint@8.22.0)(typescript@4.7.4))(eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.27.5(eslint@8.22.0))(eslint@8.22.0))(eslint@8.22.0):
|
||||||
dependencies:
|
dependencies:
|
||||||
array-includes: 3.1.6
|
array-includes: 3.1.6
|
||||||
array.prototype.flat: 1.3.1
|
array.prototype.flat: 1.3.1
|
||||||
@@ -2317,7 +2189,7 @@ snapshots:
|
|||||||
'@nodelib/fs.walk': 1.2.8
|
'@nodelib/fs.walk': 1.2.8
|
||||||
glob-parent: 5.1.2
|
glob-parent: 5.1.2
|
||||||
merge2: 1.4.1
|
merge2: 1.4.1
|
||||||
micromatch: 4.0.8
|
micromatch: 4.0.5
|
||||||
|
|
||||||
fast-json-stable-stringify@2.1.0: {}
|
fast-json-stable-stringify@2.1.0: {}
|
||||||
|
|
||||||
@@ -2331,7 +2203,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
flat-cache: 3.0.4
|
flat-cache: 3.0.4
|
||||||
|
|
||||||
fill-range@7.1.1:
|
fill-range@7.0.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
to-regex-range: 5.0.1
|
to-regex-range: 5.0.1
|
||||||
|
|
||||||
@@ -2361,6 +2233,9 @@ snapshots:
|
|||||||
|
|
||||||
fs.realpath@1.0.0: {}
|
fs.realpath@1.0.0: {}
|
||||||
|
|
||||||
|
fsevents@2.3.3:
|
||||||
|
optional: true
|
||||||
|
|
||||||
function-bind@1.1.1: {}
|
function-bind@1.1.1: {}
|
||||||
|
|
||||||
function.prototype.name@1.1.5:
|
function.prototype.name@1.1.5:
|
||||||
@@ -2463,7 +2338,7 @@ snapshots:
|
|||||||
|
|
||||||
ignore@5.2.4: {}
|
ignore@5.2.4: {}
|
||||||
|
|
||||||
immutable@5.1.2: {}
|
immutable@4.3.0: {}
|
||||||
|
|
||||||
import-fresh@3.3.0:
|
import-fresh@3.3.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -2516,6 +2391,10 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
has-bigints: 1.0.2
|
has-bigints: 1.0.2
|
||||||
|
|
||||||
|
is-binary-path@2.1.0:
|
||||||
|
dependencies:
|
||||||
|
binary-extensions: 2.2.0
|
||||||
|
|
||||||
is-boolean-object@1.1.2:
|
is-boolean-object@1.1.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
call-bind: 1.0.2
|
call-bind: 1.0.2
|
||||||
@@ -2639,9 +2518,9 @@ snapshots:
|
|||||||
|
|
||||||
merge2@1.4.1: {}
|
merge2@1.4.1: {}
|
||||||
|
|
||||||
micromatch@4.0.8:
|
micromatch@4.0.5:
|
||||||
dependencies:
|
dependencies:
|
||||||
braces: 3.0.3
|
braces: 3.0.2
|
||||||
picomatch: 2.3.1
|
picomatch: 2.3.1
|
||||||
|
|
||||||
mime-db@1.52.0: {}
|
mime-db@1.52.0: {}
|
||||||
@@ -2664,7 +2543,7 @@ snapshots:
|
|||||||
|
|
||||||
natural-compare@1.4.0: {}
|
natural-compare@1.4.0: {}
|
||||||
|
|
||||||
next@12.2.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.89.2):
|
next@12.2.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.62.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@next/env': 12.2.5
|
'@next/env': 12.2.5
|
||||||
'@swc/helpers': 0.4.3
|
'@swc/helpers': 0.4.3
|
||||||
@@ -2688,13 +2567,12 @@ snapshots:
|
|||||||
'@next/swc-win32-arm64-msvc': 12.2.5
|
'@next/swc-win32-arm64-msvc': 12.2.5
|
||||||
'@next/swc-win32-ia32-msvc': 12.2.5
|
'@next/swc-win32-ia32-msvc': 12.2.5
|
||||||
'@next/swc-win32-x64-msvc': 12.2.5
|
'@next/swc-win32-x64-msvc': 12.2.5
|
||||||
sass: 1.89.2
|
sass: 1.62.1
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@babel/core'
|
- '@babel/core'
|
||||||
- babel-plugin-macros
|
- babel-plugin-macros
|
||||||
|
|
||||||
node-addon-api@7.1.1:
|
normalize-path@3.0.0: {}
|
||||||
optional: true
|
|
||||||
|
|
||||||
nth-check@2.1.1:
|
nth-check@2.1.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -2793,7 +2671,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
nanoid: 3.3.6
|
nanoid: 3.3.6
|
||||||
picocolors: 1.0.0
|
picocolors: 1.0.0
|
||||||
source-map-js: 1.2.1
|
source-map-js: 1.0.2
|
||||||
|
|
||||||
prelude-ls@1.2.1: {}
|
prelude-ls@1.2.1: {}
|
||||||
|
|
||||||
@@ -2819,7 +2697,9 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
loose-envify: 1.4.0
|
loose-envify: 1.4.0
|
||||||
|
|
||||||
readdirp@4.1.2: {}
|
readdirp@3.6.0:
|
||||||
|
dependencies:
|
||||||
|
picomatch: 2.3.1
|
||||||
|
|
||||||
redis-errors@1.2.0: {}
|
redis-errors@1.2.0: {}
|
||||||
|
|
||||||
@@ -2867,13 +2747,11 @@ snapshots:
|
|||||||
get-intrinsic: 1.2.0
|
get-intrinsic: 1.2.0
|
||||||
is-regex: 1.1.4
|
is-regex: 1.1.4
|
||||||
|
|
||||||
sass@1.89.2:
|
sass@1.62.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
chokidar: 4.0.3
|
chokidar: 3.5.3
|
||||||
immutable: 5.1.2
|
immutable: 4.3.0
|
||||||
source-map-js: 1.2.1
|
source-map-js: 1.0.2
|
||||||
optionalDependencies:
|
|
||||||
'@parcel/watcher': 2.5.1
|
|
||||||
|
|
||||||
scheduler@0.23.0:
|
scheduler@0.23.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -2933,7 +2811,7 @@ snapshots:
|
|||||||
|
|
||||||
slash@3.0.0: {}
|
slash@3.0.0: {}
|
||||||
|
|
||||||
source-map-js@1.2.1: {}
|
source-map-js@1.0.2: {}
|
||||||
|
|
||||||
standard-as-callback@2.1.0: {}
|
standard-as-callback@2.1.0: {}
|
||||||
|
|
||||||
@@ -3005,9 +2883,6 @@ snapshots:
|
|||||||
|
|
||||||
tslib@2.5.0: {}
|
tslib@2.5.0: {}
|
||||||
|
|
||||||
tslib@2.6.2:
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
tsutils@3.21.0(typescript@4.7.4):
|
tsutils@3.21.0(typescript@4.7.4):
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib: 1.14.1
|
tslib: 1.14.1
|
||||||
|
2
pnpm-workspace.yaml
Normal file
2
pnpm-workspace.yaml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
onlyBuiltDependencies:
|
||||||
|
- sharp
|
7
public/opensearch.xml
Normal file
7
public/opensearch.xml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
|
||||||
|
<ShortName>libremdb</ShortName>
|
||||||
|
<Description>Search libremdb</Description>
|
||||||
|
<InputEncoding>UTF-8</InputEncoding>
|
||||||
|
<Image width="16" height="16" type="image/x-icon">https://libremdb.iket.me/favicon.ico</Image>
|
||||||
|
<Url type="text/html" method="get" template="https://libremdb.iket.me/find?q={searchTerms}"/>
|
||||||
|
</OpenSearchDescription>
|
@@ -15,6 +15,8 @@
|
|||||||
"purpose": "any maskable"
|
"purpose": "any maskable"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"start_url": "/",
|
||||||
|
"display": "minimal-ui",
|
||||||
"theme_color": "#b80040",
|
"theme_color": "#b80040",
|
||||||
"background_color": "#ffe5ef"
|
"background_color": "#ffe5ef"
|
||||||
}
|
}
|
||||||
|
@@ -11,6 +11,7 @@ type Props = {
|
|||||||
message: string;
|
message: string;
|
||||||
statusCode?: number;
|
statusCode?: number;
|
||||||
originalPath?: string;
|
originalPath?: string;
|
||||||
|
stack?: string;
|
||||||
/** props specific to error boundary. */
|
/** props specific to error boundary. */
|
||||||
misc?: {
|
misc?: {
|
||||||
subtext: string;
|
subtext: string;
|
||||||
@@ -19,7 +20,9 @@ type Props = {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const ErrorInfo = ({ message, statusCode, misc, originalPath }: Props) => {
|
const isDev = process.env.NODE_ENV === 'development';
|
||||||
|
|
||||||
|
const ErrorInfo = ({ message, statusCode, misc, originalPath, stack }: Props) => {
|
||||||
const title = statusCode ? `${message} (${statusCode})` : message;
|
const title = statusCode ? `${message} (${statusCode})` : message;
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -39,6 +42,11 @@ const ErrorInfo = ({ message, statusCode, misc, originalPath }: Props) => {
|
|||||||
<use href='/svg/sadgnu.svg#sad-gnu'></use>
|
<use href='/svg/sadgnu.svg#sad-gnu'></use>
|
||||||
</svg>
|
</svg>
|
||||||
<h1 className={`heading heading__primary ${styles.heading}`}>{title}</h1>
|
<h1 className={`heading heading__primary ${styles.heading}`}>{title}</h1>
|
||||||
|
{Boolean(stack && isDev) && (
|
||||||
|
<pre className={styles.stack}>
|
||||||
|
<code>{stack}</code>
|
||||||
|
</pre>
|
||||||
|
)}
|
||||||
{misc ? (
|
{misc ? (
|
||||||
<>
|
<>
|
||||||
<p>{misc.subtext}</p>
|
<p>{misc.subtext}</p>
|
||||||
@@ -64,6 +72,13 @@ const ErrorInfo = ({ message, statusCode, misc, originalPath }: Props) => {
|
|||||||
.
|
.
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
<p>
|
||||||
|
If you think this shouldn't happen,{' '}
|
||||||
|
<Link href='/contact'>
|
||||||
|
<a className='link'>let it be known</a>
|
||||||
|
</Link>
|
||||||
|
.
|
||||||
|
</p>
|
||||||
</Layout>
|
</Layout>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
@@ -14,32 +14,41 @@ type Props = {
|
|||||||
const Media = ({ className, media }: Props) => {
|
const Media = ({ className, media }: Props) => {
|
||||||
return (
|
return (
|
||||||
<div className={`${className} ${styles.media}`}>
|
<div className={`${className} ${styles.media}`}>
|
||||||
{(media.trailer || !!media.videos.total) && (
|
{(media.trailers?.length || !!media.videos.total) && (
|
||||||
<section className={styles.videos}>
|
<section className={styles.videos}>
|
||||||
<h2 className='heading heading__secondary'>Videos</h2>
|
<h2 className='heading heading__secondary'>Videos</h2>
|
||||||
|
|
||||||
<div className={styles.videos__container}>
|
<div className={styles.videos__container}>
|
||||||
{media.trailer && (
|
{media.trailers?.map(trailer => (
|
||||||
<div className={styles.trailer}>
|
<div className={styles.trailer} key={trailer.id}>
|
||||||
<video
|
<video
|
||||||
aria-label='trailer video'
|
aria-label={trailer.caption ?? 'trailer video'}
|
||||||
controls
|
controls
|
||||||
playsInline
|
playsInline
|
||||||
poster={getProxiedIMDbImgUrl(modifyIMDbImg(media.trailer.thumbnail))}
|
poster={getProxiedIMDbImgUrl(modifyIMDbImg(trailer.thumbnail))}
|
||||||
className={styles.trailer__video}
|
className={styles.trailer__video}
|
||||||
preload='none'
|
preload='none'
|
||||||
|
muted
|
||||||
>
|
>
|
||||||
{media.trailer.urls.map(source => (
|
{trailer.urls.map(source => (
|
||||||
<source
|
<source
|
||||||
key={source.url}
|
key={source.url}
|
||||||
type={source.mimeType ?? undefined}
|
type='video/mp4'
|
||||||
src={getProxiedIMDbImgUrl(source.url)}
|
src={getProxiedIMDbImgUrl(source.url)}
|
||||||
|
media={source.resolution !== 'SD' ? '(min-width: 450px)' : undefined}
|
||||||
data-res={source.resolution}
|
data-res={source.resolution}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
|
|
||||||
|
<p>
|
||||||
|
{trailer.caption}:{' '}
|
||||||
|
<Link href={getProxiedIMDbImgUrl(trailer.urls[0]?.url)}>
|
||||||
|
<a className='link'>link</a>
|
||||||
|
</Link>
|
||||||
|
</p>
|
||||||
</video>
|
</video>
|
||||||
</div>
|
</div>
|
||||||
)}
|
))}
|
||||||
|
|
||||||
{!!media.videos.total &&
|
{!!media.videos.total &&
|
||||||
media.videos.videos.map(video => (
|
media.videos.videos.map(video => (
|
||||||
|
@@ -36,6 +36,13 @@ const Meta = ({
|
|||||||
<meta property='og:locale' content='en_US' />
|
<meta property='og:locale' content='en_US' />
|
||||||
<meta property='og:type' content='video.movie' />
|
<meta property='og:type' content='video.movie' />
|
||||||
<meta property='og:image' content={url.toString()} />
|
<meta property='og:image' content={url.toString()} />
|
||||||
|
|
||||||
|
<link
|
||||||
|
rel='search'
|
||||||
|
type='application/opensearchdescription+xml'
|
||||||
|
href='/opensearch.xml'
|
||||||
|
title='libremdb'
|
||||||
|
></link>
|
||||||
</Head>
|
</Head>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@@ -9,43 +9,54 @@ type Props = {
|
|||||||
const DidYouKnow = ({ data }: Props) => (
|
const DidYouKnow = ({ data }: Props) => (
|
||||||
<section className={styles.container}>
|
<section className={styles.container}>
|
||||||
<h2 className='heading heading__secondary'>Did you know</h2>
|
<h2 className='heading heading__secondary'>Did you know</h2>
|
||||||
{!!data.trivia?.total && (
|
{isEmpty(data) ? (
|
||||||
<section>
|
<p>Nothing interesting to show.</p>
|
||||||
<h3 className='heading heading__tertiary'>Trivia</h3>
|
) : (
|
||||||
<div dangerouslySetInnerHTML={{ __html: data.trivia.html }}></div>
|
<>
|
||||||
</section>
|
{!!data.trivia?.total && (
|
||||||
)}
|
<section>
|
||||||
{!!data.quotes?.total && (
|
<h3 className='heading heading__tertiary'>Trivia</h3>
|
||||||
<section>
|
<div dangerouslySetInnerHTML={{ __html: data.trivia.html }}></div>
|
||||||
<h3 className='heading heading__tertiary'>Quotes</h3>
|
</section>
|
||||||
<div dangerouslySetInnerHTML={{ __html: data.quotes.html }}></div>
|
)}
|
||||||
</section>
|
{!!data.quotes?.total && (
|
||||||
)}
|
<section>
|
||||||
{!!data.trademark?.total && (
|
<h3 className='heading heading__tertiary'>Quotes</h3>
|
||||||
<section>
|
<div dangerouslySetInnerHTML={{ __html: data.quotes.html }}></div>
|
||||||
<h3 className='heading heading__tertiary'>Trademark</h3>
|
</section>
|
||||||
<div dangerouslySetInnerHTML={{ __html: data.trademark.html }}></div>
|
)}
|
||||||
</section>
|
{!!data.trademark?.total && (
|
||||||
)}
|
<section>
|
||||||
{!!data.nicknames.length && (
|
<h3 className='heading heading__tertiary'>Trademark</h3>
|
||||||
<section>
|
<div dangerouslySetInnerHTML={{ __html: data.trademark.html }}></div>
|
||||||
<h3 className='heading heading__tertiary'>Nicknames</h3>
|
</section>
|
||||||
<p>{data.nicknames.join(', ')}</p>
|
)}
|
||||||
</section>
|
{!!data.nicknames.length && (
|
||||||
)}
|
<section>
|
||||||
{!!data.salary?.total && (
|
<h3 className='heading heading__tertiary'>Nicknames</h3>
|
||||||
<section>
|
<p>{data.nicknames.join(', ')}</p>
|
||||||
<h3 className='heading heading__tertiary'>Salary</h3>
|
</section>
|
||||||
<p>
|
)}
|
||||||
<span>{data.salary.value} in </span>
|
{!!data.salary?.total && (
|
||||||
<Link href={`/title/${data.salary.title.id}`}>
|
<section>
|
||||||
<a className={'link'}>{data.salary.title.text}</a>
|
<h3 className='heading heading__tertiary'>Salary</h3>
|
||||||
</Link>
|
<p>
|
||||||
<span> ({data.salary.title.year})</span>
|
<span>{data.salary.value} in </span>
|
||||||
</p>
|
<Link href={`/title/${data.salary.title.id}`}>
|
||||||
</section>
|
<a className={'link'}>{data.salary.title.text}</a>
|
||||||
|
</Link>
|
||||||
|
<span> ({data.salary.title.year})</span>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
)}
|
)}
|
||||||
</section>
|
</section>
|
||||||
);
|
);
|
||||||
|
|
||||||
export default DidYouKnow;
|
export default DidYouKnow;
|
||||||
|
|
||||||
|
const isEmpty = (data: Props['data']) =>
|
||||||
|
Boolean(
|
||||||
|
!data.nicknames.length && !data.quotes && !data.salary && !data.trademark && !data.trivia
|
||||||
|
);
|
@@ -86,6 +86,21 @@ const Basic = ({ data, className }: Props) => {
|
|||||||
))}
|
))}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{!!data.interests.length && (
|
||||||
|
<p className={styles.genres}>
|
||||||
|
<span className={styles.genres__heading}>Interests: </span>
|
||||||
|
{data.interests.map((interest, i) => (
|
||||||
|
<Fragment key={interest.id}>
|
||||||
|
{i > 0 && ', '}
|
||||||
|
<Link href={`/interest/${interest.id}`}>
|
||||||
|
<a className={styles.link}>{interest.text}</a>
|
||||||
|
</Link>
|
||||||
|
</Fragment>
|
||||||
|
))}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
|
||||||
<p className={styles.overview}>
|
<p className={styles.overview}>
|
||||||
<span className={styles.overview__heading}>Plot: </span>
|
<span className={styles.overview__heading}>Plot: </span>
|
||||||
<span className={styles.overview__text}>{data.plot || '-'}</span>
|
<span className={styles.overview__text}>{data.plot || '-'}</span>
|
||||||
|
@@ -7,7 +7,13 @@ type Props = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const DidYouKnow = ({ data }: Props) => {
|
const DidYouKnow = ({ data }: Props) => {
|
||||||
if (!Object.keys(data).length) return <></>;
|
if (!Object.keys(data).length)
|
||||||
|
return (
|
||||||
|
<section className={styles.didYouKnow}>
|
||||||
|
<h2 className='heading heading__secondary'>Did you know</h2>
|
||||||
|
<p>Nothing interesting to show.</p>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
return (
|
return (
|
||||||
<section className={styles.didYouKnow}>
|
<section className={styles.didYouKnow}>
|
||||||
<h2 className='heading heading__secondary'>Did you know</h2>
|
<h2 className='heading heading__secondary'>Did you know</h2>
|
||||||
|
@@ -1,82 +1,127 @@
|
|||||||
import { useRouter } from 'next/router';
|
import { useRouter } from 'next/router';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { Reviews } from 'src/interfaces/shared/title';
|
import type { Reviews as TReviews } from 'src/interfaces/shared/title';
|
||||||
import { formatNumber } from 'src/utils/helpers';
|
import { formatNumber } from 'src/utils/helpers';
|
||||||
import styles from 'src/styles/modules/components/title/reviews.module.scss';
|
import styles from 'src/styles/modules/components/title/reviews.module.scss';
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
reviews: Reviews;
|
reviews: TReviews;
|
||||||
};
|
};
|
||||||
|
|
||||||
const Reviews = ({ reviews }: Props) => {
|
const Reviews = ({ reviews }: Props) => {
|
||||||
|
return (
|
||||||
|
<section className={styles.reviews}>
|
||||||
|
<h2 className='heading heading__secondary'>Reviews</h2>
|
||||||
|
|
||||||
|
<RatingsDistribution ratings={reviews.ratingsDistribution} />
|
||||||
|
|
||||||
|
<section className={styles.userReviews}>
|
||||||
|
<h3 className='heading heading__tertiary'>User Reviews</h3>
|
||||||
|
{reviews.featuredReviews ? (
|
||||||
|
<ul className={styles.userReviews__list} role='list'>
|
||||||
|
{reviews.featuredReviews.map(featuredReview => (
|
||||||
|
<li key={featuredReview.id}>
|
||||||
|
<details className={styles.review}>
|
||||||
|
<summary className={styles.review__summary}>
|
||||||
|
<strong>{featuredReview.review.summary}</strong>
|
||||||
|
</summary>
|
||||||
|
<div
|
||||||
|
className={styles.review__text}
|
||||||
|
dangerouslySetInnerHTML={{
|
||||||
|
__html: featuredReview.review.html,
|
||||||
|
}}
|
||||||
|
></div>
|
||||||
|
<footer className={styles.review__metadata}>
|
||||||
|
<p>
|
||||||
|
{featuredReview.rating && <span>Rated {featuredReview.rating}/10</span>}
|
||||||
|
<span>
|
||||||
|
{' '}
|
||||||
|
by{' '}
|
||||||
|
<Link href={`/user/${featuredReview.reviewer.id}`}>
|
||||||
|
<a className='link'>{featuredReview.reviewer.name}</a>
|
||||||
|
</Link>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
</footer>
|
||||||
|
</details>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
) : (
|
||||||
|
<p>No reviews yet.</p>
|
||||||
|
)}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{reviews.ai?.summary && (
|
||||||
|
<details className={styles.reviewAi}>
|
||||||
|
<summary className='heading heading__tertiary'>AI Summary</summary>
|
||||||
|
<p dangerouslySetInnerHTML={{ __html: reviews.ai.summary }} />
|
||||||
|
<ul>
|
||||||
|
{reviews.ai.themes.map(theme => (
|
||||||
|
<li key={theme.id}>{theme.text}</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</details>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<ReviewStats reviews={reviews} />
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Reviews;
|
||||||
|
|
||||||
|
const RatingsDistribution = ({ ratings }: { ratings: Props['reviews']['ratingsDistribution'] }) => {
|
||||||
|
const maxRating = Math.max(...ratings.map(r => r.votes));
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={styles.ratingsDistribution}>
|
||||||
|
<h3 className='heading heading__tertiary'>Ratings Distribution</h3>
|
||||||
|
{ratings.length ? (
|
||||||
|
<ul>
|
||||||
|
{ratings.map(rating => (
|
||||||
|
<li
|
||||||
|
key={rating.rating}
|
||||||
|
style={
|
||||||
|
{
|
||||||
|
'--bar-height': `${((rating.votes / maxRating) * 100).toFixed(2)}%`,
|
||||||
|
} as React.CSSProperties
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<span>
|
||||||
|
{rating.rating} <span>({formatNumber(rating.votes)})</span>
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
) : (
|
||||||
|
<p>No ratings yet.</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const ReviewStats = ({ reviews }: { reviews: Props['reviews'] }) => {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { titleId } = router.query;
|
const { titleId } = router.query;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className={styles.reviews}>
|
<div className={styles.reviewStats}>
|
||||||
<h2 className="heading heading__secondary">Reviews</h2>
|
<p>
|
||||||
|
<Link href={`/title/${titleId}/reviews`}>
|
||||||
{reviews.featuredReview && (
|
<a className='link'>{formatNumber(reviews.numUserReviews)} User reviews</a>
|
||||||
<article className={styles.reviews__reviewContainer}>
|
</Link>
|
||||||
<details className={styles.review}>
|
</p>
|
||||||
<summary className={styles.review__summary}>
|
<p>
|
||||||
<strong>{reviews.featuredReview.review.summary}</strong>
|
<Link href={`/title/${titleId}/externalreviews`}>
|
||||||
</summary>
|
<a className='link'>{formatNumber(reviews.numCriticReviews)} Critic reviews</a>
|
||||||
<div
|
</Link>
|
||||||
className={styles.review__text}
|
</p>
|
||||||
dangerouslySetInnerHTML={{
|
<p>
|
||||||
__html: reviews.featuredReview.review.html,
|
<Link href={`/title/${titleId}/criticreviews`}>
|
||||||
}}
|
<a className='link'> {reviews.metacriticScore} Metascore</a>
|
||||||
></div>
|
</Link>
|
||||||
</details>
|
</p>
|
||||||
<footer className={styles.review__metadata}>
|
</div>
|
||||||
<p>
|
|
||||||
{reviews.featuredReview.rating && (
|
|
||||||
<span>Rated {reviews.featuredReview.rating}/10</span>
|
|
||||||
)}
|
|
||||||
<span>
|
|
||||||
{' '}
|
|
||||||
by{' '}
|
|
||||||
<Link href={`/user/${reviews.featuredReview.reviewer.id}`}>
|
|
||||||
<a className="link">{reviews.featuredReview.reviewer.name}</a>
|
|
||||||
</Link>
|
|
||||||
</span>
|
|
||||||
<span> on {reviews.featuredReview.date}.</span>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<span>
|
|
||||||
{formatNumber(reviews.featuredReview.votes.up)} upvotes
|
|
||||||
</span>
|
|
||||||
<span>
|
|
||||||
, {formatNumber(reviews.featuredReview.votes.down)} downvotes
|
|
||||||
</span>
|
|
||||||
</p>
|
|
||||||
</footer>
|
|
||||||
</article>
|
|
||||||
)}
|
|
||||||
|
|
||||||
<div className={styles.reviews__stats}>
|
|
||||||
<p>
|
|
||||||
<Link href={`/title/${titleId}/reviews`}>
|
|
||||||
<a className="link">
|
|
||||||
{formatNumber(reviews.numUserReviews)} User reviews
|
|
||||||
</a>
|
|
||||||
</Link>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<Link href={`/title/${titleId}/externalreviews`}>
|
|
||||||
<a className="link">
|
|
||||||
{formatNumber(reviews.numCriticReviews)} Critic reviews
|
|
||||||
</a>
|
|
||||||
</Link>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<Link href={`/title/${titleId}/criticreviews`}>
|
|
||||||
<a className="link"> {reviews.metacriticScore} Metascore</a>
|
|
||||||
</Link>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
export default Reviews;
|
|
||||||
|
@@ -143,7 +143,7 @@ export default interface Name {
|
|||||||
value: string;
|
value: string;
|
||||||
language: string;
|
language: string;
|
||||||
};
|
};
|
||||||
mimeType?: string;
|
videoMimeType?: string;
|
||||||
url: string;
|
url: string;
|
||||||
}>;
|
}>;
|
||||||
recommendedTimedTextTrack?: {
|
recommendedTimedTextTrack?: {
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,3 @@
|
|||||||
import { AppError as AppErrorClass } from 'src/utils/helpers';
|
import { AppError as AppErrorClass } from 'src/utils/helpers';
|
||||||
|
|
||||||
export type AppError = Omit<InstanceType<typeof AppErrorClass>, 'name'>;
|
export type AppError = Pick<InstanceType<typeof AppErrorClass>, 'message' | 'statusCode' | 'stack'>;
|
||||||
|
@@ -67,13 +67,13 @@ export const getServerSideProps: GetServerSideProps<Data, FindQueryParams> = asy
|
|||||||
props: { data: { title: query, results: res }, error: null, originalPath },
|
props: { data: { title: query, results: res }, error: null, originalPath },
|
||||||
};
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
const { message, statusCode } = getErrorProperties(error);
|
const err = getErrorProperties(error);
|
||||||
ctx.res.statusCode = statusCode;
|
ctx.res.statusCode = err.statusCode;
|
||||||
ctx.res.statusMessage = message;
|
ctx.res.statusMessage = err.message;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
props: {
|
props: {
|
||||||
error: { message, statusCode },
|
error: { message: err.message, statusCode: err.statusCode, stack: err.format() },
|
||||||
data: { title: query, results: null },
|
data: { title: query, results: null },
|
||||||
originalPath,
|
originalPath,
|
||||||
},
|
},
|
||||||
|
@@ -55,11 +55,17 @@ export const getServerSideProps: GetServerSideProps<Data, Params> = async ctx =>
|
|||||||
|
|
||||||
return { props: { data, error: null, originalPath } };
|
return { props: { data, error: null, originalPath } };
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
const { message, statusCode } = getErrorProperties(error);
|
const err = getErrorProperties(error);
|
||||||
ctx.res.statusCode = statusCode;
|
ctx.res.statusCode = err.statusCode;
|
||||||
ctx.res.statusMessage = message;
|
ctx.res.statusMessage = err.message;
|
||||||
|
|
||||||
return { props: { error: { message, statusCode }, data: null, originalPath } };
|
return {
|
||||||
|
props: {
|
||||||
|
error: { message: err.message, statusCode: err.statusCode, stack: err.format() },
|
||||||
|
data: null,
|
||||||
|
originalPath,
|
||||||
|
},
|
||||||
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -5,7 +5,7 @@ import ErrorInfo from 'src/components/error/ErrorInfo';
|
|||||||
import Media from 'src/components/media/Media';
|
import Media from 'src/components/media/Media';
|
||||||
import { Basic, Cast, DidYouKnow, Info, MoreLikeThis, Reviews } from 'src/components/title';
|
import { Basic, Cast, DidYouKnow, Info, MoreLikeThis, Reviews } from 'src/components/title';
|
||||||
import Title from 'src/interfaces/shared/title';
|
import Title from 'src/interfaces/shared/title';
|
||||||
import { AppError } from 'src/interfaces/shared/error';
|
import type { AppError } from 'src/interfaces/shared/error';
|
||||||
import getOrSetApiCache from 'src/utils/getOrSetApiCache';
|
import getOrSetApiCache from 'src/utils/getOrSetApiCache';
|
||||||
import title from 'src/utils/fetchers/title';
|
import title from 'src/utils/fetchers/title';
|
||||||
import { getErrorProperties, getProxiedIMDbImgUrl } from 'src/utils/helpers';
|
import { getErrorProperties, getProxiedIMDbImgUrl } from 'src/utils/helpers';
|
||||||
@@ -63,12 +63,18 @@ export const getServerSideProps: GetServerSideProps<Data, Params> = async ctx =>
|
|||||||
const data = await getOrSetApiCache(titleKey(titleId), title, titleId);
|
const data = await getOrSetApiCache(titleKey(titleId), title, titleId);
|
||||||
|
|
||||||
return { props: { data, error: null, originalPath } };
|
return { props: { data, error: null, originalPath } };
|
||||||
} catch (error) {
|
} catch (e) {
|
||||||
const { message, statusCode } = getErrorProperties(error);
|
const err = getErrorProperties(e);
|
||||||
ctx.res.statusCode = statusCode;
|
ctx.res.statusCode = err.statusCode;
|
||||||
ctx.res.statusMessage = message;
|
ctx.res.statusMessage = err.message;
|
||||||
|
|
||||||
return { props: { error: { message, statusCode }, data: null, originalPath } };
|
const error = {
|
||||||
|
message: err.message,
|
||||||
|
statusCode: err.statusCode,
|
||||||
|
stack: err.format(),
|
||||||
|
};
|
||||||
|
console.error(err);
|
||||||
|
return { props: { error, data: null, originalPath } };
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
display: grid;
|
display: grid;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
justify-items: center;
|
justify-items: center;
|
||||||
gap: var(--spacer-1);
|
gap: var(--comp-whitespace);
|
||||||
|
|
||||||
@include helper.bp('bp-700') {
|
@include helper.bp('bp-700') {
|
||||||
--doc-whitespace: var(--spacer-5);
|
--doc-whitespace: var(--spacer-5);
|
||||||
@@ -31,6 +31,19 @@
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.stack {
|
||||||
|
max-width: 90%;
|
||||||
|
max-height: 20rem;
|
||||||
|
padding: var(--spacer-3);
|
||||||
|
white-space: pre-wrap;
|
||||||
|
overflow: scroll;
|
||||||
|
|
||||||
|
user-select: all;
|
||||||
|
|
||||||
|
border-radius: var(--spacer-1);
|
||||||
|
background-color: var(--clr-bg-muted);
|
||||||
|
}
|
||||||
|
|
||||||
.button {
|
.button {
|
||||||
align-self: end;
|
align-self: end;
|
||||||
|
|
||||||
|
@@ -1,26 +1,94 @@
|
|||||||
.reviews {
|
.reviews {
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: var(--comp-whitespace);
|
gap: var(--comp-whitespace);
|
||||||
|
}
|
||||||
|
|
||||||
&__reviewContainer {
|
.ratingsDistribution {
|
||||||
// background-color: antiquewhite;
|
overflow: hidden;
|
||||||
|
|
||||||
|
ul {
|
||||||
|
list-style: none;
|
||||||
|
display: flex;
|
||||||
|
gap: var(--spacer-2);
|
||||||
|
overflow-x: auto;
|
||||||
|
padding-block: var(--spacer-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
&__stats {
|
li {
|
||||||
|
text-align: center;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
height: 5em;
|
||||||
|
align-items: center;
|
||||||
|
flex-shrink: 0;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
display: block;
|
||||||
|
content: '';
|
||||||
|
|
||||||
|
height: var(--bar-height);
|
||||||
|
margin-top: auto;
|
||||||
|
background-color: var(--clr-fill);
|
||||||
|
width: var(--spacer-6);
|
||||||
|
border-radius: var(--spacer-0);
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
font-weight: var(--fw-bold);
|
||||||
|
|
||||||
|
> span {
|
||||||
|
font-weight: initial;
|
||||||
|
font-size: 0.9em;
|
||||||
|
color: var(--clr-text-muted);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.reviewAi {
|
||||||
|
summary {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
p {
|
||||||
|
padding-block: var(--spacer-2);
|
||||||
|
}
|
||||||
|
ul {
|
||||||
|
list-style: none;
|
||||||
|
display: flex;
|
||||||
|
gap: var(--spacer-1);
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
gap: var(--spacer-2);
|
|
||||||
|
li {
|
||||||
|
padding: var(--spacer-1);
|
||||||
|
background-color: var(--clr-bg-muted);
|
||||||
|
border-radius: var(--spacer-0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.reviewStats {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: var(--spacer-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.userReviews {
|
||||||
|
|
||||||
|
&__list {
|
||||||
|
padding-block-start: var(--spacer-1);
|
||||||
|
display: grid;
|
||||||
|
gap: var(--spacer-1);
|
||||||
|
list-style: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.review {
|
.review {
|
||||||
&__summary {
|
&__summary {
|
||||||
font-size: calc(var(--fs-5) * 1.1);
|
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
&__text,
|
&__text,
|
||||||
&__metadata {
|
&__metadata {
|
||||||
padding-top: var(--spacer-2);
|
padding-top: var(--spacer-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -42,18 +42,18 @@ const cleanName = (rawData: RawName) => {
|
|||||||
},
|
},
|
||||||
media: {
|
media: {
|
||||||
...(main.primaryVideos.edges.length && {
|
...(main.primaryVideos.edges.length && {
|
||||||
trailer: {
|
trailers: main.primaryVideos.edges.map(trailer => ({
|
||||||
id: main.primaryVideos.edges[0].node.id,
|
id: trailer.node.id,
|
||||||
isMature: main.primaryVideos.edges[0].node.isMature,
|
isMature: trailer.node.isMature,
|
||||||
thumbnail: main.primaryVideos.edges[0].node.thumbnail.url,
|
thumbnail: trailer.node.thumbnail.url,
|
||||||
runtime: main.primaryVideos.edges[0].node.runtime.value,
|
runtime: trailer.node.runtime.value,
|
||||||
caption: main.primaryVideos.edges[0].node.description?.value ?? null,
|
caption: trailer.node.description?.value ?? null,
|
||||||
urls: main.primaryVideos.edges[0].node.playbackURLs.map(url => ({
|
urls: trailer.node.playbackURLs.map(url => ({
|
||||||
resolution: url.displayName.value,
|
resolution: url.displayName.value as 'SD' | '480p',
|
||||||
mimeType: url.mimeType ?? null,
|
mimeType: url.videoMimeType ?? null,
|
||||||
url: url.url,
|
url: url.url,
|
||||||
})),
|
})),
|
||||||
},
|
})),
|
||||||
}),
|
}),
|
||||||
images: {
|
images: {
|
||||||
total: misc.images.total,
|
total: misc.images.total,
|
||||||
|
@@ -12,6 +12,7 @@ const cleanTitle = (rawData: RawTitle) => {
|
|||||||
titleId: main.id,
|
titleId: main.id,
|
||||||
basic: {
|
basic: {
|
||||||
id: main.id,
|
id: main.id,
|
||||||
|
isAdult: main.isAdult,
|
||||||
title: main.titleText.text,
|
title: main.titleText.text,
|
||||||
// ...(main.originalTitleText.text.toLowerCase() !==
|
// ...(main.originalTitleText.text.toLowerCase() !==
|
||||||
// main.titleText.text.toLowerCase() && {
|
// main.titleText.text.toLowerCase() && {
|
||||||
@@ -50,6 +51,10 @@ const cleanTitle = (rawData: RawTitle) => {
|
|||||||
id: genre.id,
|
id: genre.id,
|
||||||
text: genre.text,
|
text: genre.text,
|
||||||
})),
|
})),
|
||||||
|
interests: main.interests.edges.map(interest => ({
|
||||||
|
id: interest.node.id,
|
||||||
|
text: interest.node.primaryText.text,
|
||||||
|
})),
|
||||||
plot: main.plot?.plotText?.plainText || null,
|
plot: main.plot?.plotText?.plainText || null,
|
||||||
primaryCrew: main.principalCredits.map(type => ({
|
primaryCrew: main.principalCredits.map(type => ({
|
||||||
type: { category: type.category.text, id: type.category.id },
|
type: { category: type.category.text, id: type.category.id },
|
||||||
@@ -76,18 +81,18 @@ const cleanTitle = (rawData: RawTitle) => {
|
|||||||
})),
|
})),
|
||||||
media: {
|
media: {
|
||||||
...(main.primaryVideos.edges.length && {
|
...(main.primaryVideos.edges.length && {
|
||||||
trailer: {
|
trailers: main.primaryVideos.edges.map(trailer => ({
|
||||||
id: main.primaryVideos.edges[0].node.id,
|
id: trailer.node.id,
|
||||||
isMature: main.primaryVideos.edges[0].node.isMature,
|
isMature: trailer.node.isMature,
|
||||||
thumbnail: main.primaryVideos.edges[0].node.thumbnail.url,
|
thumbnail: trailer.node.thumbnail.url,
|
||||||
runtime: main.primaryVideos.edges[0].node.runtime.value,
|
runtime: trailer.node.runtime.value,
|
||||||
caption: main.primaryVideos.edges[0].node.description?.value ?? null,
|
caption: trailer.node.description?.value ?? null,
|
||||||
urls: main.primaryVideos.edges[0].node.playbackURLs.map(url => ({
|
urls: trailer.node.playbackURLs.map(url => ({
|
||||||
resolution: url.displayName.value,
|
resolution: url.displayName.value as 'SD' | '480p',
|
||||||
mimeType: url.mimeType ?? null,
|
mimeType: url.videoMimeType ?? null,
|
||||||
url: url.url,
|
url: url.url,
|
||||||
})),
|
})),
|
||||||
},
|
})),
|
||||||
}),
|
}),
|
||||||
images: {
|
images: {
|
||||||
total: misc.titleMainImages.total,
|
total: misc.titleMainImages.total,
|
||||||
@@ -122,6 +127,9 @@ const cleanTitle = (rawData: RawTitle) => {
|
|||||||
}),
|
}),
|
||||||
topRating: misc.ratingsSummary.topRanking?.rank || null,
|
topRating: misc.ratingsSummary.topRanking?.rank || null,
|
||||||
},
|
},
|
||||||
|
watchlist: {
|
||||||
|
text: main.engagementStatistics?.watchlistStatistics.displayableCount.text || null,
|
||||||
|
},
|
||||||
meta: {
|
meta: {
|
||||||
// for tv episode
|
// for tv episode
|
||||||
...(main.series && {
|
...(main.series && {
|
||||||
@@ -208,25 +216,35 @@ const cleanTitle = (rawData: RawTitle) => {
|
|||||||
metacriticScore: main.metacritic?.metascore.score || null,
|
metacriticScore: main.metacritic?.metascore.score || null,
|
||||||
numCriticReviews: main.criticReviewsTotal.total,
|
numCriticReviews: main.criticReviewsTotal.total,
|
||||||
numUserReviews: misc.reviews.total,
|
numUserReviews: misc.reviews.total,
|
||||||
...(misc.featuredReviews.edges.length && {
|
ratingsDistribution:
|
||||||
featuredReview: {
|
misc.aggregateRatingsBreakdown.histogram?.histogramValues.map(v => ({
|
||||||
id: misc.featuredReviews.edges[0].node.id,
|
rating: v.rating,
|
||||||
reviewer: {
|
votes: v.voteCount,
|
||||||
id: misc.featuredReviews.edges[0].node.author.userId,
|
})) || [],
|
||||||
name: misc.featuredReviews.edges[0].node.author.nickName,
|
...(misc.reviewSummary && {
|
||||||
},
|
ai: {
|
||||||
rating: misc.featuredReviews.edges[0].node.authorRating,
|
summary: misc.reviewSummary.overall.medium.value.plaidHtml,
|
||||||
date: formatDate(misc.featuredReviews.edges[0].node.submissionDate),
|
themes: misc.reviewSummary.themes.map(t => ({
|
||||||
votes: {
|
text: t.label.value,
|
||||||
up: misc.featuredReviews.edges[0].node.helpfulness.upVotes,
|
id: t.themeId,
|
||||||
down: misc.featuredReviews.edges[0].node.helpfulness.downVotes,
|
sentiment: t.sentiment as 'POSITIVE' | 'NEGATIVE',
|
||||||
},
|
})),
|
||||||
review: {
|
|
||||||
summary: misc.featuredReviews.edges[0].node.summary.originalText,
|
|
||||||
html: misc.featuredReviews.edges[0].node.text.originalText.plaidHtml,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
|
...(misc.featuredReviews.edges.length && {
|
||||||
|
featuredReviews: misc.featuredReviews.edges.map(featuredReview => ({
|
||||||
|
id: featuredReview.node.id,
|
||||||
|
reviewer: {
|
||||||
|
id: featuredReview.node.author.userId,
|
||||||
|
name: featuredReview.node.author.username.text,
|
||||||
|
},
|
||||||
|
rating: featuredReview.node.authorRating,
|
||||||
|
review: {
|
||||||
|
summary: featuredReview.node.summary.originalText,
|
||||||
|
html: featuredReview.node.text.originalText.plaidHtml,
|
||||||
|
},
|
||||||
|
})),
|
||||||
|
}),
|
||||||
},
|
},
|
||||||
details: {
|
details: {
|
||||||
...(misc.releaseDate && {
|
...(misc.releaseDate && {
|
||||||
@@ -242,8 +260,8 @@ const cleanTitle = (rawData: RawTitle) => {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
...(misc.countriesOfOrigin && {
|
...(misc.countriesDetails && {
|
||||||
countriesOfOrigin: misc.countriesOfOrigin.countries.map(country => ({
|
countriesOfOrigin: misc.countriesDetails.countries.map(country => ({
|
||||||
id: country.id,
|
id: country.id,
|
||||||
text: country.text,
|
text: country.text,
|
||||||
})),
|
})),
|
||||||
@@ -353,6 +371,10 @@ const cleanTitle = (rawData: RawTitle) => {
|
|||||||
},
|
},
|
||||||
genres: title.node.titleGenres?.genres.map(genre => genre.genre.text) ?? null,
|
genres: title.node.titleGenres?.genres.map(genre => genre.genre.text) ?? null,
|
||||||
})),
|
})),
|
||||||
|
faqs: {
|
||||||
|
questions: misc.faqs.edges.map(q => ({ question: q.node.question, id: q.node.id })),
|
||||||
|
total: misc.faqs.total,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
return cleanData;
|
return cleanData;
|
||||||
|
@@ -74,12 +74,33 @@ export const getProxiedIMDbImgUrl = (url: string) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const AppError = class extends Error {
|
export const AppError = class extends Error {
|
||||||
constructor(message: string, public statusCode: number, errorOptions?: unknown) {
|
constructor(message: string, public statusCode: number, cause?: unknown) {
|
||||||
const saneErrorOptions = getErrorOptions(errorOptions);
|
const _cause = cause ? AppError.toError(cause) : undefined;
|
||||||
super(message, saneErrorOptions);
|
super(message, { cause: _cause });
|
||||||
|
|
||||||
Error.captureStackTrace(this, AppError);
|
Error.captureStackTrace(this, AppError);
|
||||||
if (process.env.NODE_ENV === 'development') console.error(this);
|
}
|
||||||
|
|
||||||
|
static toError(err: unknown) {
|
||||||
|
if (err instanceof Error) return err;
|
||||||
|
return new Error(`Unexpected: ${JSON.stringify(err)}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
format() {
|
||||||
|
let str = '';
|
||||||
|
let cur: Error | null = this;
|
||||||
|
let depth = 0;
|
||||||
|
|
||||||
|
while (cur && depth <= 4) {
|
||||||
|
if (cur.stack) str += `${cur.stack}\n`;
|
||||||
|
else str += `${cur.name}: ${cur.message}\n`;
|
||||||
|
|
||||||
|
cur = cur.cause instanceof Error ? cur.cause : null;
|
||||||
|
if (cur) str += 'Caused by:\n';
|
||||||
|
depth++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return str.trimEnd();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -110,19 +131,6 @@ export const isLocalStorageAvailable = () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const getErrorOptions = (error: unknown): ErrorOptions | undefined => {
|
|
||||||
if (!error || typeof error !== 'object') return undefined;
|
|
||||||
|
|
||||||
let cause: unknown;
|
|
||||||
// @ts-expect-error it's not an error! just that project's ts version is old, which can't be upgraded
|
|
||||||
if ('cause' in error) cause = error.cause;
|
|
||||||
// @ts-expect-error it's not an error! just that project's ts version is old, which can't be upgraded
|
|
||||||
else if ('stack' in error) cause = error.stack;
|
|
||||||
|
|
||||||
// @ts-expect-error it's not an error! just that project's ts version is old, which can't be upgraded
|
|
||||||
return { cause };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getErrorProperties = (
|
export const getErrorProperties = (
|
||||||
error: unknown,
|
error: unknown,
|
||||||
message = 'Something went very wrong',
|
message = 'Something went very wrong',
|
||||||
@@ -130,4 +138,4 @@ export const getErrorProperties = (
|
|||||||
) => {
|
) => {
|
||||||
if (error instanceof AppError) return error;
|
if (error instanceof AppError) return error;
|
||||||
return new AppError(message, statusCode, error);
|
return new AppError(message, statusCode, error);
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user