14 Commits

Author SHA1 Message Date
9cef749bd2 chore(deps): update dependency typescript to v4.9.5 2025-01-20 03:02:48 +00:00
ngn
0f88c28794 Merge pull request 'fix(deps): update dependency ioredis to v5.4.2' (#8) from renovate/ioredis-5.x-lockfile into custom
Some checks failed
Build and publish the docker image / build (push) Failing after 42s
Reviewed-on: #8
2025-01-20 03:00:03 +00:00
ngn
df4bfa2942 Merge branch 'custom' into renovate/ioredis-5.x-lockfile 2025-01-20 02:59:55 +00:00
ngn
3f99f93f5d Merge pull request 'fix(deps): update dependency axios to ^0.29.0' (#7) from renovate/axios-0.x into custom
Some checks are pending
Build and publish the docker image / build (push) Waiting to run
Reviewed-on: #7
2025-01-20 02:59:43 +00:00
ngn
131ea607ef Merge branch 'custom' into renovate/axios-0.x 2025-01-20 02:59:34 +00:00
ngn
ea6601bf49 Merge pull request 'chore(deps): update dependency @types/node to v18.19.71' (#3) from renovate/node-18.x into custom
Some checks are pending
Build and publish the docker image / build (push) Waiting to run
Reviewed-on: #3
2025-01-20 02:59:20 +00:00
ngn
663746b453 Merge branch 'custom' into renovate/node-18.x 2025-01-20 02:59:11 +00:00
ngn
35791cfc4d Merge pull request 'fix(deps): update dependency sharp to v0.33.5' (#2) from renovate/sharp-0.x-lockfile into custom
Some checks are pending
Build and publish the docker image / build (push) Waiting to run
Reviewed-on: #2
2025-01-20 02:59:05 +00:00
d54a92af3d fix(deps): update dependency ioredis to v5.4.2 2025-01-20 02:01:22 +00:00
7d009e7d4e fix(deps): update dependency axios to ^0.29.0 2025-01-20 02:01:16 +00:00
f061ab2ec5 chore(deps): update dependency @types/node to v18.19.71 2025-01-20 02:00:53 +00:00
497f61bac4 fix(deps): update dependency sharp to v0.33.5 2025-01-20 02:00:47 +00:00
ngn
70440fc389 Merge pull request 'fix(deps): update dependency cheerio to v1.0.0' (#1) from renovate/cheerio-1.x into custom
Some checks failed
Build and publish the docker image / build (push) Failing after 37s
Reviewed-on: #1
2025-01-20 01:34:49 +00:00
536abc4ecb fix(deps): update dependency cheerio to v1.0.0 2025-01-20 01:00:46 +00:00
30 changed files with 1129 additions and 1553 deletions

View File

@@ -1,34 +1,28 @@
name: docker name: Build and publish the docker image
on: on:
push: push:
branches: branches: ["custom"]
- "main"
paths-ignore:
- "README.md"
- "LICENSE.txt"
- "docker-compose.example.yml"
- "ups.json"
env: env:
REGISTRY: git.ngn.tf REGISTRY: git.ngn.tf
IMAGE: ${{gitea.repository}} IMAGE: ${{gitea.repository}}
jobs: jobs:
docker: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: "https://github.com/actions/checkout@v4"
- name: Login to container repo - name: Login to container repo
uses: docker/login-action@v1 uses: "https://github.com/docker/login-action@v1"
with: with:
registry: ${{env.REGISTRY}} registry: ${{env.REGISTRY}}
username: ${{gitea.actor}} username: ${{gitea.actor}}
password: ${{secrets.PACKAGES_TOKEN}} password: ${{secrets.PACKAGES_TOKEN}}
- name: Build docker image - name: Build image
run: | run: |
docker build . --tag ${{env.REGISTRY}}/${{env.IMAGE}}:latest docker build . --tag ${{env.REGISTRY}}/${{env.IMAGE}}:latest
docker push ${{env.REGISTRY}}/${{env.IMAGE}}:latest docker push ${{env.REGISTRY}}/${{env.IMAGE}}:latest

View File

@@ -1,25 +0,0 @@
name: ups
on:
schedule:
- cron: "@weekly"
jobs:
ups:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt update -y
sudo apt install -y python3 python3-build python3-requests make
- name: Install ups
run: |
git clone https://git.ngn.tf/ngn/ups && cd ups
make && make install
- name: Run ups
run: PATH=~/.local/bin:$PATH ups-check

View File

@@ -1,12 +1,20 @@
FROM node:lts-alpine AS deps
WORKDIR /app
COPY package.json pnpm-lock.yaml ./
RUN npm install -g pnpm
RUN pnpm install --frozen-lockfile
FROM node:lts-alpine AS builder FROM node:lts-alpine AS builder
WORKDIR /app WORKDIR /app
COPY . . COPY . .
COPY --from=deps /app/node_modules ./node_modules
ENV NODE_ENV=production ENV NODE_ENV=production
RUN npm install -g pnpm RUN npm install -g pnpm
RUN pnpm install
RUN pnpm build RUN pnpm build
FROM node:lts-alpine AS runner FROM node:lts-alpine AS runner

View File

@@ -1,7 +1,5 @@
# libremdb - IMDb frontend # [ngn.tf] | libremdb
![](https://git.ngn.tf/ngn/libremdb/actions/workflows/docker.yml/badge.svg) ![](https://git.ngn.tf/ngn/libremdb/actions/workflows/build.yml/badge.svg)
![](https://git.ngn.tf/ngn/libremdb/actions/workflows/ups.yml/badge.svg)
A fork of the [libremdb](https://github.com/zyachel/libremdb) project, with my A fork of the [libremdb](https://github.com/zyachel/libremdb) project, with my personal changes.
personal changes.

View File

@@ -3,16 +3,16 @@ services:
container_name: libremdb container_name: libremdb
image: git.ngn.tf/ngn/libremdb image: git.ngn.tf/ngn/libremdb
ports: ports:
- 80:3000 - 80:3000
env_file: .env.example env_file: .env.example
depends_on: depends_on:
- libremdb_redis - libremdb_redis
tmpfs: tmpfs:
- /app/.next/cache/:size=10M,mode=0770,uid=65534,gid=65534,noexec,nosuid,nodev - /opt/app/.next/cache/:size=10M,mode=0770,uid=65534,gid=65534,noexec,nosuid,nodev
security_opt: security_opt:
- no-new-privileges:true - no-new-privileges:true
cap_drop: cap_drop:
- ALL - ALL
user: 65534:65534 # equivalent to the nobody user user: 65534:65534 # equivalent to the nobody user
read_only: true read_only: true
restart: unless-stopped restart: unless-stopped
@@ -22,10 +22,10 @@ services:
image: redis image: redis
user: nobody user: nobody
tmpfs: tmpfs:
- /data:size=10M,mode=0770,uid=65534,gid=65534,noexec,nosuid,nodev - /data:size=10M,mode=0770,uid=65534,gid=65534,noexec,nosuid,nodev
security_opt: security_opt:
- no-new-privileges:true - no-new-privileges:true
cap_drop: cap_drop:
- ALL - ALL
read_only: true read_only: true
restart: unless-stopped restart: unless-stopped

View File

@@ -9,11 +9,6 @@ const nextConfig = {
destination: '/find', destination: '/find',
permanent: true, permanent: true,
}, },
{
source: '/:langcode(\\w{2})/:slug*',
destination: '/:slug*',
permanent: true,
},
]; ];
}, },
images: { images: {

View File

@@ -1,6 +1,6 @@
{ {
"name": "libremdb", "name": "libremdb",
"version": "4.2.0", "version": "4.1.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",
@@ -17,8 +17,8 @@
"lint": "next lint" "lint": "next lint"
}, },
"dependencies": { "dependencies": {
"axios": "^0.27.2", "axios": "^0.29.0",
"cheerio": "1.1.2", "cheerio": "1.0.0",
"ioredis": "^5.3.2", "ioredis": "^5.3.2",
"next": "12.2.5", "next": "12.2.5",
"react": "18.2.0", "react": "18.2.0",
@@ -26,13 +26,13 @@
"sharp": "^0.33.1" "sharp": "^0.33.1"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "18.7.3", "@types/node": "18.19.71",
"@types/react": "18.0.17", "@types/react": "18.0.17",
"@types/react-dom": "18.0.6", "@types/react-dom": "18.0.6",
"eslint": "8.22.0", "eslint": "8.22.0",
"eslint-config-next": "12.2.5", "eslint-config-next": "12.2.5",
"sass": "^1.62.1", "sass": "^1.62.1",
"typescript": "4.7.4" "typescript": "4.9.5"
}, },
"engines": { "engines": {
"node": " ^18.17.0 || ^20.3.0 || >=21.0.0", "node": " ^18.17.0 || ^20.3.0 || >=21.0.0",

466
pnpm-lock.yaml generated
View File

@@ -9,14 +9,14 @@ importers:
.: .:
dependencies: dependencies:
axios: axios:
specifier: ^0.27.2 specifier: ^0.29.0
version: 0.27.2 version: 0.29.0
cheerio: cheerio:
specifier: 1.1.2 specifier: 1.0.0
version: 1.1.2 version: 1.0.0
ioredis: ioredis:
specifier: ^5.3.2 specifier: ^5.3.2
version: 5.3.2 version: 5.4.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.62.1) version: 12.2.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.62.1)
@@ -28,11 +28,11 @@ importers:
version: 18.2.0(react@18.2.0) version: 18.2.0(react@18.2.0)
sharp: sharp:
specifier: ^0.33.1 specifier: ^0.33.1
version: 0.33.1 version: 0.33.5
devDependencies: devDependencies:
'@types/node': '@types/node':
specifier: 18.7.3 specifier: 18.19.71
version: 18.7.3 version: 18.19.71
'@types/react': '@types/react':
specifier: 18.0.17 specifier: 18.0.17
version: 18.0.17 version: 18.0.17
@@ -44,13 +44,13 @@ importers:
version: 8.22.0 version: 8.22.0
eslint-config-next: eslint-config-next:
specifier: 12.2.5 specifier: 12.2.5
version: 12.2.5(eslint@8.22.0)(typescript@4.7.4) version: 12.2.5(eslint@8.22.0)(typescript@4.9.5)
sass: sass:
specifier: ^1.62.1 specifier: ^1.62.1
version: 1.62.1 version: 1.62.1
typescript: typescript:
specifier: 4.7.4 specifier: 4.9.5
version: 4.7.4 version: 4.9.5
packages: packages:
@@ -58,8 +58,8 @@ packages:
resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@emnapi/runtime@0.44.0': '@emnapi/runtime@1.3.1':
resolution: {integrity: sha512-ZX/etZEZw8DR7zAB1eVQT40lNo0jeqpb6dCgOvctB6FIQ5PoXfMuNY8+ayQfu8tNQbAB8gQWSSJupR8NxeiZXw==} resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==}
'@eslint/eslintrc@1.4.1': '@eslint/eslintrc@1.4.1':
resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==}
@@ -77,116 +77,108 @@ packages:
resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
deprecated: Use @eslint/object-schema instead deprecated: Use @eslint/object-schema instead
'@img/sharp-darwin-arm64@0.33.1': '@img/sharp-darwin-arm64@0.33.5':
resolution: {integrity: sha512-esr2BZ1x0bo+wl7Gx2hjssYhjrhUsD88VQulI0FrG8/otRQUOxLWHMBd1Y1qo2Gfg2KUvXNpT0ASnV9BzJCexw==} resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==}
engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@img/sharp-darwin-x64@0.33.1': '@img/sharp-darwin-x64@0.33.5':
resolution: {integrity: sha512-YrnuB3bXuWdG+hJlXtq7C73lF8ampkhU3tMxg5Hh+E7ikxbUVOU9nlNtVTloDXz6pRHt2y2oKJq7DY/yt+UXYw==} resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==}
engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@img/sharp-libvips-darwin-arm64@1.0.0': '@img/sharp-libvips-darwin-arm64@1.0.4':
resolution: {integrity: sha512-VzYd6OwnUR81sInf3alj1wiokY50DjsHz5bvfnsFpxs5tqQxESoHtJO6xyksDs3RIkyhMWq2FufXo6GNSU9BMw==} resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==}
engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@img/sharp-libvips-darwin-x64@1.0.0': '@img/sharp-libvips-darwin-x64@1.0.4':
resolution: {integrity: sha512-dD9OznTlHD6aovRswaPNEy8dKtSAmNo4++tO7uuR4o5VxbVAOoEQ1uSmN4iFAdQneTHws1lkTZeiXPrcCkh6IA==} resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==}
engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@img/sharp-libvips-linux-arm64@1.0.0': '@img/sharp-libvips-linux-arm64@1.0.4':
resolution: {integrity: sha512-xTYThiqEZEZc0PRU90yVtM3KE7lw1bKdnDQ9kCTHWbqWyHOe4NpPOtMGy27YnN51q0J5dqRrvicfPbALIOeAZA==} resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==}
engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@img/sharp-libvips-linux-arm@1.0.0': '@img/sharp-libvips-linux-arm@1.0.5':
resolution: {integrity: sha512-VwgD2eEikDJUk09Mn9Dzi1OW2OJFRQK+XlBTkUNmAWPrtj8Ly0yq05DFgu1VCMx2/DqCGQVi5A1dM9hTmxf3uw==} resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==}
engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
'@img/sharp-libvips-linux-s390x@1.0.0': '@img/sharp-libvips-linux-s390x@1.0.4':
resolution: {integrity: sha512-o9E46WWBC6JsBlwU4QyU9578G77HBDT1NInd+aERfxeOPbk0qBZHgoDsQmA2v9TbqJRWzoBPx1aLOhprBMgPjw==} resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==}
engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
'@img/sharp-libvips-linux-x64@1.0.0': '@img/sharp-libvips-linux-x64@1.0.4':
resolution: {integrity: sha512-naldaJy4hSVhWBgEjfdBY85CAa4UO+W1nx6a1sWStHZ7EUfNiuBTTN2KUYT5dH1+p/xij1t2QSXfCiFJoC5S/Q==} resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==}
engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@img/sharp-libvips-linuxmusl-arm64@1.0.0': '@img/sharp-libvips-linuxmusl-arm64@1.0.4':
resolution: {integrity: sha512-OdorplCyvmSAPsoJLldtLh3nLxRrkAAAOHsGWGDYfN0kh730gifK+UZb3dWORRa6EusNqCTjfXV4GxvgJ/nPDQ==} resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==}
engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@img/sharp-libvips-linuxmusl-x64@1.0.0': '@img/sharp-libvips-linuxmusl-x64@1.0.4':
resolution: {integrity: sha512-FW8iK6rJrg+X2jKD0Ajhjv6y74lToIBEvkZhl42nZt563FfxkCYacrXZtd+q/sRQDypQLzY5WdLkVTbJoPyqNg==} resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==}
engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@img/sharp-linux-arm64@0.33.1': '@img/sharp-linux-arm64@0.33.5':
resolution: {integrity: sha512-59B5GRO2d5N3tIfeGHAbJps7cLpuWEQv/8ySd9109ohQ3kzyCACENkFVAnGPX00HwPTQcaBNF7HQYEfZyZUFfw==} resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==}
engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@img/sharp-linux-arm@0.33.1': '@img/sharp-linux-arm@0.33.5':
resolution: {integrity: sha512-Ii4X1vnzzI4j0+cucsrYA5ctrzU9ciXERfJR633S2r39CiD8npqH2GMj63uFZRCFt3E687IenAdbwIpQOJ5BNA==} resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==}
engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
'@img/sharp-linux-s390x@0.33.1': '@img/sharp-linux-s390x@0.33.5':
resolution: {integrity: sha512-tRGrb2pHnFUXpOAj84orYNxHADBDIr0J7rrjwQrTNMQMWA4zy3StKmMvwsI7u3dEZcgwuMMooIIGWEWOjnmG8A==} resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==}
engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
'@img/sharp-linux-x64@0.33.1': '@img/sharp-linux-x64@0.33.5':
resolution: {integrity: sha512-4y8osC0cAc1TRpy02yn5omBeloZZwS62fPZ0WUAYQiLhSFSpWJfY/gMrzKzLcHB9ulUV6ExFiu2elMaixKDbeg==} resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==}
engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@img/sharp-linuxmusl-arm64@0.33.1': '@img/sharp-linuxmusl-arm64@0.33.5':
resolution: {integrity: sha512-D3lV6clkqIKUizNS8K6pkuCKNGmWoKlBGh5p0sLO2jQERzbakhu4bVX1Gz+RS4vTZBprKlWaf+/Rdp3ni2jLfA==} resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==}
engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@img/sharp-linuxmusl-x64@0.33.1': '@img/sharp-linuxmusl-x64@0.33.5':
resolution: {integrity: sha512-LOGKNu5w8uu1evVqUAUKTix2sQu1XDRIYbsi5Q0c/SrXhvJ4QyOx+GaajxmOg5PZSsSnCYPSmhjHHsRBx06/wQ==} resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==}
engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@img/sharp-wasm32@0.33.1': '@img/sharp-wasm32@0.33.5':
resolution: {integrity: sha512-vWI/sA+0p+92DLkpAMb5T6I8dg4z2vzCUnp8yvxHlwBpzN8CIcO3xlSXrLltSvK6iMsVMNswAv+ub77rsf25lA==} resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [wasm32] cpu: [wasm32]
'@img/sharp-win32-ia32@0.33.1': '@img/sharp-win32-ia32@0.33.5':
resolution: {integrity: sha512-/xhYkylsKL05R+NXGJc9xr2Tuw6WIVl2lubFJaFYfW4/MQ4J+dgjIo/T4qjNRizrqs/szF/lC9a5+updmY9jaQ==} resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [ia32] cpu: [ia32]
os: [win32] os: [win32]
'@img/sharp-win32-x64@0.33.1': '@img/sharp-win32-x64@0.33.5':
resolution: {integrity: sha512-XaM69X0n6kTEsp9tVYYLhXdg7Qj32vYJlAKRutxUsm1UlgQNx6BOhHwZPwukCGXBU2+tH87ip2eV1I/E8MQnZg==} resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@@ -298,8 +290,8 @@ packages:
'@types/json5@0.0.29': '@types/json5@0.0.29':
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
'@types/node@18.7.3': '@types/node@18.19.71':
resolution: {integrity: sha512-LJgzOEwWuMTBxHzgBR/fhhBOWrvBjvO+zPteUgbbuQi80rYIZHrk1mNbRUqPZqSLP2H7Rwt1EFLL/tNLD1Xx/w==} resolution: {integrity: sha512-evXpcgtZm8FY4jqBSN8+DmOTcVkkvTmAayeo4Wf3m1xAruyVGzGuDh/Fb/WWX2yLItUiho42ozyJjB0dw//Tkw==}
'@types/prop-types@15.7.5': '@types/prop-types@15.7.5':
resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
@@ -411,8 +403,8 @@ packages:
resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==}
engines: {node: '>=4'} engines: {node: '>=4'}
axios@0.27.2: axios@0.29.0:
resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} resolution: {integrity: sha512-Kjsq1xisgO5DjjNQwZFsy0gpcU1P2j36dZeQDXVhpIU26GVgkDUnROaHLSuluhMqtDE7aKA2hbKXG5yu5DN8Tg==}
axobject-query@3.1.1: axobject-query@3.1.1:
resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==}
@@ -451,9 +443,9 @@ packages:
cheerio-select@2.1.0: cheerio-select@2.1.0:
resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==}
cheerio@1.1.2: cheerio@1.0.0:
resolution: {integrity: sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==} resolution: {integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==}
engines: {node: '>=20.18.1'} engines: {node: '>=18.17'}
chokidar@3.5.3: chokidar@3.5.3:
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
@@ -518,6 +510,15 @@ packages:
supports-color: supports-color:
optional: true optional: true
debug@4.4.0:
resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
engines: {node: '>=6.0'}
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
supports-color:
optional: true
deep-equal@2.2.0: deep-equal@2.2.0:
resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==} resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==}
@@ -536,8 +537,8 @@ 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@2.0.2: detect-libc@2.0.3:
resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
engines: {node: '>=8'} engines: {node: '>=8'}
dir-glob@3.0.1: dir-glob@3.0.1:
@@ -568,17 +569,13 @@ packages:
emoji-regex@9.2.2: emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
encoding-sniffer@0.2.1: encoding-sniffer@0.2.0:
resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==}
entities@4.5.0: entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'} engines: {node: '>=0.12'}
entities@6.0.1:
resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
engines: {node: '>=0.12'}
es-abstract@1.21.2: es-abstract@1.21.2:
resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@@ -748,8 +745,8 @@ packages:
flatted@3.2.7: flatted@3.2.7:
resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
follow-redirects@1.15.2: follow-redirects@1.15.9:
resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
engines: {node: '>=4.0'} engines: {node: '>=4.0'}
peerDependencies: peerDependencies:
debug: '*' debug: '*'
@@ -852,8 +849,8 @@ packages:
resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
engines: {node: '>= 0.4.0'} engines: {node: '>= 0.4.0'}
htmlparser2@10.0.0: htmlparser2@9.1.0:
resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==}
iconv-lite@0.6.3: iconv-lite@0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
@@ -885,8 +882,8 @@ packages:
resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
ioredis@5.3.2: ioredis@5.4.2:
resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} resolution: {integrity: sha512-0SZXGNGZ+WzISQ67QDyZ2x0+wVxjjUndtD8oSeik/4ajifeiRufed8fCb8QW8VMyi4MXcS+UO1k/0NGhvq1PAg==}
engines: {node: '>=12.22.0'} engines: {node: '>=12.22.0'}
is-arguments@1.1.1: is-arguments@1.1.1:
@@ -1029,10 +1026,6 @@ packages:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true hasBin: true
lru-cache@6.0.0:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'}
merge2@1.4.1: merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
@@ -1147,14 +1140,14 @@ packages:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'} engines: {node: '>=6'}
parse5-htmlparser2-tree-adapter@7.1.0: parse5-htmlparser2-tree-adapter@7.0.0:
resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==}
parse5-parser-stream@7.1.2: parse5-parser-stream@7.1.2:
resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==}
parse5@7.3.0: parse5@7.1.2:
resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
path-exists@4.0.0: path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
@@ -1193,6 +1186,9 @@ packages:
prop-types@15.8.1: prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
punycode@2.3.0: punycode@2.3.0:
resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
engines: {node: '>=6'} engines: {node: '>=6'}
@@ -1273,23 +1269,18 @@ packages:
scheduler@0.23.0: scheduler@0.23.0:
resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
semver@6.3.0: semver@6.3.1:
resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true hasBin: true
semver@7.5.0: semver@7.6.3:
resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==} resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
engines: {node: '>=10'} engines: {node: '>=10'}
hasBin: true hasBin: true
semver@7.5.4: sharp@0.33.5:
resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==}
engines: {node: '>=10'} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
hasBin: true
sharp@0.33.1:
resolution: {integrity: sha512-iAYUnOdTqqZDb3QjMneBKINTllCJDZ3em6WaWy7NPECM4aHncvqHRm0v0bN9nqJxMiwamv5KIdauJ6lUzKDpTQ==}
engines: {libvips: '>=8.15.0', node: ^18.17.0 || ^20.3.0 || >=21.0.0}
shebang-command@2.0.0: shebang-command@2.0.0:
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
@@ -1379,8 +1370,8 @@ packages:
tslib@1.14.1: tslib@1.14.1:
resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
tslib@2.5.0: tslib@2.8.1:
resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
tsutils@3.21.0: tsutils@3.21.0:
resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
@@ -1399,17 +1390,20 @@ packages:
typed-array-length@1.0.4: typed-array-length@1.0.4:
resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
typescript@4.7.4: typescript@4.9.5:
resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
engines: {node: '>=4.2.0'} engines: {node: '>=4.2.0'}
hasBin: true hasBin: true
unbox-primitive@1.0.2: unbox-primitive@1.0.2:
resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
undici@7.12.0: undici-types@5.26.5:
resolution: {integrity: sha512-GrKEsc3ughskmGA9jevVlIOPMiiAHJ4OFUtaAH+NhfTUSiZ1wMPIQqQvAJUrJspFXJt3EBWgpAeoHEDVT1IBug==} resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
engines: {node: '>=20.18.1'}
undici@6.21.1:
resolution: {integrity: sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==}
engines: {node: '>=18.17'}
uri-js@4.4.1: uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
@@ -1452,9 +1446,6 @@ packages:
wrappy@1.0.2: wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
yocto-queue@0.1.0: yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'} engines: {node: '>=10'}
@@ -1465,9 +1456,9 @@ snapshots:
dependencies: dependencies:
regenerator-runtime: 0.13.11 regenerator-runtime: 0.13.11
'@emnapi/runtime@0.44.0': '@emnapi/runtime@1.3.1':
dependencies: dependencies:
tslib: 2.5.0 tslib: 2.8.1
optional: true optional: true
'@eslint/eslintrc@1.4.1': '@eslint/eslintrc@1.4.1':
@@ -1496,79 +1487,79 @@ snapshots:
'@humanwhocodes/object-schema@1.2.1': {} '@humanwhocodes/object-schema@1.2.1': {}
'@img/sharp-darwin-arm64@0.33.1': '@img/sharp-darwin-arm64@0.33.5':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-darwin-arm64': 1.0.0 '@img/sharp-libvips-darwin-arm64': 1.0.4
optional: true optional: true
'@img/sharp-darwin-x64@0.33.1': '@img/sharp-darwin-x64@0.33.5':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-darwin-x64': 1.0.0 '@img/sharp-libvips-darwin-x64': 1.0.4
optional: true optional: true
'@img/sharp-libvips-darwin-arm64@1.0.0': '@img/sharp-libvips-darwin-arm64@1.0.4':
optional: true optional: true
'@img/sharp-libvips-darwin-x64@1.0.0': '@img/sharp-libvips-darwin-x64@1.0.4':
optional: true optional: true
'@img/sharp-libvips-linux-arm64@1.0.0': '@img/sharp-libvips-linux-arm64@1.0.4':
optional: true optional: true
'@img/sharp-libvips-linux-arm@1.0.0': '@img/sharp-libvips-linux-arm@1.0.5':
optional: true optional: true
'@img/sharp-libvips-linux-s390x@1.0.0': '@img/sharp-libvips-linux-s390x@1.0.4':
optional: true optional: true
'@img/sharp-libvips-linux-x64@1.0.0': '@img/sharp-libvips-linux-x64@1.0.4':
optional: true optional: true
'@img/sharp-libvips-linuxmusl-arm64@1.0.0': '@img/sharp-libvips-linuxmusl-arm64@1.0.4':
optional: true optional: true
'@img/sharp-libvips-linuxmusl-x64@1.0.0': '@img/sharp-libvips-linuxmusl-x64@1.0.4':
optional: true optional: true
'@img/sharp-linux-arm64@0.33.1': '@img/sharp-linux-arm64@0.33.5':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linux-arm64': 1.0.0 '@img/sharp-libvips-linux-arm64': 1.0.4
optional: true optional: true
'@img/sharp-linux-arm@0.33.1': '@img/sharp-linux-arm@0.33.5':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linux-arm': 1.0.0 '@img/sharp-libvips-linux-arm': 1.0.5
optional: true optional: true
'@img/sharp-linux-s390x@0.33.1': '@img/sharp-linux-s390x@0.33.5':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linux-s390x': 1.0.0 '@img/sharp-libvips-linux-s390x': 1.0.4
optional: true optional: true
'@img/sharp-linux-x64@0.33.1': '@img/sharp-linux-x64@0.33.5':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linux-x64': 1.0.0 '@img/sharp-libvips-linux-x64': 1.0.4
optional: true optional: true
'@img/sharp-linuxmusl-arm64@0.33.1': '@img/sharp-linuxmusl-arm64@0.33.5':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linuxmusl-arm64': 1.0.0 '@img/sharp-libvips-linuxmusl-arm64': 1.0.4
optional: true optional: true
'@img/sharp-linuxmusl-x64@0.33.1': '@img/sharp-linuxmusl-x64@0.33.5':
optionalDependencies: optionalDependencies:
'@img/sharp-libvips-linuxmusl-x64': 1.0.0 '@img/sharp-libvips-linuxmusl-x64': 1.0.4
optional: true optional: true
'@img/sharp-wasm32@0.33.1': '@img/sharp-wasm32@0.33.5':
dependencies: dependencies:
'@emnapi/runtime': 0.44.0 '@emnapi/runtime': 1.3.1
optional: true optional: true
'@img/sharp-win32-ia32@0.33.1': '@img/sharp-win32-ia32@0.33.5':
optional: true optional: true
'@img/sharp-win32-x64@0.33.1': '@img/sharp-win32-x64@0.33.5':
optional: true optional: true
'@ioredis/commands@1.2.0': {} '@ioredis/commands@1.2.0': {}
@@ -1634,11 +1625,13 @@ snapshots:
'@swc/helpers@0.4.3': '@swc/helpers@0.4.3':
dependencies: dependencies:
tslib: 2.5.0 tslib: 2.8.1
'@types/json5@0.0.29': {} '@types/json5@0.0.29': {}
'@types/node@18.7.3': {} '@types/node@18.19.71':
dependencies:
undici-types: 5.26.5
'@types/prop-types@15.7.5': {} '@types/prop-types@15.7.5': {}
@@ -1654,15 +1647,15 @@ snapshots:
'@types/scheduler@0.16.3': {} '@types/scheduler@0.16.3': {}
'@typescript-eslint/parser@5.59.1(eslint@8.22.0)(typescript@4.7.4)': '@typescript-eslint/parser@5.59.1(eslint@8.22.0)(typescript@4.9.5)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 5.59.1 '@typescript-eslint/scope-manager': 5.59.1
'@typescript-eslint/types': 5.59.1 '@typescript-eslint/types': 5.59.1
'@typescript-eslint/typescript-estree': 5.59.1(typescript@4.7.4) '@typescript-eslint/typescript-estree': 5.59.1(typescript@4.9.5)
debug: 4.3.4 debug: 4.4.0
eslint: 8.22.0 eslint: 8.22.0
optionalDependencies: optionalDependencies:
typescript: 4.7.4 typescript: 4.9.5
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -1673,17 +1666,17 @@ snapshots:
'@typescript-eslint/types@5.59.1': {} '@typescript-eslint/types@5.59.1': {}
'@typescript-eslint/typescript-estree@5.59.1(typescript@4.7.4)': '@typescript-eslint/typescript-estree@5.59.1(typescript@4.9.5)':
dependencies: dependencies:
'@typescript-eslint/types': 5.59.1 '@typescript-eslint/types': 5.59.1
'@typescript-eslint/visitor-keys': 5.59.1 '@typescript-eslint/visitor-keys': 5.59.1
debug: 4.3.4 debug: 4.4.0
globby: 11.1.0 globby: 11.1.0
is-glob: 4.0.3 is-glob: 4.0.3
semver: 7.5.0 semver: 7.6.3
tsutils: 3.21.0(typescript@4.7.4) tsutils: 3.21.0(typescript@4.9.5)
optionalDependencies: optionalDependencies:
typescript: 4.7.4 typescript: 4.9.5
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -1767,10 +1760,11 @@ snapshots:
axe-core@4.7.0: {} axe-core@4.7.0: {}
axios@0.27.2: axios@0.29.0:
dependencies: dependencies:
follow-redirects: 1.15.2 follow-redirects: 1.15.9
form-data: 4.0.0 form-data: 4.0.0
proxy-from-env: 1.1.0
transitivePeerDependencies: transitivePeerDependencies:
- debug - debug
@@ -1816,18 +1810,18 @@ snapshots:
domhandler: 5.0.3 domhandler: 5.0.3
domutils: 3.2.2 domutils: 3.2.2
cheerio@1.1.2: cheerio@1.0.0:
dependencies: dependencies:
cheerio-select: 2.1.0 cheerio-select: 2.1.0
dom-serializer: 2.0.0 dom-serializer: 2.0.0
domhandler: 5.0.3 domhandler: 5.0.3
domutils: 3.2.2 domutils: 3.2.2
encoding-sniffer: 0.2.1 encoding-sniffer: 0.2.0
htmlparser2: 10.0.0 htmlparser2: 9.1.0
parse5: 7.3.0 parse5: 7.1.2
parse5-htmlparser2-tree-adapter: 7.1.0 parse5-htmlparser2-tree-adapter: 7.0.0
parse5-parser-stream: 7.1.2 parse5-parser-stream: 7.1.2
undici: 7.12.0 undici: 6.21.1
whatwg-mimetype: 4.0.0 whatwg-mimetype: 4.0.0
chokidar@3.5.3: chokidar@3.5.3:
@@ -1894,6 +1888,10 @@ snapshots:
dependencies: dependencies:
ms: 2.1.2 ms: 2.1.2
debug@4.4.0:
dependencies:
ms: 2.1.3
deep-equal@2.2.0: deep-equal@2.2.0:
dependencies: dependencies:
call-bind: 1.0.2 call-bind: 1.0.2
@@ -1925,7 +1923,7 @@ snapshots:
denque@2.1.0: {} denque@2.1.0: {}
detect-libc@2.0.2: {} detect-libc@2.0.3: {}
dir-glob@3.0.1: dir-glob@3.0.1:
dependencies: dependencies:
@@ -1959,15 +1957,13 @@ snapshots:
emoji-regex@9.2.2: {} emoji-regex@9.2.2: {}
encoding-sniffer@0.2.1: encoding-sniffer@0.2.0:
dependencies: dependencies:
iconv-lite: 0.6.3 iconv-lite: 0.6.3
whatwg-encoding: 3.1.1 whatwg-encoding: 3.1.1
entities@4.5.0: {} entities@4.5.0: {}
entities@6.0.1: {}
es-abstract@1.21.2: es-abstract@1.21.2:
dependencies: dependencies:
array-buffer-byte-length: 1.0.0 array-buffer-byte-length: 1.0.0
@@ -2035,20 +2031,20 @@ snapshots:
escape-string-regexp@4.0.0: {} escape-string-regexp@4.0.0: {}
eslint-config-next@12.2.5(eslint@8.22.0)(typescript@4.7.4): eslint-config-next@12.2.5(eslint@8.22.0)(typescript@4.9.5):
dependencies: dependencies:
'@next/eslint-plugin-next': 12.2.5 '@next/eslint-plugin-next': 12.2.5
'@rushstack/eslint-patch': 1.2.0 '@rushstack/eslint-patch': 1.2.0
'@typescript-eslint/parser': 5.59.1(eslint@8.22.0)(typescript@4.7.4) '@typescript-eslint/parser': 5.59.1(eslint@8.22.0)(typescript@4.9.5)
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.9.5))(eslint-import-resolver-typescript@2.7.1)(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)
optionalDependencies: optionalDependencies:
typescript: 4.7.4 typescript: 4.9.5
transitivePeerDependencies: transitivePeerDependencies:
- eslint-import-resolver-webpack - eslint-import-resolver-webpack
- supports-color - supports-color
@@ -2063,9 +2059,9 @@ snapshots:
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):
dependencies: dependencies:
debug: 4.3.4 debug: 4.4.0
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.9.5))(eslint-import-resolver-typescript@2.7.1)(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
@@ -2073,18 +2069,18 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-module-utils@2.8.0(@typescript-eslint/parser@5.59.1(eslint@8.22.0)(typescript@4.7.4))(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@8.22.0): eslint-module-utils@2.8.0(@typescript-eslint/parser@5.59.1(eslint@8.22.0)(typescript@4.9.5))(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@8.22.0):
dependencies: dependencies:
debug: 3.2.7 debug: 3.2.7
optionalDependencies: optionalDependencies:
'@typescript-eslint/parser': 5.59.1(eslint@8.22.0)(typescript@4.7.4) '@typescript-eslint/parser': 5.59.1(eslint@8.22.0)(typescript@4.9.5)
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)
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.9.5))(eslint-import-resolver-typescript@2.7.1)(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
@@ -2093,17 +2089,17 @@ snapshots:
doctrine: 2.1.0 doctrine: 2.1.0
eslint: 8.22.0 eslint: 8.22.0
eslint-import-resolver-node: 0.3.7 eslint-import-resolver-node: 0.3.7
eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.1(eslint@8.22.0)(typescript@4.7.4))(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@8.22.0) eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.1(eslint@8.22.0)(typescript@4.9.5))(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@8.22.0)
has: 1.0.3 has: 1.0.3
is-core-module: 2.12.0 is-core-module: 2.12.0
is-glob: 4.0.3 is-glob: 4.0.3
minimatch: 3.1.2 minimatch: 3.1.2
object.values: 1.1.6 object.values: 1.1.6
resolve: 1.22.2 resolve: 1.22.2
semver: 6.3.0 semver: 6.3.1
tsconfig-paths: 3.14.2 tsconfig-paths: 3.14.2
optionalDependencies: optionalDependencies:
'@typescript-eslint/parser': 5.59.1(eslint@8.22.0)(typescript@4.7.4) '@typescript-eslint/parser': 5.59.1(eslint@8.22.0)(typescript@4.9.5)
transitivePeerDependencies: transitivePeerDependencies:
- eslint-import-resolver-typescript - eslint-import-resolver-typescript
- eslint-import-resolver-webpack - eslint-import-resolver-webpack
@@ -2127,7 +2123,7 @@ snapshots:
minimatch: 3.1.2 minimatch: 3.1.2
object.entries: 1.1.6 object.entries: 1.1.6
object.fromentries: 2.0.6 object.fromentries: 2.0.6
semver: 6.3.0 semver: 6.3.1
eslint-plugin-react-hooks@4.6.0(eslint@8.22.0): eslint-plugin-react-hooks@4.6.0(eslint@8.22.0):
dependencies: dependencies:
@@ -2149,7 +2145,7 @@ snapshots:
object.values: 1.1.6 object.values: 1.1.6
prop-types: 15.8.1 prop-types: 15.8.1
resolve: 2.0.0-next.4 resolve: 2.0.0-next.4
semver: 6.3.0 semver: 6.3.1
string.prototype.matchall: 4.0.8 string.prototype.matchall: 4.0.8
eslint-scope@7.2.0: eslint-scope@7.2.0:
@@ -2266,7 +2262,7 @@ snapshots:
flatted@3.2.7: {} flatted@3.2.7: {}
follow-redirects@1.15.2: {} follow-redirects@1.15.9: {}
for-each@0.3.3: for-each@0.3.3:
dependencies: dependencies:
@@ -2376,12 +2372,12 @@ snapshots:
dependencies: dependencies:
function-bind: 1.1.1 function-bind: 1.1.1
htmlparser2@10.0.0: htmlparser2@9.1.0:
dependencies: dependencies:
domelementtype: 2.3.0 domelementtype: 2.3.0
domhandler: 5.0.3 domhandler: 5.0.3
domutils: 3.2.2 domutils: 3.2.2
entities: 6.0.1 entities: 4.5.0
iconv-lite@0.6.3: iconv-lite@0.6.3:
dependencies: dependencies:
@@ -2411,11 +2407,11 @@ snapshots:
has: 1.0.3 has: 1.0.3
side-channel: 1.0.4 side-channel: 1.0.4
ioredis@5.3.2: ioredis@5.4.2:
dependencies: dependencies:
'@ioredis/commands': 1.2.0 '@ioredis/commands': 1.2.0
cluster-key-slot: 1.1.2 cluster-key-slot: 1.1.2
debug: 4.3.4 debug: 4.4.0
denque: 2.1.0 denque: 2.1.0
lodash.defaults: 4.2.0 lodash.defaults: 4.2.0
lodash.isarguments: 3.1.0 lodash.isarguments: 3.1.0
@@ -2563,10 +2559,6 @@ snapshots:
dependencies: dependencies:
js-tokens: 4.0.0 js-tokens: 4.0.0
lru-cache@6.0.0:
dependencies:
yallist: 4.0.0
merge2@1.4.1: {} merge2@1.4.1: {}
micromatch@4.0.5: micromatch@4.0.5:
@@ -2695,18 +2687,18 @@ snapshots:
dependencies: dependencies:
callsites: 3.1.0 callsites: 3.1.0
parse5-htmlparser2-tree-adapter@7.1.0: parse5-htmlparser2-tree-adapter@7.0.0:
dependencies: dependencies:
domhandler: 5.0.3 domhandler: 5.0.3
parse5: 7.3.0 parse5: 7.1.2
parse5-parser-stream@7.1.2: parse5-parser-stream@7.1.2:
dependencies: dependencies:
parse5: 7.3.0 parse5: 7.1.2
parse5@7.3.0: parse5@7.1.2:
dependencies: dependencies:
entities: 6.0.1 entities: 4.5.0
path-exists@4.0.0: {} path-exists@4.0.0: {}
@@ -2736,6 +2728,8 @@ snapshots:
object-assign: 4.1.1 object-assign: 4.1.1
react-is: 16.13.1 react-is: 16.13.1
proxy-from-env@1.1.0: {}
punycode@2.3.0: {} punycode@2.3.0: {}
queue-microtask@1.2.3: {} queue-microtask@1.2.3: {}
@@ -2814,41 +2808,35 @@ snapshots:
dependencies: dependencies:
loose-envify: 1.4.0 loose-envify: 1.4.0
semver@6.3.0: {} semver@6.3.1: {}
semver@7.5.0: semver@7.6.3: {}
dependencies:
lru-cache: 6.0.0
semver@7.5.4: sharp@0.33.5:
dependencies:
lru-cache: 6.0.0
sharp@0.33.1:
dependencies: dependencies:
color: 4.2.3 color: 4.2.3
detect-libc: 2.0.2 detect-libc: 2.0.3
semver: 7.5.4 semver: 7.6.3
optionalDependencies: optionalDependencies:
'@img/sharp-darwin-arm64': 0.33.1 '@img/sharp-darwin-arm64': 0.33.5
'@img/sharp-darwin-x64': 0.33.1 '@img/sharp-darwin-x64': 0.33.5
'@img/sharp-libvips-darwin-arm64': 1.0.0 '@img/sharp-libvips-darwin-arm64': 1.0.4
'@img/sharp-libvips-darwin-x64': 1.0.0 '@img/sharp-libvips-darwin-x64': 1.0.4
'@img/sharp-libvips-linux-arm': 1.0.0 '@img/sharp-libvips-linux-arm': 1.0.5
'@img/sharp-libvips-linux-arm64': 1.0.0 '@img/sharp-libvips-linux-arm64': 1.0.4
'@img/sharp-libvips-linux-s390x': 1.0.0 '@img/sharp-libvips-linux-s390x': 1.0.4
'@img/sharp-libvips-linux-x64': 1.0.0 '@img/sharp-libvips-linux-x64': 1.0.4
'@img/sharp-libvips-linuxmusl-arm64': 1.0.0 '@img/sharp-libvips-linuxmusl-arm64': 1.0.4
'@img/sharp-libvips-linuxmusl-x64': 1.0.0 '@img/sharp-libvips-linuxmusl-x64': 1.0.4
'@img/sharp-linux-arm': 0.33.1 '@img/sharp-linux-arm': 0.33.5
'@img/sharp-linux-arm64': 0.33.1 '@img/sharp-linux-arm64': 0.33.5
'@img/sharp-linux-s390x': 0.33.1 '@img/sharp-linux-s390x': 0.33.5
'@img/sharp-linux-x64': 0.33.1 '@img/sharp-linux-x64': 0.33.5
'@img/sharp-linuxmusl-arm64': 0.33.1 '@img/sharp-linuxmusl-arm64': 0.33.5
'@img/sharp-linuxmusl-x64': 0.33.1 '@img/sharp-linuxmusl-x64': 0.33.5
'@img/sharp-wasm32': 0.33.1 '@img/sharp-wasm32': 0.33.5
'@img/sharp-win32-ia32': 0.33.1 '@img/sharp-win32-ia32': 0.33.5
'@img/sharp-win32-x64': 0.33.1 '@img/sharp-win32-x64': 0.33.5
shebang-command@2.0.0: shebang-command@2.0.0:
dependencies: dependencies:
@@ -2938,12 +2926,12 @@ snapshots:
tslib@1.14.1: {} tslib@1.14.1: {}
tslib@2.5.0: {} tslib@2.8.1: {}
tsutils@3.21.0(typescript@4.7.4): tsutils@3.21.0(typescript@4.9.5):
dependencies: dependencies:
tslib: 1.14.1 tslib: 1.14.1
typescript: 4.7.4 typescript: 4.9.5
type-check@0.4.0: type-check@0.4.0:
dependencies: dependencies:
@@ -2957,7 +2945,7 @@ snapshots:
for-each: 0.3.3 for-each: 0.3.3
is-typed-array: 1.1.10 is-typed-array: 1.1.10
typescript@4.7.4: {} typescript@4.9.5: {}
unbox-primitive@1.0.2: unbox-primitive@1.0.2:
dependencies: dependencies:
@@ -2966,7 +2954,9 @@ snapshots:
has-symbols: 1.0.3 has-symbols: 1.0.3
which-boxed-primitive: 1.0.2 which-boxed-primitive: 1.0.2
undici@7.12.0: {} undici-types@5.26.5: {}
undici@6.21.1: {}
uri-js@4.4.1: uri-js@4.4.1:
dependencies: dependencies:
@@ -3016,6 +3006,4 @@ snapshots:
wrappy@1.0.2: {} wrappy@1.0.2: {}
yallist@4.0.0: {}
yocto-queue@0.1.0: {} yocto-queue@0.1.0: {}

View File

@@ -1,2 +0,0 @@
onlyBuiltDependencies:
- sharp

View File

@@ -1,7 +0,0 @@
<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>

View File

@@ -15,8 +15,6 @@
"purpose": "any maskable" "purpose": "any maskable"
} }
], ],
"start_url": "/",
"display": "minimal-ui",
"theme_color": "#b80040", "theme_color": "#b80040",
"background_color": "#ffe5ef" "background_color": "#ffe5ef"
} }

View File

@@ -11,7 +11,6 @@ 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;
@@ -20,9 +19,7 @@ type Props = {
}; };
}; };
const isDev = process.env.NODE_ENV === 'development'; const ErrorInfo = ({ message, statusCode, misc, originalPath }: Props) => {
const ErrorInfo = ({ message, statusCode, misc, originalPath, stack }: Props) => {
const title = statusCode ? `${message} (${statusCode})` : message; const title = statusCode ? `${message} (${statusCode})` : message;
return ( return (
<> <>
@@ -42,11 +39,6 @@ const ErrorInfo = ({ message, statusCode, misc, originalPath, stack }: 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>
@@ -72,13 +64,6 @@ const ErrorInfo = ({ message, statusCode, misc, originalPath, stack }: 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>
</> </>
); );

View File

@@ -14,41 +14,32 @@ 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.trailers?.length || !!media.videos.total) && ( {(media.trailer || !!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.trailers?.map(trailer => ( {media.trailer && (
<div className={styles.trailer} key={trailer.id}> <div className={styles.trailer}>
<video <video
aria-label={trailer.caption ?? 'trailer video'} aria-label='trailer video'
controls controls
playsInline playsInline
poster={getProxiedIMDbImgUrl(modifyIMDbImg(trailer.thumbnail))} poster={getProxiedIMDbImgUrl(modifyIMDbImg(media.trailer.thumbnail))}
className={styles.trailer__video} className={styles.trailer__video}
preload='none' preload='none'
muted
> >
{trailer.urls.map(source => ( {media.trailer.urls.map(source => (
<source <source
key={source.url} key={source.url}
type='video/mp4' type={source.mimeType ?? undefined}
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 => (

View File

@@ -36,13 +36,6 @@ 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>
); );
}; };

View File

@@ -9,54 +9,43 @@ 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>
{isEmpty(data) ? ( {!!data.trivia?.total && (
<p>Nothing interesting to show.</p> <section>
) : ( <h3 className='heading heading__tertiary'>Trivia</h3>
<> <div dangerouslySetInnerHTML={{ __html: data.trivia.html }}></div>
{!!data.trivia?.total && ( </section>
<section> )}
<h3 className='heading heading__tertiary'>Trivia</h3> {!!data.quotes?.total && (
<div dangerouslySetInnerHTML={{ __html: data.trivia.html }}></div> <section>
</section> <h3 className='heading heading__tertiary'>Quotes</h3>
)} <div dangerouslySetInnerHTML={{ __html: data.quotes.html }}></div>
{!!data.quotes?.total && ( </section>
<section> )}
<h3 className='heading heading__tertiary'>Quotes</h3> {!!data.trademark?.total && (
<div dangerouslySetInnerHTML={{ __html: data.quotes.html }}></div> <section>
</section> <h3 className='heading heading__tertiary'>Trademark</h3>
)} <div dangerouslySetInnerHTML={{ __html: data.trademark.html }}></div>
{!!data.trademark?.total && ( </section>
<section> )}
<h3 className='heading heading__tertiary'>Trademark</h3> {!!data.nicknames.length && (
<div dangerouslySetInnerHTML={{ __html: data.trademark.html }}></div> <section>
</section> <h3 className='heading heading__tertiary'>Nicknames</h3>
)} <p>{data.nicknames.join(', ')}</p>
{!!data.nicknames.length && ( </section>
<section> )}
<h3 className='heading heading__tertiary'>Nicknames</h3> {!!data.salary?.total && (
<p>{data.nicknames.join(', ')}</p> <section>
</section> <h3 className='heading heading__tertiary'>Salary</h3>
)} <p>
{!!data.salary?.total && ( <span>{data.salary.value} in </span>
<section> <Link href={`/title/${data.salary.title.id}`}>
<h3 className='heading heading__tertiary'>Salary</h3> <a className={'link'}>{data.salary.title.text}</a>
<p> </Link>
<span>{data.salary.value} in </span> <span> ({data.salary.title.year})</span>
<Link href={`/title/${data.salary.title.id}`}> </p>
<a className={'link'}>{data.salary.title.text}</a> </section>
</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
);

View File

@@ -86,21 +86,6 @@ 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>

View File

@@ -7,13 +7,7 @@ type Props = {
}; };
const DidYouKnow = ({ data }: Props) => { const DidYouKnow = ({ data }: Props) => {
if (!Object.keys(data).length) if (!Object.keys(data).length) return <></>;
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>

View File

@@ -1,127 +1,82 @@
import { useRouter } from 'next/router'; import { useRouter } from 'next/router';
import Link from 'next/link'; import Link from 'next/link';
import type { Reviews as TReviews } from 'src/interfaces/shared/title'; import { Reviews } 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: TReviews; reviews: Reviews;
}; };
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 (
<div className={styles.reviewStats}> <section className={styles.reviews}>
<p> <h2 className="heading heading__secondary">Reviews</h2>
<Link href={`/title/${titleId}/reviews`}>
<a className='link'>{formatNumber(reviews.numUserReviews)} User reviews</a> {reviews.featuredReview && (
</Link> <article className={styles.reviews__reviewContainer}>
</p> <details className={styles.review}>
<p> <summary className={styles.review__summary}>
<Link href={`/title/${titleId}/externalreviews`}> <strong>{reviews.featuredReview.review.summary}</strong>
<a className='link'>{formatNumber(reviews.numCriticReviews)} Critic reviews</a> </summary>
</Link> <div
</p> className={styles.review__text}
<p> dangerouslySetInnerHTML={{
<Link href={`/title/${titleId}/criticreviews`}> __html: reviews.featuredReview.review.html,
<a className='link'> {reviews.metacriticScore} Metascore</a> }}
</Link> ></div>
</p> </details>
</div> <footer className={styles.review__metadata}>
<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;

View File

@@ -143,7 +143,7 @@ export default interface Name {
value: string; value: string;
language: string; language: string;
}; };
videoMimeType?: string; mimeType?: string;
url: string; url: string;
}>; }>;
recommendedTimedTextTrack?: { recommendedTimedTextTrack?: {

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +1,3 @@
import { AppError as AppErrorClass } from 'src/utils/helpers'; import { AppError as AppErrorClass } from 'src/utils/helpers';
export type AppError = Pick<InstanceType<typeof AppErrorClass>, 'message' | 'statusCode' | 'stack'>; export type AppError = Omit<InstanceType<typeof AppErrorClass>, 'name'>;

View File

@@ -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 err = getErrorProperties(error); const { message, statusCode } = getErrorProperties(error);
ctx.res.statusCode = err.statusCode; ctx.res.statusCode = statusCode;
ctx.res.statusMessage = err.message; ctx.res.statusMessage = message;
return { return {
props: { props: {
error: { message: err.message, statusCode: err.statusCode, stack: err.format() }, error: { message, statusCode },
data: { title: query, results: null }, data: { title: query, results: null },
originalPath, originalPath,
}, },

View File

@@ -55,17 +55,11 @@ 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 err = getErrorProperties(error); const { message, statusCode } = getErrorProperties(error);
ctx.res.statusCode = err.statusCode; ctx.res.statusCode = statusCode;
ctx.res.statusMessage = err.message; ctx.res.statusMessage = message;
return { return { props: { error: { message, statusCode }, data: null, originalPath } };
props: {
error: { message: err.message, statusCode: err.statusCode, stack: err.format() },
data: null,
originalPath,
},
};
} }
}; };

View File

@@ -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 type { AppError } from 'src/interfaces/shared/error'; import { 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,18 +63,12 @@ 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 (e) { } catch (error) {
const err = getErrorProperties(e); const { message, statusCode } = getErrorProperties(error);
ctx.res.statusCode = err.statusCode; ctx.res.statusCode = statusCode;
ctx.res.statusMessage = err.message; ctx.res.statusMessage = message;
const error = { return { props: { error: { message, statusCode }, data: null, originalPath } };
message: err.message,
statusCode: err.statusCode,
stack: err.format(),
};
console.error(err);
return { props: { error, data: null, originalPath } };
} }
}; };

View File

@@ -8,7 +8,7 @@
display: grid; display: grid;
justify-content: center; justify-content: center;
justify-items: center; justify-items: center;
gap: var(--comp-whitespace); gap: var(--spacer-1);
@include helper.bp('bp-700') { @include helper.bp('bp-700') {
--doc-whitespace: var(--spacer-5); --doc-whitespace: var(--spacer-5);
@@ -31,19 +31,6 @@
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;

View File

@@ -1,94 +1,26 @@
.reviews { .reviews {
display: grid; display: grid;
gap: var(--comp-whitespace); gap: var(--comp-whitespace);
}
.ratingsDistribution { &__reviewContainer {
overflow: hidden; // background-color: antiquewhite;
}
ul { &__stats {
list-style: none;
display: flex; display: flex;
gap: var(--spacer-2);
overflow-x: auto;
padding-block: var(--spacer-1);
}
li {
text-align: center;
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-1); padding-top: var(--spacer-2);
} }
} }

View File

@@ -42,18 +42,18 @@ const cleanName = (rawData: RawName) => {
}, },
media: { media: {
...(main.primaryVideos.edges.length && { ...(main.primaryVideos.edges.length && {
trailers: main.primaryVideos.edges.map(trailer => ({ trailer: {
id: trailer.node.id, id: main.primaryVideos.edges[0].node.id,
isMature: trailer.node.isMature, isMature: main.primaryVideos.edges[0].node.isMature,
thumbnail: trailer.node.thumbnail.url, thumbnail: main.primaryVideos.edges[0].node.thumbnail.url,
runtime: trailer.node.runtime.value, runtime: main.primaryVideos.edges[0].node.runtime.value,
caption: trailer.node.description?.value ?? null, caption: main.primaryVideos.edges[0].node.description?.value ?? null,
urls: trailer.node.playbackURLs.map(url => ({ urls: main.primaryVideos.edges[0].node.playbackURLs.map(url => ({
resolution: url.displayName.value as 'SD' | '480p', resolution: url.displayName.value,
mimeType: url.videoMimeType ?? null, mimeType: url.mimeType ?? null,
url: url.url, url: url.url,
})), })),
})), },
}), }),
images: { images: {
total: misc.images.total, total: misc.images.total,

View File

@@ -12,7 +12,6 @@ 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() && {
@@ -51,10 +50,6 @@ 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 },
@@ -81,18 +76,18 @@ const cleanTitle = (rawData: RawTitle) => {
})), })),
media: { media: {
...(main.primaryVideos.edges.length && { ...(main.primaryVideos.edges.length && {
trailers: main.primaryVideos.edges.map(trailer => ({ trailer: {
id: trailer.node.id, id: main.primaryVideos.edges[0].node.id,
isMature: trailer.node.isMature, isMature: main.primaryVideos.edges[0].node.isMature,
thumbnail: trailer.node.thumbnail.url, thumbnail: main.primaryVideos.edges[0].node.thumbnail.url,
runtime: trailer.node.runtime.value, runtime: main.primaryVideos.edges[0].node.runtime.value,
caption: trailer.node.description?.value ?? null, caption: main.primaryVideos.edges[0].node.description?.value ?? null,
urls: trailer.node.playbackURLs.map(url => ({ urls: main.primaryVideos.edges[0].node.playbackURLs.map(url => ({
resolution: url.displayName.value as 'SD' | '480p', resolution: url.displayName.value,
mimeType: url.videoMimeType ?? null, mimeType: url.mimeType ?? null,
url: url.url, url: url.url,
})), })),
})), },
}), }),
images: { images: {
total: misc.titleMainImages.total, total: misc.titleMainImages.total,
@@ -127,9 +122,6 @@ 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 && {
@@ -216,34 +208,24 @@ 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,
ratingsDistribution:
misc.aggregateRatingsBreakdown.histogram?.histogramValues.map(v => ({
rating: v.rating,
votes: v.voteCount,
})) || [],
...(misc.reviewSummary && {
ai: {
summary: misc.reviewSummary.overall.medium.value.plaidHtml,
themes: misc.reviewSummary.themes.map(t => ({
text: t.label.value,
id: t.themeId,
sentiment: t.sentiment as 'POSITIVE' | 'NEGATIVE',
})),
},
}),
...(misc.featuredReviews.edges.length && { ...(misc.featuredReviews.edges.length && {
featuredReviews: misc.featuredReviews.edges.map(featuredReview => ({ featuredReview: {
id: featuredReview.node.id, id: misc.featuredReviews.edges[0].node.id,
reviewer: { reviewer: {
id: featuredReview.node.author.userId, id: misc.featuredReviews.edges[0].node.author.userId,
name: featuredReview.node.author.username.text, name: misc.featuredReviews.edges[0].node.author.nickName,
},
rating: misc.featuredReviews.edges[0].node.authorRating,
date: formatDate(misc.featuredReviews.edges[0].node.submissionDate),
votes: {
up: misc.featuredReviews.edges[0].node.helpfulness.upVotes,
down: misc.featuredReviews.edges[0].node.helpfulness.downVotes,
}, },
rating: featuredReview.node.authorRating,
review: { review: {
summary: featuredReview.node.summary.originalText, summary: misc.featuredReviews.edges[0].node.summary.originalText,
html: featuredReview.node.text.originalText.plaidHtml, html: misc.featuredReviews.edges[0].node.text.originalText.plaidHtml,
}, },
})), },
}), }),
}, },
details: { details: {
@@ -260,8 +242,8 @@ const cleanTitle = (rawData: RawTitle) => {
}, },
}, },
}), }),
...(misc.countriesDetails && { ...(misc.countriesOfOrigin && {
countriesOfOrigin: misc.countriesDetails.countries.map(country => ({ countriesOfOrigin: misc.countriesOfOrigin.countries.map(country => ({
id: country.id, id: country.id,
text: country.text, text: country.text,
})), })),
@@ -371,10 +353,6 @@ 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;

View File

@@ -74,33 +74,12 @@ export const getProxiedIMDbImgUrl = (url: string) => {
}; };
export const AppError = class extends Error { export const AppError = class extends Error {
constructor(message: string, public statusCode: number, cause?: unknown) { constructor(message: string, public statusCode: number, errorOptions?: unknown) {
const _cause = cause ? AppError.toError(cause) : undefined; const saneErrorOptions = getErrorOptions(errorOptions);
super(message, { cause: _cause }); super(message, saneErrorOptions);
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();
} }
}; };
@@ -131,6 +110,19 @@ 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',
@@ -138,4 +130,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);
}; };

View File

@@ -1,5 +0,0 @@
{
"upstream": "https://github.com/zyachel/libremdb",
"provider": "github",
"commit": "92e765cd3cf7482932619cc057e6c4fa62e7204e"
}